Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Hinzufügen von Komponenten zu einer Form


Mitmischer 1703 - Sa 09.10.10 08:21
Titel: Hinzufügen von Komponenten zu einer Form
Hi DF :)!

Seit letzter Stunde erschien beim Starten eines meiner Programme die Fehlermeldung "Klasse nicht gefunden", nachdem ich eine neue Komponente aufs Formular gezogen habe. Den Grund habe ich dann gefunden - die neue Komponente wurde im Public-Bereich deklariert und nicht direkt unter der Klassendeklaration, also:


Delphi-Quelltext
1:
2:
3:
4:
Form = TForm
// nicht hier!
public
// sondern hier!


Ich habe die Komponentendeklaration dann nach oben gezogen und voilà - funktioniert. Nun frage ich mich aber:

1. Warum fügt Delphi alle neuen Komponenten in den Public-Bereich ein? Kann man das abstellen?

2. Warum wird die Fehlermedlung geworfen, wenn die Komponente im Public-Bereich deklariert wird?


jaenicke - Sa 09.10.10 08:39

user profile iconMitmischer 1703 hat folgendes geschrieben Zum zitierten Posting springen:
1. Warum fügt Delphi alle neuen Komponenten in den Public-Bereich ein? Kann man das abstellen?
Das ist ein Fehler. Das ist bei mir noch nie passiert. Vielleicht hast du selber in die Standardsichtbarkeit oben irgendetwas geschrieben oder so, so dass Delphi durcheinander kommt. :nixweiss:

user profile iconMitmischer 1703 hat folgendes geschrieben Zum zitierten Posting springen:
2. Warum wird die Fehlermedlung geworfen, wenn die Komponente im Public-Bereich deklariert wird?
Weil dort nur selbst deklarierte Sachen rein gehören, genauso wie Komponenten nur in die Standardsichtbarkeit gehören. Nur dann wird glaube ich der entsprechende Code eingebunden, der für die Verknüpfung der Klasse mit der Information aus der Formulardefinitionsdatei (.dfm) notwendig ist.


Mitmischer 1703 - Sa 09.10.10 08:42

Hmm... Merkwürdig.

Und warum darf ich den Public-Bereich eigentlich nicht löschen :(?

Dann sagt er mir, dass das Feld MainForm keine entsprechende Komponente hätte :shock:...


jaenicke - Sa 09.10.10 08:44

Dann stimmt in dem Projekt etwas nicht. Ohne den Quelltext kann ich aber nicht so direkt sagen was. Das kann am Quelltext selbst liegen, aber auch an dem in der Formulardefinitionsdatei.

Ein Beispiel sind seltsame Bezeichnungen von Komponenten oder Variablen oder Typen (die in Konflikt mit delphieigenen stehen).


Mitmischer 1703 - Sa 09.10.10 08:46

hier :)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
type
  TMainForm = class(TForm)
    CB_Bidirectional: TCheckBox;
    Panel1: TPanel;
    Panel2: TPanel;
    BitBtn1: TBitBtn;
    LB_To: TListBox;
    LB_From: TListBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    LblTo: TLabel;
    LblFrom: TLabel;
    LblCosts: TLabel;
    procedure LB_Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    FLookupTable : array of array of Single;
    FFrom : String;
    FTo : String;
    procedure FillLookupTable(Size : Cardinal);
    procedure RefreshGUI;
    function CalculatePrice(From, &To : Cardinal) : Single;
    { Private-Deklarationen }
   public
    { Public-Deklarationen }
  end;


ah, hab's! Der Ampersand scheint doch nicht ganz so zu funktionieren, wie gewünscht... der zweiter Parameter bei CalculatePrice darf nicht so heißen wie ein Schlüsselwort, auch nicht mit einem Ampersand davor...


jaenicke - Sa 09.10.10 08:48

Du hast da ein kaufmännisches Und vor dem To, das geht nicht. ;-)

// EDIT:
Ja, genau.

Nebenbei:
Ich setze da in der Regel ein großes A vor Parameter. So wird es oft gemacht, genau wie das F bei privaten Feldern.


Martok - Sa 09.10.10 13:59

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMitmischer 1703 hat folgendes geschrieben Zum zitierten Posting springen:
2. Warum wird die Fehlermedlung geworfen, wenn die Komponente im Public-Bereich deklariert wird?
Weil dort nur selbst deklarierte Sachen rein gehören, genauso wie Komponenten nur in die Standardsichtbarkeit gehören. Nur dann wird glaube ich der entsprechende Code eingebunden, der für die Verknüpfung der Klasse mit der Information aus der Formulardefinitionsdatei (.dfm) notwendig ist.

Und falls das noch jemand genauer wissen will:
"nichts" in einer class wirkt wie published - und nur damit wird die Art RTTI generiert, die zum Laden benötigt wird: nicht für public, und schon gar nicht für private