Entwickler-Ecke
Sonstiges (Delphi) - mdichild
palama - Di 16.07.02 21:41
Titel: mdichild
hab nur ne kleine frage:
ich habe eine mdiform und zwei mdichild.
das 2. "child" möchte ich nun, während das programm ausgeführt wird,
komplett dublizieren, mit allen funktionen, buttons ect., und diese neuen formen ansprechen können.
außerdem habe ich in einem menü den punkt ansicht. dort möchte ich alle fenster, auch die neuen nach und nach, aufgelistet haben, so dass ich sie anwählen kann.
ich hoffe ihr könnt mir helfen :)
palama
Tino - Di 16.07.02 21:52
Titel: Re: mdichild
palama hat folgendes geschrieben: |
das 2. "child" möchte ich nun {...} komplett dublizieren, mit allen funktionen, buttons ect. |
Dafür brauchst Du einfach nur eine weiter Instanz von dem Form erstellen:
Quelltext
1: 2: 3: 4: 5: 6:
| Var NewForm: tForm2; // Hier das ChildForm angeben Begin NewForm := tForm2.Create (Application.MainForm); {...} End; |
palama hat folgendes geschrieben: |
dort möchte ich alle fenster, auch die neuen nach und nach, aufgelistet haben |
Das Hauptfenster (die anderen zwar auch aber die zählen nicht :-)) hat die Eigenschaft
MDIChildCount. Diese Eigenschaft gibt Dir die Anzahl Aktiver Child-Fenster zurück. Mit der Eigenschaft
MDIChildren hast Du Zugrif auf diese MDI-Child-Fenster.
Gruß
palama - Di 16.07.02 21:59
erstmal schönen dank :D
aber wie genau rufe ich denn dann die neuen fenster auf?
//form2[MDIChildren].show;
wird es wohl nicht sein, oder?
Klabautermann - Di 16.07.02 22:02
Hallo,
1. Du erzeugst ein Form wie jedes andere Objekt auch. Also durch auftrufen des Constructors:
Quelltext
1: 2: 3: 4: 5: 6:
| [...] VAR frm : tMyForm; begin frm := tMyForm.Create(self); [...] |
2. Du kannst das automatisieren indem du der Eifenschaft
WindowMenu des Hauptformulars ein Menü zuweist. Leider Funktioniert das nur bedingt. Dashalb verwende ich im OnClick des gewünschten Window Meuüs das hier:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TfrmMain.CreateWindowMenu; VAR NewMenu : tMenuItem; i : Integer; begin // Zuerst alte (fenster) einträge löschen FOR i := Fenster1.Count - 1 DOWNTO 0 DO IF Fenster1.Items[i].Tag = -99 THEN Fenster1.Delete(i); // Dann neue einfügen FOR i := 0 TO MDIChildCount - 1 DO BEGIN NewMenu := NewItem(IntToStr(i + 1) + '. ' + Self.MDIChildren[i].Caption, 0, FALSE, TRUE, MDIClick, 0, 'MDIChild_' + IntToStr(i)); NewMenu.Tag := -99; IF (ActiveMDIChild = MDIChildren[i]) THEN NewMenu.Checked := TRUE; Fenster1.Add(NewMenu); END; // Mit allen MDI Childs end; // CreateWindowMenu |
Gruß
Klabautermann
Tino - Di 16.07.02 22:05
palama hat folgendes geschrieben: |
aber wie genau rufe ich denn dann die neuen fenster auf? |
Wenn Du das Form erstellst (als Aufrufen des Constructors [s. o.]) dann erscheint das MDI Child Form von ganz allein. Also kein Show etc!
Gruß
palama - Di 16.07.02 22:17
ich bin mir noch nicht ganz sicher ob ich das verstanden habe...
schließlich möchte ich ja auch nach dem erstellen wieder und wieder die formen wechseln.
also sobald ich die formen erstellt habe, (frm := tMyForm...) lade ich sie in das menü.
aber kann ich die denn dann wirklich einzeln ansprechen? sind die fenster dann arrays?
wie genau funzt der wechsel? :(
Klabautermann - Di 16.07.02 22:18
Hallo noch mal.
ich habe noch etwas vergessen. In dem Beispiel zum erstellen eines fenster Menüs wir jeder der Dynamisch erstellten Menüeinträge mit einer OnClick Procedure versehen. Diese sorgt dafür, dass das entsprechende Fenster in den vordergrund geholt wird wenn du drauf clickst.
Der Code für diese sieht so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TfrmMain.MDIClick(Sender: TObject); VAR pPos : Integer; aMenu : tMenuItem; Val : Integer; begin IF NOT (Sender IS tMenuItem) THEN Exit; aMenu := tMenuItem(Sender); pPos := Pos('.', aMenu.Caption); Val := StrToInt(Copy(aMenu.Caption, 1, pPos - 1)); MDIChildren[Val - 1].Show; end; // MDI Click |
Natürlich musst du sie auch deklarieren:
Quelltext
1: 2:
| private procedure MDIClick(Sender: TObject); |
Gruß
Klabautermann
palama - Di 16.07.02 22:21
ok, ich glaube jetzt hab ichs :D
danke nochmal!
Klabautermann - Di 16.07.02 22:26
palama hat folgendes geschrieben: |
schließlich möchte ich ja auch nach dem erstellen wieder und wieder die formen wechseln.
|
Wenn du dein Hauptformular auf
FormStyle := fsMDIForm stehen hast und sämtlichen hier geposteten Code zu diesem hinzufügst. Dann erscheinen die Fenster wie du es von MDI -Anwendungen gewöhnt bist. Du kannst sie vergrößern, verkleinern und verschieben.
palama hat folgendes geschrieben: |
also sobald ich die formen erstellt habe, (frm := tMyForm...) lade ich sie in das menü. |
Nein, du lädst sie nur in das Menü wenn dieses Aufgeklappt wird, denn was drinsteht wenn es sich keiner anguckt ist ja egal.
palama hat folgendes geschrieben: |
aber kann ich die denn dann wirklich einzeln ansprechen? sind die fenster dann arrays? |
Die Kindfenster (müssen MDI-Childs sein) werden automatisch beim erzeugen in einem Array des Hauptformulars mitgefühtrt. Dieses heißt
MDIChildren. Im praktischen Einsatz kannst du es in meinem letzten Posting sehen ;).
palama hat folgendes geschrieben: |
wie genau funzt der wechsel? :( |
Wie gesagt der "normale" wechsel mit der maus geht automatisch. Der wechsel im Quelltext wird über
gemacht.
Gruß
Klabautermann
palama - Di 16.07.02 22:51
@ Klabautermann: kann ich dir ne zip an die email mit dem prog auf deiner webpage schicken? hab da noch ne frage?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!