| Autor |
Beitrag |
haribito
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
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 Narses: Delphi-Tags hinzugefügt
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 27.05.09 14:30
Hallo und  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. Delphi-Quelltext 1:
| MyChildForm.OnClose := ChildFormOnClose; | Wobei du ChildFormOnClose natürlich entsprechend deklarieren und implementieren musst in deinem Elternformular.
|
|
haribito 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 27.05.09 15:34
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var childForms:Array of TfrmChildForm; 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 27.05.09 16:22
Ach, jaenicke! *Patsch*
jetzt glaube ich zu wissen warum wir an einander vorbei reden.
| Zitat: |
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
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?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Beispiel ElternForm
.... public procedure ChildFormClose(Sender: TObject; var Action: TCloseAction);
end;
var Form_Eltern: TForm_Eltern; FormList : array[1..10] of TForm;
implementation
uses ChildForm; |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Beispiel ChildForm ....
public
end;
var Form_Child: TForm_Child;
implementation
|
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
Delphi-Quelltext 1:
| Formbsp := TForm_Child.create(NIL); |
erzeugt habe, übernehme ich doch IMHO selbst die Verantwortung es korrekt zu zerstoeren was ich erstelle.
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm_Child.Tbt_SchliessenClick(Sender: TObject); 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 27.05.09 16:24
Du kannst selbst deinen Handler aufrufen: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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)
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
|
|