Prozedure kein Zugriff auf TMemo
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Prozedure kein Zugriff auf TMemo
Hallo
Bin gerade mit einer Prozeduren am üben, egal wohin ich sie platziere,
erhalte ich immer die Fehlermeldung 'Identifier not found'
Ist bestimmt ein enfaches Problem. Kann aber trotzdem keine Lösung finden.
Hat irgendwas mit 'class' zu tun aber was?
Bin gerade mit einer Prozeduren am üben, egal wohin ich sie platziere,
erhalte ich immer die Fehlermeldung 'Identifier not found'
Ist bestimmt ein enfaches Problem. Kann aber trotzdem keine Lösung finden.
Hat irgendwas mit 'class' zu tun aber was?
- Dateianhänge
-
upload.zip
- (2.24 KiB) 67-mal heruntergeladen
Good code comes from experience, experience comes from bad code.
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Prozedure kein Zugriff auf TMemo
Habe wirklich lange gesucht, und kaum die Frage gestellt, die Lösung doch noch gefunden.
Muss ein 'Form1.Memo1...' statt ein 'TForm1.Memo1...' voranstellen. Jetzt läufts.
Muss ein 'Form1.Memo1...' statt ein 'TForm1.Memo1...' voranstellen. Jetzt läufts.
Good code comes from experience, experience comes from bad code.
Re: Prozedure kein Zugriff auf TMemo
Ich nehme an, du hast erst kurz mit Pascal/Lazarus angefangen, und da solltest du dir nicht gleich solche Fehler angewöhnen. Auch wenn's funktioniert.
Du hast in deinem Programm eine Klasse namens TForm1. Alle Formulare, die aus dieser Klasse erzeugt werden, beherbergen zwei Buttons, eine Checkbox und ein Memo und verhalten sich beim Klick auf Button2 so, dassl dem Memo ein bestimmter Text hinzugefügt wird. Du möchtest nun mit Hilfe der Prozedur TextOut nochmals Text anfügen (warum du das nicht gleich in der ButtonClick-Methode machst, verstehe ich nicht, ist aber hier auch egal). Der Punkt ist: TextOut ist eigentlich ganz innig mit dem Formular verbunden, es schreibt etwas in das Memo, das zum Formular gehört. Darum sollte TextOut auch zur Formular-Klasse gehören. Daher sollte TextOut keine alleinstehende Prozedur sein, sondern eine "Methode" der Klasse. Das ist für den Anfänger vielleicht irgendwie dasselbe, jedoch wird eine Methode immer im Kontext der zugehörigen Klasse ausgeführt, und die Methode kann auf das zurückgreifen, was zur Klasse gehört. Das heißt konkret, eine Methode TextOut würde automatisch das Memo kennen, und du musst dem Aufruf keine Formularvariable voranstellen. Weiterhin würde dein Code immer noch funktionieren, wenn du den Code für eine andere Instanz derselben Klasse verwendest (d.h. ein anderes mit TForm1 als "Schablone" erzeugtes Formular).
Also zusammengefasst: Deine Lösungist eine Krücke, weil sie die Vorteile der objektorientierten Programmierung nicht ausnutzt. Richtig wäre:
Wenn dein Programm zwei Instanzen der Klasse TForm1 verwendet, z.B.
so wird dein Code für Form1a nicht funktionieren, meiner dagegen sehr wohl, weil TextOut zu dieser Klasse gehört, egal ob die Instanz nun Form1 oder Form1a heißt.
Um die Verwendung von Prozeduren zu lernen und zu üben, erscheint mir ein Lazarus LCL-Programm nicht geeignet zu sein, weil dich die Aufgabe, eine Prozedur zu verwenden, von der richtigen Lösung, eine Methode zu nehmen, ablenkt. Probier doch lieber eine Kommandozeilenanwendung.
Du hast in deinem Programm eine Klasse namens TForm1. Alle Formulare, die aus dieser Klasse erzeugt werden, beherbergen zwei Buttons, eine Checkbox und ein Memo und verhalten sich beim Klick auf Button2 so, dassl dem Memo ein bestimmter Text hinzugefügt wird. Du möchtest nun mit Hilfe der Prozedur TextOut nochmals Text anfügen (warum du das nicht gleich in der ButtonClick-Methode machst, verstehe ich nicht, ist aber hier auch egal). Der Punkt ist: TextOut ist eigentlich ganz innig mit dem Formular verbunden, es schreibt etwas in das Memo, das zum Formular gehört. Darum sollte TextOut auch zur Formular-Klasse gehören. Daher sollte TextOut keine alleinstehende Prozedur sein, sondern eine "Methode" der Klasse. Das ist für den Anfänger vielleicht irgendwie dasselbe, jedoch wird eine Methode immer im Kontext der zugehörigen Klasse ausgeführt, und die Methode kann auf das zurückgreifen, was zur Klasse gehört. Das heißt konkret, eine Methode TextOut würde automatisch das Memo kennen, und du musst dem Aufruf keine Formularvariable voranstellen. Weiterhin würde dein Code immer noch funktionieren, wenn du den Code für eine andere Instanz derselben Klasse verwendest (d.h. ein anderes mit TForm1 als "Schablone" erzeugtes Formular).
Also zusammengefasst: Deine Lösung
Code: Alles auswählen
Procedure Textout;
Begin
Form1.Memo1.Lines.Add('Prozedur');
end;
Code: Alles auswählen
Procedure TForm1.Textout;
Begin
Memo1.Lines.Add('Prozedur');
end;
Code: Alles auswählen
var
Form1: TForm1;
Form1a: TForm1;
Um die Verwendung von Prozeduren zu lernen und zu üben, erscheint mir ein Lazarus LCL-Programm nicht geeignet zu sein, weil dich die Aufgabe, eine Prozedur zu verwenden, von der richtigen Lösung, eine Methode zu nehmen, ablenkt. Probier doch lieber eine Kommandozeilenanwendung.
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Prozedure kein Zugriff auf TMemo
Hallo
Danke für den ausführlichen Hinweis. Ja bin jetzt erst eine Woche am lernen.
Das war nur ein kleines Beispiel um zu sehen ob die Prozedur erkannt und auch verwendet wird.
Das TMemo ist sozusagen nur zum 'debuggen' gedacht.
Ich weiss das es noch einen richtigen Debugger gibt, aber das ist mir noch zu früh für sowas.
Ich habe die Prozedur wie vorgeschlagen geändert.
Procedure TForm1.Textout;
Begin
Memo1.Lines.Add('Prozedur');
end;
Erhalte aber jetzt die folgende Fehlermeldung:
Exit code 1 Fehler2
Method identifier expected
Fehlt das noch was?
Danke für den ausführlichen Hinweis. Ja bin jetzt erst eine Woche am lernen.
Das war nur ein kleines Beispiel um zu sehen ob die Prozedur erkannt und auch verwendet wird.
Das TMemo ist sozusagen nur zum 'debuggen' gedacht.
Ich weiss das es noch einen richtigen Debugger gibt, aber das ist mir noch zu früh für sowas.
Ich habe die Prozedur wie vorgeschlagen geändert.
Procedure TForm1.Textout;
Begin
Memo1.Lines.Add('Prozedur');
end;
Erhalte aber jetzt die folgende Fehlermeldung:
Exit code 1 Fehler2
Method identifier expected
Fehlt das noch was?
Good code comes from experience, experience comes from bad code.
Re: Prozedure kein Zugriff auf TMemo
Ja, da du die Methode innerhalb der Klasse verwenden willst, musst du die Methode auch innerhalb der Klasse deklarieren. Siehe z.B. https://www.delphi-treff.de/object-pasc ... d-objekte/Marc hat geschrieben:Fehlt da noch was?
Das sieht dann so aus:
Code: Alles auswählen
unit Unit1;
...
interface
...
type
TForm1 = class(TForm)
Memo1: TMemo;
...
public
procedure Textout; // hier die Deklaration
end;
...
implementation
...
procedure TForm1.Textout; // hier die Implementierung
begin
Memo1.Lines.Add('Prozedur');
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Prozedure kein Zugriff auf TMemo
Das bedeutet etwas völlig unterschiedliches und man muss genau wissen, was man tut !!!Marc hat geschrieben: 'Form1.Memo1...' statt ein 'TForm1.Memo1...'
TForm1 ist eine Klasse, Form1 eine Instanz. Die Fehlermeldung ist nur ein Hinweis, dass man da etwas nicht richtig macht. Keine Fehlereldung heißt nicht, dass es jetzt richtig ist und schon gar nicht dass es das bedeutet was man meint.
-Michael
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Prozedure kein Zugriff auf TMemo
Ja super. Danke für die Hilfe und den Link. Jetzt klappt es.
Good code comes from experience, experience comes from bad code.