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

Quelltext
1:
MDIChildren[X].Show                    

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?