Autor |
Beitrag |
Mitmischer 1703
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Sa 09.10.10 08:21
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 public |
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?
_________________ Die Lösung ist nicht siebzehn.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 09.10.10 08:39
|
|
Mitmischer 1703 
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: 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  ...
_________________ Die Lösung ist nicht siebzehn.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: 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; public 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...
_________________ Die Lösung ist nicht siebzehn.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 09.10.10 13:59
jaenicke hat folgendes geschrieben : | Mitmischer 1703 hat folgendes geschrieben : | 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
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Für diesen Beitrag haben gedankt: jaenicke
|
|
|