Autor Beitrag
Rawi
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 07.12.18 19:21 
Hallo zusammen,
ich habe leider Problem und weiß nicht recht, wie ich es beheben soll.

Mein Quelltext sieht so aus:
ausblenden 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
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2292
Erhaltene Danke: 420

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 07.12.18 20:25 
Guten Abend und Willkommen Rawi,

hast du die dazugehörige Unit aus dem anderen Formular in die uses-Klausel deiner Hauptanwendung aufgenommen?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
unit Unit1;

interface

uses
  Unit5;

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2273
Erhaltene Danke: 42

Windows 7 64 Bit
Delphi XE2 Starter, Delphi 10.1 Starter, Delphi 10.2 Tokyo Community Edition
BeitragVerfasst: 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.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2292
Erhaltene Danke: 420

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 09.12.18 23:12 
Unter Projekt -> Optionen -> Formulare ... kann man festlegen, welches Formular automatisch erstellt, und welches nur verfügbar sein soll.
Wird Form5 automatisch erstellt, sollte man aus der TForm1-Klasse heraus direkt auf Form5 zugreifen können, vorausgesetzt, Unit5 ist unter uses in Unit1 gegeben.
Ist Form5 nur verfügbar, muss innerhalb der TForm1-Klasse ein Objekt von TForm5 erstellt werden, wie z.B.:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  Form5: TForm5;
begin
  Form5 := TForm5.Create(nil);
  try
    // ... mach etwas mit dem Memo aus Form5
  finally
    Form5.Free;
  end;
end;

oder:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
uses ..., Unit5;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    Form5: TForm5;
  end;

var
  Form1: TForm1;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form5 := TForm5.Create(Form1);  // 'Form1' kümmert sich hierbei auch um die Freigabe von 'Form5'
end;

Nebenbei:
Wenn du Einstellungen speichern möchtest, verwende doch einfach eine INI-Datei.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)