Methoden

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Guenni66
Beiträge: 3
Registriert: Mo 3. Aug 2020, 19:46
OS, Lazarus, FPC: WIN 32-Bit (LAZ 1.6.4 FPC 2.6.4), WIN 64-Bit (LAZ 1.8.4 FPC 3.0.4), BP 7.0
CPU-Target: 32Bit u. 64Bit
Wohnort: Taunus b. Frankfurt a.M. "Rhein-Main"

Methoden

Beitrag von Guenni66 »

Hallo, ich bin neu hier im Forum. Und obwohl jahrelange Programmier-Erfahrung mit PASCAL habe, habe ich mit LAZARUS immer noch Schwierigkeiten.
Aber zum Thema bzw. zur Frage:
Ich habe mein Fenster ("Formular"/ Form) erstellt und später auch einige Änderungen darin vorgenommen. Jedoch erstmalig ohne darin ein Menü einzufügen. Es läuft noch nicht perfekt, aber das bekomme ich sicher noch hin, da ich es gewohnt bin den Programm-Code manuell zu erstellen.
Nun jedoch bekomme ich seit einiger Zeit beim Abspeichern die Fehlermeldung:

"Die folgenden Methoden, die von Form1:TForm1 verwendet werden
sind nicht im Quelltext C:\PROJEKTE\PASCAL\P1\unit1.pas

Button1 : TButton OnClick = Button1Click
Button2 : TButton OnClick = Button2Click

Die hängenden Verweise löschen?"
Ich antworte dann mit "Nein darin lassen und weiter machen" (oder so ähnlich).
Aber wie löse ich das Problem grundsätzlich?
Ich kann die Ereignisse bei den Buttons im Objektinspektor so nicht finden! Vielen Dank für Eure/Ihre Hilfe.
Guenni66

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Methoden

Beitrag von Winni »

Hallo!

Jetzt bist Du nicht mehr unter Turbo-Pascal sondern unter Lazarus.
Das mag es nicht, wenn man ihm einfach die Logik unter den Füßen wegzieht, ohne es davon zu informieren.

Aber der Reihe nach:
Erstmal die hängenden Verweise löschen. Nun haben wir (hoffentlich) eine normale Ausgangsbasis.

Nun packst Du Button1 auf das Formular und wählst den Reiter "Ereignisse" im Objekt-Inspektor. Du klickst das Ereignis "OnClick" an. An der rechten Seite erscheint ein Button mit "...". Den Klickst Du. Automatisch wird der Prozedur-Rumpf für dieses Ereignis erzeugt. Hier kannst Du nun Deinen Code einfügen - im einfachsten Fall

Code: Alles auswählen


Showmessage ('Button 1 geklickt');
Wenn Du das Ereignis wieder loswerden willst, klickst Du wieder auf Button1/Ereignisse. Dann klickst Du auf "keine" oder "none". Danach kannst Du manuell die Procedure TForm1.Button1Click löschen. Sowohl im Interface als auch in der Implementation.

So weiß Lazarus Bescheid und Du stürzt es nicht in Logik-Konflikte.


Winni

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Methoden

Beitrag von kupferstecher »

Willkommen im Forum!

Du hast offenbar die Events TForm.Button1Click und TForm.Button2Click gelöscht oder umbenannt (im Quellcode).
Der Dialog fragt dich, ob du es gerne auch aus dem Objectinspector (OI) gelöscht haben möchtest. (Auf den Button1 klicken und dann im Objectinspector auf Ereignisse wechseln, dort wo du die Events auch angelegt hast).

Ich würde "Ja" drücken, dann ist alles wieder sauber und du musst die Events anschließend über den OI neu anlegen.

Guenni66
Beiträge: 3
Registriert: Mo 3. Aug 2020, 19:46
OS, Lazarus, FPC: WIN 32-Bit (LAZ 1.6.4 FPC 2.6.4), WIN 64-Bit (LAZ 1.8.4 FPC 3.0.4), BP 7.0
CPU-Target: 32Bit u. 64Bit
Wohnort: Taunus b. Frankfurt a.M. "Rhein-Main"

