Entwickler-Ecke

Sonstiges (FPC / Lazarus) / Linux API - Anderes Formular beim Start ansprechen


Rawi - Fr 07.12.18 19:21
Titel: Anderes Formular beim Start ansprechen
Hallo zusammen,
ich habe leider Problem und weiß nicht recht, wie ich es beheben soll.

Mein Quelltext sieht so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button7Click(Sender: TObject);
begin
  if not Fileexists(patheinst + 'farbe.txt'then
    begin
      form5.memo1.lines[0]:='Standart';
      form5.memo1.lines.savetofile(patheinst + 'farbe.txt')
    end;
  if not Fileexists(patheinst + 'name.txt'then
    begin
      form5.memo2.lines[0]:='';
      form5.memo2.lines.savetofile(patheinst + 'name.txt')
    end;
       form5.memo1.lines.loadfromfile(patheinst+ 'farbe.txt');
  form5.combobox1.caption:=form5.memo1.lines[0];
  form5.button2.click;
end;


Diese Prozedur wird immer beim Starten des Programms gestartet (Form1.Create). Leider ergibt sich dann bei mir sofort ein Fehler, weil ich Form5 irgendwie nicht ansprechen kann. Kann es sein, dass die anderen Formulare erst später erstellt werden und deshalb Form5 noch gar nicht existiert? Wie kann ich das Problem beheben?

Vielen Dank

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Delete - Fr 07.12.18 20:25

- Nachträglich durch die Entwickler-Ecke gelöscht -


galagher - Sa 08.12.18 10:15

user profile iconRawi hat folgendes geschrieben Zum zitierten Posting springen:
Diese Prozedur wird immer beim Starten des Programms gestartet (Form1.Create).
Das funktioniert deshalb nicht, weil:

user profile iconRawi hat folgendes geschrieben Zum zitierten Posting springen:
[...] die anderen Formulare erst später erstellt werden
Genau das ist der Grund! Form5 existiert im Create von Form1 noch nicht.

user profile iconRawi hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich das Problem beheben?
Du musst das, was Form5 mit Memo2 macht, in eine eigene Prozedur auslagern, dabei darfst du weder auf Form5 noch auf eine Komponente von Form5 zugreifen. Schreibe die Prozedur so, dass sie sowohl von Form5 als auch von Form1 genutzt werden kann und gib dort ein TMemo als Konstante an.

Alternativ kannst du, wenn das in deinem Programm möglich ist, in Prozedur TForm1.FormShow auf Form5 zugreifen, oder du versuchst es in der OnActivate-Prozedur von Form1. In beiden Fällen musst du unter Umständen Vorkehrungen treffen, dass der Code nicht bei jedem Eintritt des OnShow- bzw. OnActivate-Ereignisses ausgeführt wird, zB. mit einer Boolean-Variable.

Die sauberste Lösung ist aber eine eigene, separate Prozedur! Ich würde es so machen.


Delete - So 09.12.18 23:12

- Nachträglich durch die Entwickler-Ecke gelöscht -