Autor Beitrag
haribito
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.05.09 14:18 
Hallo,

ich versuche beim Schliessen eines dynamisch erstellten Forms das "Eltern" Form anzustossen damit es vor dem beenden des Childforms die Daten sichert.

Wie kann das dynamisch erstellte Form dem ElternForm mitteilen das es geschlossen werden will vom Benutzer , sodass das ElternForm Daten Methoden aufrufen kann, um Daten zu sichern und das Form dann zerstören kann.

Childform Aufruf
ausblenden Delphi-Quelltext
1:
2:
FormList[i] := TFomrBsp.create(NIL);
FormList[i].Name := 'Bsp'+inttoStr(i);

Ich möchte nicht das eltern Form dem Childform hinzufügen aber vom Childform aus das Elternform anstossen damit es das Childform zerstoert und die Verweise korrekt loescht.



MfG
Haribito

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 27.05.09 14:30 
Hallo und :welcome: im Forum!

Du könntest zum Beispiel das erstellte Fenster mit ShowModal aufrufen, dann könntest du den entsprechenden Code direkt dahinter schreiben.
Oder du weist bei deinem dynamisch erstellten Element das Ereignis OnClose einem Handler in deinem Elternformular zu.
ausblenden Delphi-Quelltext
1:
MyChildForm.OnClose := ChildFormOnClose;					
Wobei du ChildFormOnClose natürlich entsprechend deklarieren und implementieren musst in deinem Elternformular.
haribito Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.05.09 15:08 
Danke jaenicke für die Antwort und das warme Welcome!

Mir ist schon klar das es diese Funktion gibt, allerdings will ich das Formular ja mehr mals an verschiedenen stellen aufrufen und zu dem jeweils aufrufen Form zurückkehren und ggf. unterschiedliche funktionen aufrufen.


Ich hole mal etwas weiter aus: ( wie ich mir das gedacht habe)

- Vom ElternForm aus FormBsp instanzieren
- Vom ElternForm aus FormBsp create
- Vom ElternForm aus an FormBsp Handler über geben der die Schlieseen Methode erhält,
wenn das Form durch Benutzer auf eine beliebige Art geschlossen wird
- Vom ElternForm aus Daten für die Anzeige/Bearbeiten an FormBsp übergeben
- FormBSp macht Änderungen an Daten
- Formbsp will geschlossen werden und ruft Handler des ElternForms auf ( der ja beim Create geben wurde)
- ElternForm erhaelt Handleraufruf und Parameter, um zu wissen welchen Event (speichern,Schliessen,Druck)
- ElternForm holt sich ggf. geänderte Daten mit Methode aus FormBsp.
- ElternForm schliesst nach erledigter Arbeit FormBSp. udn räumt hinter FormBsp auf.

ich habe schon Postmesage aufrufe mit WParam und IParam jedoch kamen die leider nicht im ElterForm an

Vielleicht mit den mehr Details kannst du mit noch einen tipp geben.


Gruss
Haribito
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 27.05.09 15:16 
Das hört sich doch sehr nach ShowModal und Auswertung von ModalResult an. Dann brauchst du auch keinen Handler oder irgendetwas.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
frmChildForm := TfrmChildForm.Create(nil);
try
  frmChildForm.Init...
  case frmChildForm.ShowModal of
    mrOk: ..
    mrCancel: ...
  ...
  end;
  ...
finally
  FreeAndNil(frmChildForm);
end;
Alternative:
Ein eigenes Event implementieren, das explizit die entsprechende Information als Parameter weitergibt.

// EDIT:
Eine Möglichkeit gelöscht, diese beiden sind schon am passendsten.
haribito Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.05.09 15:27 
:-)

Vielleicht bin ich ja zu starrsinnig, aber mit ShowModal kann ich das Fenster ja nur einmal gleichzeitig haben, weil es ja modal ist.
Ich mnöchte aber das Childform mehrmals erstellen können, aus unterschiedlichen Quellen, und den Bezug zum Elternform eben nicht machen.

Eine allgemeingültige Antwort in Form eines Events, das an jedes beliebige ElternForm, dass so ein ChildForm erstellt hat zurückgibt fände eleganter... Dieses TEvent kann das ElternForm auswerten und entscheiden was gemacht werden soll.

Dann kann ich das Childform mehrfach benutzen und jedes ElternForm kann sein Childform organisieren...

Geht das nicht auch ?

Um mit dem OnClose Handler in das ElternForm zu gelangen muss ich ja das ElternForm dem ChildForm als uses geben, sonst kennt es ja die procedure nicht. Und genau die Abhängigkeit möchte ich nicht.

Besonders das wechseln in das ElternForm oder ein Nebenform wäre ja mit ShowModal IMHO nicht mehr drin.

oder bin ich nun auf dem Holzweg?

Gruss
Haribito
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 27.05.09 15:34 
user profile iconharibito hat folgendes geschrieben Zum zitierten Posting springen:
Um mit dem OnClose Handler in das ElternForm zu gelangen muss ich ja das ElternForm dem ChildForm als uses geben, sonst kennt es ja die procedure nicht. Und genau die Abhängigkeit möchte ich nicht.
Wieso sollte das notwendig sein? Das Kindfenster hat doch mit dem Event nichts zu tun?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
uses
  ChildForm;

procedure TFormX.ChildFormOnClose(Sender: TObject);
begin
  ...