Methoden

Beitrag von Guenni66 »

Das ist ja klasse, Sie/Ihr seid ja wirklich fix mit euren Antworten! Ganz lieben, vielen Dank dafür. Ich habe, wie von kupferstecher vorgeschlagen, mit "Ja" geantwortet und so die hängenden Verweise gelöscht. Und auch den Button 1 gelöscht und wieder neu angelegt.
Mein Formular/Fenster sieht so aus:
p_1.screen0.jpg
p_1.screen0.jpg (65.19 KiB) 2121 mal betrachtet
und meine unit1.pas so
unit1.pas
(2.57 KiB) 73-mal heruntergeladen
Im Objektinspektor habe ich für Form1 : TForm1 beim Ereignis
OnCreate : Create_ eingetragen, doch wenn ich das Programm starte läuft es nicht los. Bzw. beim Drücken auf Button 1 (der dann "Start" zeigen sollte) sollte der Zähler ganz rechts jede Sekunde um Eins höherzählen.
Und beim Betätigen von Button 2 dann Stoppen, beim nochmaligen Betätigen von Button 2 das Programm sich dann beenden.
Aber es läuft nicht ... Irgendwas mache ich falsch ... - aber was?
Vielen Dank für Ihre/Eure weitere Hilfe ...

Guenni66

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Methoden

Beitrag von six1 »

Du bist noch im Turbopascal Modus :)

Wenn du im Designer die Form1 anklickst, kannst du im Objectinspector unter Ereignisse das Event "onCreate" doppelklicken und das Form1.onCreate wird erstellt.
Wenn du bereits im Create der Form deine Anzeige Routine startest, welche unablässig einen Sleep ausführt, hat die Anwendung keine Zeit, die Form zu zeichnen.
Deine Anzeige Routine solltest du im onShow von Form1 starten.
Ein sleep solltest du vermeiden, da es die Anwendung "einfriert".
Setze an dieser Stelle einen Timer ein.
Anstatt deiner Hilfsvariablen buton1 und buton2 könntest du auch die Eigenschaften "tag" der Button verwenden.
Gruß, Michael

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Methoden

Beitrag von h-elsner »

Bei Lazarus Programmierung einer GUI sollte das Programm immer bedienbar sein. Das Betriebssystem wartet auf Ereignisse und arbeitet diese ab. Dein Programm reiht sich in die Warteschlange ein. Es macht also erstmal gar nix. Alles was es braucht, ist ja vorgeleistet wenn du ein Formular benutzt.

Du bastelst dir also ein Formular und setzt aus der Riesenmenge von Steuerelementen das darauf, was du brauchst, z.B. einen Button. Hast du ja gemacht und wenn du das Programm kompilierst wird es gestartet und angezeigt. Machten tut es nix, weil es keinen Event auslöst, der vom Betriebssystem bearbeitet werden kann. Button drücken und beim OnClick Event schreibst du rein, was er machen soll.

Das Schöne ist, es gibt in der Menge der Steuerelemente einen Timer, der genau das macht, was du willst: Er wartet 1sec (oder wie lange auch immer) und löst dann einen Event aus. Und genau da schreibst du rein, was passieren soll - hier deine Anzeige.

Ich habe mal alle Namen so gelassen, wie Lazarus das vorschlägt. Es gibt keine globalen Variablen, ich habe wie oben vorgeschlagen, die sowieso vorhandene Integer Button1.Tag mißbraucht. Und dann sieht es bei mir so aus:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject); {Alle Einstellungen beim Erzeugen des Formulars}
begin
  Application.Title:= pname;      // Programm-Titelzeile setzen
  Caption          := pname;      // Titelzeile des Fensters/Formulars setzen
  Button1.Caption  := 'Start';
  Button2.Caption  := 'Stop';
  Button1.Tag      := 0;
  Edit1.Text       := IntToStr(Button1.Tag);
  Timer1.Enabled   := false;     // Die 'Uhr' läuft nicht
  Timer1.Interval  := 1000;       // Ticker auf 1 sec
