Autor Beitrag
belling
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 24.07.03 22:38 
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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Win XP
D6 Personal
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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.


Zuletzt bearbeitet von belling am Do 24.07.03 23:32, insgesamt 1-mal bearbeitet
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Do 24.07.03 23:19 
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:
ausblenden Delphi-Quelltext
1:
2:
var
  MyLCD: TLCD;

und diese muss bei Programmausführung erzeugt werden (am betsen im OnCreate):
ausblenden 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:
ausblenden Delphi-Quelltext
1:
MyLCD.Free					


Wenn ich nix übersehen hab', sollte's so gehen ;-)

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
belling Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 24.07.03 23:34 
Vielen Dank für die späte Hilfe. :D Werds gleich mal probieren.

ausblenden Delphi-Quelltext
1:
MyLCD := TLCD.Create;					


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


Zuletzt bearbeitet von belling am Do 24.07.03 23:46, insgesamt 1-mal bearbeitet
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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:

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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:
ausblenden 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:

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
belling Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 25.07.03 00:15 
ausblenden 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.