Autor Beitrag
ErnestoChe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: So 09.02.03 14:30 
Servus,

ich habe eine MDI-App mit mehreren Child-Forms geschrieben. Diese habe ich in den Projektoptionen zu den verfügbaren Formularen verschoben. Wenn ich aus einem Child-Form auf die Daten eines anderen Child-Forms zugreifen möchte erhalte ich eine Exception.

Wenn ich jetzt aber in den Projektoptionen die jeweilige Child-Form zu den auto-create-forms rüber ziehe, dann gehts. Aber ich möchte nicht, dass diese Formulare zu sehen sind wenn ich die App starte.

Wie kann ich erreichen, dass die Form zu den verfügbaren gehört und ich trotzdem auf die Daten zugreifen kann.

Wäre super, wenn mir jemand helfen könnte. Danke schon mal.

MFG

- Ernesto -
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 10.02.03 09:51 
Hallo,

poste doch mal den Sourcecode mit dem du versuchst auf das andere Childform zu zugreifen.

Gruß
TINO
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Mo 10.02.03 09:58 
Hallo,

werden die Formulare überhaupt erstellt, bevor Du auf sie zugreifst?
Das hört sich zumindest so an, weil Du das Problem ja nicht hast, wenn die Formulare automatisch erzeugt werden.

Dies bedeutet, Du musst die Formulare vor dem 1. Zugriff selber erzeugen. Wo Du sie erzeugst, ist erst einmal egal. Entweder in der OnCreate Deines MDI-Forms oder auf Reaktion von Ereignissen während des Programmablaufes.

Schau Dir auch einmal die Eigenschaften MDIChildren und MDIChildCount an.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
ErnestoChe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Mo 10.02.03 10:42 
Hi,

erstmal danke für die Antworten. Leider kann ich keinen Code posten, da ich die Anwendung daheim habe und ich jetzt in der Firma bin.

Hab jetzt aber kurz eine mini-Anwendung geschrieben, die das gleiche Problem hat:
ausblenden Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := Form2.Edit1.Text;  //Form2 ist MDI-Child
end;

Wenn jetzt Form2 bei den verfügbaren Formularen ist erhalte ich einen Zugriffsverletzungsfehler. Wenn ich dann Form2 kreatiere:
ausblenden Quelltext
1:
2:
3:
4:
procedure TForm1.oeffnen1Click(Sender: TObject);
begin
  TForm2.Create(self);
end;

erhalte ich trotzdem einen Fehler. Erst wenn ich die ChildForm zu den Auto-Creates rüberziehe funktioniert es. Wenn ich jetzt die ChildForm schliesse (OnClose: Action := caFree) klappt es wieder nicht.
Wenn ich bei OnClose Action := caHide oder Eigenschaften Visible:=False einstelle heisst es, dass man eine MDI-Child-Form nicht verbergen kann.

Das möchte ich aber. Denn in Form2 soll man Einstellungen vornehmen können und anschliessend wieder schliessen.

Ich habe dann die Formstyle von Form2 auf fsNormal umgestellt und dann gehts ja mit dem Visible:=False.

Aber mir ist es lieber, wenn es MDI-Child ist. Ich hoffe ich habe mich verständlich ausgedrückt.

MFG

- Ernesto -

Moderiert von user profile iconTino: Code-Tags hinzugefügt.
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Mo 10.02.03 11:10 
Hallo,

Dein Beispiel kann so nicht funktionieren.

Probiere einmal folgendes:
ausblenden Quelltext
1:
2:
3:
4:
  procedure TForm1.oeffnen1Click(Sender: TObject); 
begin 
  if (Form2=nil) then Form2:=TForm2.Create(self); 
end;


In das OnDestroy-Ereignis von Form2 trägst du folgendes ein:
ausblenden Quelltext
1:
2:
3:
4:
procedure TForm2.FormDestroy(Sender: TObject);
begin
  Form2:=nil;
end;


Um ganz sicher zu sein, das Form2 beim Start auch nil ist, trägst Du noch folgendes am Schluß in die Unit Form2 ein:
ausblenden Quelltext
1:
2:
initialization
  Form2:=nil;


So, nun hast Du die Möglichkeit, folgendes auszuführen:
ausblenden Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if (Form2<>nil) then Label1.Caption:=Form2.Edit1.Text;
end;

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
ErnestoChe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Mo 10.02.03 11:35 
Hi,

@Smiegel

danke für den Code. Ich werde damit rumprobieren.

MFG

- Ernesto -