Autor Beitrag
Softchaos67
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 103

XP Prof
Delphi 7
BeitragVerfasst: Mo 04.10.04 12:03 
Hallo NG,
ich brauche mal eure Hilfe.
Folgender Source funktioniert prächtig:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
procedure TfrmMenue.CreateDelphiForm(FormName: String);
var
  str              :String;
  curs            : TCursor;
  frm             :TForm;
  i               :integer;
begin
   curs := Screen.Cursor;
   Screen.Cursor := crHourGlass;
  try

     UnMergeMenue;
     str := GetFileNameWithoutExt(FormName);
//     frm := TForm.Create(Self);
     frm := GoToForm.GetForm(str);
     i :=ProgFound(frm.Caption);
     if i = -1 then begin
        if assigned(frm) then begin
           frm.Align := alClient;
           frm.ManualDock(PageControl1);
           Panel1.Width := 1;
           frm.Show;
           PageControl1.ActivePage := PageControl1.Pages[PageControl1.PageCount-1];
           PageControl1.ActivePage.Name :=TextNoBlanks(frm.Caption);
           MakeMenue(frm,PageControl1.ActivePage.Name);
        end;
     end else begin
        PageControl1.ActivePage := PageControl1.Pages[i];
        MergeMenue;
     end;
   finally
     Screen.Cursor := curs;
  end;

end;

Beim close jeder so erzeugten Form habe ich folgendes gcoded:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
  try
     Hide;
     ManualFloat(rect(ClientToScreen(Point(Left,Top)).X,ClientToScreen(Point(Left,Top)).Y,Width,Height));
  except
  end;
  inherited;

Klappt soweit auch.
Jetzt das Problem.
Ich will in einer Schleife alle so erzeugten Formulare schlißen.
Habe folgendes probiert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TfrmMenue.CloseAllApps;
var
   i :integer;
begin
   for i := 0 to PageControl1.PageCount-1 do begin
//     (PageControl1.DockClients[i] AS TForm).Close;
//      PostMessage(PageControl1.Pages[i].Handle, WM_CLOSE, 0, 0);
   end;

end;

Die auskommentierten Teile führen nicht zum gewünschten ergebniss.
Ich muss die OnClose der so erzeugten Formulare auf dem Tabsheet erreichen.
Wie geht das ??
Danke für eure Beiträge
Gruss Matthias
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 04.10.04 17:20 
Du solltest einfach ein dynamisches Handle-Array global definieren, das beim Erzeugen der Formulare deren Handles bekommt.

Dann kannst du das Array durchgehen und an alle Handles WM_CLOSE oder natürlich auch was anderes senden.

Ne elegantere Möglichkeit will ich jetzt nicht suchen ;-)
Böser Borstel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154



BeitragVerfasst: Di 05.10.04 09:25 
Wenn frm in CreateDelphiForm eine private Variable ist kannst du diese in anderen Funktionen und Methoden nicht ansprechen.
Deklariere mal frm private für deine HauptForm.
Softchaos67 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 103

XP Prof
Delphi 7
BeitragVerfasst: Di 05.10.04 11:10 
@Böser Borstel
frm ist nur ein Zeiger auf ein Form. Das Create passiert woanders.
Wie du siehst gibt es keinen Create in dieser Prozedur, klappt aber ganz prima.
Softchaos67 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 103

XP Prof
Delphi 7
BeitragVerfasst: Di 05.10.04 11:16 
@Jaenicke
Schade, ich wäre an ner eleganten Lösung schon interessiert.
Das mit dem Zeigerarray hab ich mir auch schon überlegt. Dabei bin ich auf DockClients[] und DockClientsCount gestossen.
Das wäre eigentlich die Lösung. Das funktioniert wenn man DockSite des PageControls auf True setzt.
Ich kann dann mit
ausblenden Delphi-Quelltext
1:
(PageControl.DockClients[i] as TMyForm).close					

aufrufen. Das ist genial.
Leider kann ich die einzelnen Tabs des Pagecontrol nicht mehr mit der Maus umschalten, sobald DockSite des Pagecontrol den wert True bekommt. Ich bekomme jetzt leider die Meldung:
"Ein Formular kann nicht gezogen werden", was ich in diesem Zusammenhang absolut nicht verstehe.
Hast du vielleicht eine Idee? Oder jemand anderes? Bin für alles dankbar!
Gruss
Matthias
Böser Borstel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154



BeitragVerfasst: Di 05.10.04 15:26 
vielleicht geht

ausblenden Quelltext
1:
2:
3:
for i := 0 to PageControl1.ComponentCount - 1 do
  if PageControl1.Components[i] is TForm then
    TForm(PageControl1.Component[i]).Close;


ist ungetestet da nicht alle funktionen bzw. methoden im post enthalten sind, die verwendet werden
Softchaos67 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 103

XP Prof
Delphi 7
BeitragVerfasst: Di 05.10.04 16:56 
@Böser Brösel
Das liefert nur ne ungültige Typumwandlung
TComponent->TForm
geht also nicht...
trotzdem Danke
Ich habs jetzt mit ner ObjectList gelöst, funktioniert hervorragend!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TfrmMenue.CloseAllApps;
var
   i :integer;
begin
   for i := 0 to FormList.Count-1 do begin
     if assigned(FormList.Items[i]as TForm)then
     try
        (FormList.Items[i]as TForm).Close;        // Ruft die Close-Methode aller angedockten Formulare auf
     except
     end;
   end;
   FormList.Free;
end;

und vorher :
ausblenden Delphi-Quelltext
1:
2:
       FormList.Add(frm);   //hier wird das Form zugefügt
       frm.ManualDock(pcIkaMain);

Im Create der Form erzeuge ich die ObjectList, im Destroy wird sie freigegeben...e voila
So wollt ichs haben.
Ich kann jetzt mittels TypeCaste auf alle Formulare zugreifen, obwohl meine Mainform nicht eins davon kennt :P
Gruss
Matthias