Autor Beitrag
Mitmischer 1703
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: 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:

ausblenden 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?

_________________
Die Lösung ist nicht siebzehn.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: 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:...

_________________
Die Lösung ist nicht siebzehn.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Sa 09.10.10 08:46 
hier :)

ausblenden 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...

_________________
Die Lösung ist nicht siebzehn.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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

_________________
"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