end;

procedure TForm1.Timer1Timer(Sender: TObject);  // hier steht, was passieren soll, wenn 1 sec vorüber ist
begin
  Button1.Tag:=Button1.Tag+1;
  Edit1.Text       := IntToStr(Button1.Tag);    // Anzeige
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled   := true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  If Timer1.Enabled then begin
    Timer1.Enabled := false;              // Anzeige stoppen
    Edit1.Text     := IntToStr(Button1.Tag);
  end else Close;                         // Beenden, wenn Zählen gestoppt wurde
end;
Ich hoffe, das macht es ein wenig verständlich. ich hatte auch so meine probleme, von Turbo Pascal durchlaufenden Programmen auf Event-basierte Programmierung umzusteigen. Man sieht aber, dass mit gant wenig Zeilen Code eine Menge gemacht werden kann.

Gruß HE

Guenni66
Beiträge: 3
Registriert: Mo 3. Aug 2020, 19:46
OS, Lazarus, FPC: WIN 32-Bit (LAZ 1.6.4 FPC 2.6.4), WIN 64-Bit (LAZ 1.8.4 FPC 3.0.4), BP 7.0
CPU-Target: 32Bit u. 64Bit
Wohnort: Taunus b. Frankfurt a.M. "Rhein-Main"

Methoden

Beitrag von Guenni66 »

Vielen Dank für alle Beiträge.
Daß ich noch im "Turbo-Pascal-Modus" bin, das mag sicher stimmen ... :cry:

Dann gehe ich erst einmal auf die Antwort von six1 ein.
Ich habe den sleep(1000)-Befehl in Anzeige1 mal deaktiviert, desweiteren beim Ereignis Form1 OnCreate Anzeige1 gelöscht (und beim OnActivate : Anzeige1 hatte ich es wohl auch eingetragen)
sowie auch den Anruf von Anzeige1 in der Methode Create_ gelöscht bzw. deaktiviert.
Wenn ich aber nun bei Form1 im Ereignis OnShow : Anzeige1 eintragen möchte, erhalte ich die Meldung: "Fehler. Kann Methode nicht zeigen. Bitte berichtigen sie den Fehler, der im Nachrichtenfenster gezeigt wird. ..."
Doch dort steht kein Fehler, weil ich das Projekt und Lazarus mittlerweile geschlossen und Lazarus neu gestartet habe.

Dafür bekomme ich, wenn ich in OnShow etwas eintrage, die Methoden (neben (keine)) aber Button1Click und Create_ angezeigt.

Auf den Vorschlag von h-elsner werde ich später zurück kommen.
Danke und Grüße, Guenni66

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Methoden

Beitrag von wennerer »

Hallo Guenni66,
für den Einstieg in das Thema kann ich dir das Buch Delphi für Kids von Hans-Georg Schumann empfehlen. Ich habe mir damals beim Umstieg von Turbo Pascal die Version 3 gekauft und die in einem Rutsch durchgemacht. Sehr gut aufgebaut und bei den Grundsätzlichen Dingen kaum ein Unterschied zu Lazarus (ich schau da immer noch manchmal rein). Gibt's bei Ebay für ganz kleines Geld!

Viele Grüße
Bernd

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Methoden

Beitrag von six1 »

Guenni66, schau dir mal den Quelltext von h-elsner an.
Würde ich den Quellcode schreiben, käme exakt das Gleiche heraus :)
Gruß, Michael

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Methoden

Beitrag von kupferstecher »

@Guenni66,
die Events kannst du von Lazarus anlegen lassen, dazu einfach im Objektinspektor auf die 3 Punkte hinten in der Zeile des gewünschten Events klicken. Wenn noch keine Methode für das Event angelegt war, macht das Lazarus dann für dich (und vergibt auch gleich einen passenden Namen).
Objektinspektor.png
Objektinspektor.png (29.36 KiB) 1996 mal betrachtet

Antworten