Autor Beitrag
Stephan Menke
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 06.03.03 09:43 
Hallo, ich hab da mal ne Frage:
Wie realisiere ich so eine wunderschöne Auflistung der activen MDIChilds in meiner Anwendung? (Siehe MS-Word Menü: Fenster).
Ich habs mit schleifen versucht, mir dem Direkten eintragen in das MainMenu, aber nichts geht so wirklich sauber. Auserdem habe ich immer das Problem, wie sage ich dem neuen Menueintrag das er beim klicken nicht irgend ein MDIChild Fokusieren soll sonder ein ihm zugewiesenes.

Vileicht kann mir einer von euch nen Tipp geben, währe sehr dankbar dafür.

Danke fürs Lesne meines Problems, euer
Stephan
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 06.03.03 10:06 
Hallo,

erstell einfach ein Menüpunkt welche als Untermenüpunkte Deine MDI-Child-Forms enthalten soll. Also zum Beispiel ein Menüpunkt mit der Bezeichnung Fenster. Dann verlinkst Du die Eingeschaft WindowMenu der MainForm mit dem entsprechenden MenuItem und schon sollte es funktionieren.

Gruß
TINO
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 06.03.03 10:07 
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:
ausblenden 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:
ausblenden 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
Stephan Menke Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 07.03.03 08:43 
Titel: Super, danke...
Hi, ich hab beides ausprobiert und es geht beides nich so gantz.

Das mit dem Proprty ghet wie bereits erwähnt wurde im Grunde beim ersten aufrufen garnicht.

Das Zweite geht zwar, hat aber noch einen Fehler in der Zuweisung der Cilds zu den Buttons. Ich bekomme z.B. bei dem Button/Menüeintrag der für Child eins zuständig ist ein ganz anderes Child und der erste Fenster Menüeintrag geht garnicht.

Ich glaube aber das ligt daran, das die Liste der MDIChilds keinen konstanten Index hat. Denn das active MDIChild bekommt immer den Index "0", da es an den anfang der Liste gesetzt wird (laut Hilfe von D7).

Aber ich hab dennoch mit beiden hinbekommen *g*. Ich habe das Property zugewiesen und einfach in einer Schleife den Tag der Childsgesetzt, damit das Property aktiv wird *g*.
Das is echt ne sache mit diesem WindowMenu.

Danke für die Hilfe!

Stephan Menke
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 07.03.03 15:41 
Ähm, hab dazu auch noch ne Frage:

Wie macht man das dann mit einer ActionMainMenuBar? ich krieg das mit den ActionClients irgendwie net gebacken.... :(

Gruß
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 07.03.03 17:26 
Hallo,

das ActionMainMenu ist meiner Meinung nach für MDI Anwendungen total ungeeignet.
Er verdeckt die Systembuttons des MDI-Childs und ermöglicht es nciht Menüpunkte des MDI-Childs in das Hauptmenü zu integrieren.

Wenn dich das nciht stört, kannst du dich sicherlich an meinem Code Orientieren, musst aber wohl noch Actions Dynamisch erzeugen bevor du sie im Menu hinzufügen kannst. Genau kann ich dir das aber auch nicht sagen, da ich mich von der Komponente habe abschrecken lassen.

Gruß
Klabautermann