end;

procedure TFormX.Whatever...
begin
  frmChildForm := TfrmChildForm.Create(nil);
  frmChildForm.OnClose := ChildFormOnClose;
end;
Flexibler wäre sicherlich ein eigenes Event, das du mit einem entsprechenden Parameter versiehst und vom ChildForm aus aufrufst. Dafür muss das aber das Elternformular nicht kennen, denn das weist ja den Handler selbst zu und das ChildForm benutzt diesen Handler.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mi 27.05.09 15:41 
Ich denke mal, dass Du das ganze doch mit einer "Stapel-Variable" hinbekommen müsstest - also z.B. so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
//Unter der Form-Variablen-Deklaration:
var childForms:Array of TfrmChildForm;
//Und hier die (dazu hoffentlich fähige) Prozedur:
procedure erstelleForm();
begin
childForms[length(childForms)].Create(nil);
end;

Aber das ist jetzt einfach erst mal nur so hier hingeschrieben - ich kenn mich auf dem Sektor leider noch nicht so gut aus.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 27.05.09 15:43 
So kann man sich mehrere erstellte Formulare merken, aber was hat das mit dem Callback-Problem zu tun? ;-)
// EDIT:
So wie du es jetzt editiert hast, geht es gar nicht, weil du den Konstruktor nicht mehr richtig benutzt... So rufst du die Methode Create einer (vermutlich nicht existenten) Instanz auf.
(Length ist aber als Index eins zu viel, High musst du benutzen.)
haribito Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.05.09 16:22 
Ach, jaenicke! *Patsch*

jetzt glaube ich zu wissen warum wir an einander vorbei reden.
Zitat:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TFormX.Whatever...
begin
  frmChildForm := TfrmChildForm.Create(nil);
  frmChildForm.OnClose := ChildFormOnClose;
end;



Im ElternForm setzt Du in Deinem Beispiel ja den Chidform onclose handler auf eine Funktion die im ElternForm ist. Aber wie erfährt das Childform wo das
ausblenden Delphi-Quelltext
1:
ChildFormOnClose(Sender: TObject; var Action: TCloseAction);					

liegt?

Muss man da nicht einen verweis auf daas elternform geben damit es dort die Funktion ChildFormOnClose() aufruft?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Beispiel ElternForm 

....
  public
    { Public-Deklarationen }
    procedure ChildFormClose(Sender: TObject; var Action: TCloseAction);

  end;

var
  Form_Eltern: TForm_Eltern;
  FormList : array[1..10] of TForm;

implementation

uses ChildForm;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Beispiel ChildForm
....

  public
    { Public-Deklarationen }

  end;

var
  Form_Child: TForm_Child;

implementation


// uses // leer!


Das ChildForm wird geschlossen und ruft den zur Runtime dort plazierten Funktionsaufruf ...
Wie erfährt das Childform denn das diese Funktion nicht eine Funktion aus ihrem Form ist sondern aus dem des ElternForms? Ich muesste doch ihm das Control des ElternFormsgeben und dort die Funktion aufrufen, die ja im "public" steht

Da ich das ChildForm mit
ausblenden Delphi-Quelltext
1:
Formbsp := TForm_Child.create(NIL);					

erzeugt habe, übernehme ich doch IMHO selbst die Verantwortung es korrekt zu zerstoeren was ich erstelle.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm_Child.Tbt_SchliessenClick(Sender: TObject);
// Eltern Prozess mitteilen das dieses ChildFenster geschlossen werden soll.
begin
  close;
end;


Nun jedenfalls meint mein Delphi7 dass das Childform machen könne was es will und der Aufruf OnClose kommt nicht im ElternForm an!

Ein Idee warum ich mich so dumm anstelle?

Gruss

Haribito
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 27.05.09 16:24 
Du kannst selbst deinen Handler aufrufen:
ausblenden Delphi-Quelltext
1:
2:
if Assigned(OnClose) then
  OnClose(...);
Da brauchst du das was hinter dem Handler steckt nicht zu kennen, das ist ja genau das Prinzip dabei. ;-)

Am besten deklarierst du aber einen eigenen, dem du eigene Parameter mitgeben kannst.
haribito Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.05.09 16:37 
Hi :-)


Aber ich will doch aus dem ChildForm keine HandlerFunction aufrufen die im ChildForm steht, sondern aus dem Childform dem ElternForm sagen : ( weil der Nutzer den schliessen Knopf im Childform gedrueckt hat)

ausblenden Delphi-Quelltext
1:
2:
3:
AktuelleDaten := FormBsp.ReadFormularData;
FormBsp.hide;
FreeAndNil(FormBsp);


Danach ist das Childform weg und das ElternForm hat die Daten sich gelesen.

Hmm, denke ich zu kompliziert?


Gruss
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 27.05.09 17:05 
Ok, das hat so keinen Sinn, siehe Anhang. Nur das Hauptformular kennt die Unit des Kindofrmulars, nicht umgekehrt... ;-)
Einloggen, um Attachments anzusehen!
haribito Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.05.09 23:23 
Hmm, da bleibt mir einfach nur DANKE zu sagen.

Das ist genau das was ich gesucht habe....ich werde damit noch ein bisschen Spielen um herauszufinden was ich nicht verstanden habe.

Aber in jedem Fall grosses Danke und vor allem für Deine Geduld.


Gruss
Haribito