Prozedure kein Zugriff auf TMemo

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Marc
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

Beitrag von Marc »

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?
Dateianhänge
upload.zip
(2.24 KiB) 57-mal heruntergeladen
Good code comes from experience, experience comes from bad code.

Marc
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

Beitrag von Marc »

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.
Good code comes from experience, experience comes from bad code.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Prozedure kein Zugriff auf TMemo

Beitrag von wp_xyz »

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ösung

Code: Alles auswählen

Procedure Textout;
Begin
  Form1.Memo1.Lines.Add('Prozedur');
end;
ist eine Krücke, weil sie die Vorteile der objektorientierten Programmierung nicht ausnutzt. Richtig wäre:

Code: Alles auswählen

 
Procedure TForm1.Textout;
Begin
  Memo1.Lines.Add('Prozedur');
end;

Wenn dein Programm zwei Instanzen der Klasse TForm1 verwendet, z.B.

Code: Alles auswählen

var
  Form1: TForm1;
  Form1a: TForm1;
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.

Marc
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

Beitrag von Marc »

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?
Good code comes from experience, experience comes from bad code.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Prozedure kein Zugriff auf TMemo

Beitrag von Michl »

Marc hat geschrieben:Fehlt da noch was?
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-pascal/klassen-und-objekte/

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; 

mschnell
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

Beitrag von mschnell »

Marc hat geschrieben: 'Form1.Memo1...' statt ein 'TForm1.Memo1...'


Das bedeutet etwas völlig unterschiedliches und man muss genau wissen, was man tut !!!
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

Marc
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

Beitrag von Marc »

Ja super. Danke für die Hilfe und den Link. Jetzt klappt es.
Good code comes from experience, experience comes from bad code.

Antworten