Autor Beitrag
palama
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 16.07.02 21:41 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 16.07.02 21:52 
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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 16.07.02 22:02 
Hallo,

1. Du erzeugst ein Form wie jedes andere Objekt auch. Also durch auftrufen des Constructors:
ausblenden 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:

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 (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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:
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


Natürlich musst du sie auch deklarieren:
ausblenden Quelltext
1:
2:
private
  procedure MDIClick(Sender: TObject);


Gruß
Klabautermann
palama Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 16.07.02 22:21 
ok, ich glaube jetzt hab ichs :D

danke nochmal!
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: 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
ausblenden Quelltext
1:
MDIChildren[X].Show					

gemacht.

Gruß
Klabautermann
palama Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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?