Hallo,
1. du kannst im Hauptfom einfach das WindowMenu festlegen. Dies ist ein Property, welches du über den Objekt-Inspektor festlegen kannst. In älteren Versionen (D5) war dies aber fehlerhaft (ich habe mal gehört, das es jetzt ginge, habe es aber nicht überprüft), so das beim Ersten öffnen keine MDI-Childs angezeigt werden auch wenn diese vohanden sind.
Deshalb rufe ich z.B. in meinem Mail Programm folgende Methode im OnClick-Ereignis des Fenstermenüs auf:
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 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 |
Hierbei ist
Fenster1 das Fenstermenü. Alle Menüpunkte die ein MDI-Child representieren werden mit dem Wert -99 im Tag gekennzeichnet, so das nur diese Entfernt werden und alle anderen Menüpunkte (z.B. Nebeneinander anordnen) unberürt bleiben.
Alle Fenstereinträge werden mit der OnClick Methode MDIClick versehen, welche so aussieht:
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 |
Diese sorgt einfach dafür, das das gewählte fenster wieder Angezeigt/Nach vorne Geholt wird.
Gruß
Klabautermann