Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - public-Deklarationen // undefinierter Bezeichner
belling - Do 24.07.03 22:38
Titel: public-Deklarationen // undefinierter Bezeichner
Ich habe hier zwei Units. In der einen stehen Funktionen (lcd.pas) und in der anderen steht das eigentliche Programm (lcd001.pas). Um die beiden Units zu verknüpfen habe ich "uses lcd" und "uses lcd001" in die jeweils andere Datei geschrieben. Wenn ich nun eine Funktion in aus der lcd.pas in der lcd001.pas aufrufe, kommt die Fehlermeldung "undefinierter Bezeichner".
Hier ein Auszug aus der lcd.pas:
Delphi-Quelltext
1: 2: 3: 4: 5:
| type TLCD = Class public procedure displaytext(row:Integer; col:Integer; this:String); end; |
Und hier ein Auszug aus der lcd001.pas:
Delphi-Quelltext
1: 2: 3:
| type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); |
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.FormCreate(Sender: TObject); begin displaytext(1,1,'test'); end; |
Ich vermute, dass es daran liegt, dass das eine zu TLCD und das andere zu TForm1 gehört. Wie löse ich das? Ich kann ja nicht beide gleich nennen.
Wenn es daran nicht liegen sollte, was muss ich noch beachten?
Wie man merkt, bin ich noch recht neu. Das ist erst mein zweites Programm (das erste läuft wunderbar). Nehmt es mir nicht übel. :wink:
Taurin - Do 24.07.03 22:49
Es gibt zwei Möglichkeiten, uses-Klauseln zu verwenden: Im interface- und im implementation-Teil. Zwei Units dürfen sich nicht gegenseitig im interface-Teil einbinden. Du musst (mind.) eine Uses-Klausel aus in den implementation-Teil schieben
belling - Do 24.07.03 22:53
Ich hab die uses-Klausel im implementation-Teil verwendet. Es ändert leider auch nichts an meinem Problem wenn ich sie nur in der lcd001.pas oder nur in der lcd.pas verwende. :?
EDIT: Achso, die uses-Klausel im interface-Teil bringt auch nichts. Auch nicht in Verbindung mit der im implementation-Teil.
tommie-lie - Do 24.07.03 23:19
Titel: Re: public-Deklarationen // undefinierter Bezeichner
| belling hat folgendes geschrieben: |
Ich vermute, dass es daran liegt, dass das eine zu TLCD und das andere zu TForm1 gehört. Wie löse ich das? Ich kann ja nicht beide gleich nennen.
Wenn es daran nicht liegen sollte, was muss ich noch beachten? |
Genau daran liegt es auch.
Eine Klasse muss man mit seinem constructor erst instanziieren, bevor man sie benutzen kann. Da TLCD eine Klasse ist, muss du das auch tun.
Dazu brauchst du eine Variable vom Typ TLCD:
und diese muss bei Programmausführung erzeugt werden (am betsen im OnCreate):
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.FormCreate(Sender: TObject); begin MyLCD := TLCD.Create; MyLCD.displaytext(1,1,'test'); end; |
Wie du siehst habe ich vor displaytext auch ein MyLCD geschrieben. Das sagt dem compiler, daß die Methode displaytext in der Variable MyLCD zu finden ist, die vom Typ TLCD ist, was wiederum die Klasse ist, die die Methode implementiert.
Eine Klasse, die einmal erzeugt wurde, muss auch wieder freigegeben/zerstört werden.
Dazu am besten ins OnDestroy:
Wenn ich nix übersehen hab', sollte's so gehen ;-)
belling - Do 24.07.03 23:34
Vielen Dank für die späte Hilfe. :D Werds gleich mal probieren.
[Fehler] lcd001.pas(30): Nicht genügend wirkliche Parameter
Er will noch einen Integer haben. Hab spaßenshalber mal Create(1) probiert. Er hat dann zwar compiliert, aber das Programm würgte eine Fehlermeldung hoch.
Weißt du zufällig was da rein muss?
tommie-lie - Do 24.07.03 23:44
| belling hat folgendes geschrieben: |
| Vielen Dank für die späte Hilfe. :D |
Spät?
Für den Programmierer hat der Tag eben erst begonnen :mrgreen:
tommie-lie - Fr 25.07.03 00:05
| belling hat folgendes geschrieben: |
| Er will noch einen Integer haben. |
Hm...
TLCD ist doch eine Klasse ohne Ancestor...
Also folgendes klappt bei mir einwandfrei:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| TBlah = class public FHello: String; end;
var Blah: TBlah;
procedure TForm1.FormCreate(Sender: TObject); begin Blah := TBlah.Create; end; |
Also eine Klasse ohne Vorfahren (nichts in Klammern hinter dem class) und dann einfach nur Create, er will keinen Integer mehr haben...
Du hast nicht zufällig einen eigenen Constructor ür die Klasse deklariert?
Und wenn du hinter dem Create die Klammer aufmachst, erscheint ja der Hint mit den Parametern, da steht auch der Name der Integervariable, für die der PArameter gedacht ist. Was denkt er denn, was er da erwarten würde? Doch wohl hoffentlich kein Owner :roll:
belling - Fr 25.07.03 00:15
Delphi-Quelltext
1: 2: 3: 4:
| type TLCD = Class constructor Create(Port:integer); destructor Destroy; |
Damn.
Im Hint steht Create(Port: Integer).
Oh, Mann. Ich hätte nicht gedacht, dass ich beim Aufrufen einer Prozedur so viel falsch machen kann.
EDIT: Mein Gott bin ich dumm. Port.. alles klar. Danke für eure Hilfe. :wink:
Ja, das Programm läuft. Vielen Dank nochmal.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!