Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit Liste der geöffneten MDI-Child-Fenster (https://www.delphipraxis.net/64258-problem-mit-liste-der-geoeffneten-mdi-child-fenster.html)

hincapie 1. Mär 2006 15:18


Problem mit Liste der geöffneten MDI-Child-Fenster
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo,
bei mir raucht's mal wieder! :gruebel: :drunken:
Also, ich habe da einen Editor als MDI-Anwendung und möchte mir die göffneten Child-Fenster als TabSheets in einem PageControl anzeigen lassen.
Dazu nutze ich folgende Prozedur:
Delphi-Quellcode:
   
procedure TFrameForm.MakeChilds;
var
  i, c: integer;
begin
  i := 0;
  c := 0;
  for i := 0 to PageControl1.PageCount -1 do
     PageControl1.Pages[i].Free;
  for c:=0 to MDIChildCount -1 do
    with tTabSheet.Create(Self) do
    begin
      PageControl := PageControl1;
      caption := MDIChildren[c].caption;
    end;
  if MDIChildCount = 0 then CoolBar1.Height :=               Toolbar2.Height +4 
    else CoolBar1.Height := Toolbar2.Height + PageControl1.Height +8;
end;
Diese Prozedur rufe ich nun beim OnCreate des ChildFensters auf. Soweit so gut.
Bei zwei Childs funzt das auch, siehe Bild 'korrekt.jpg';
beim Öffnen des dritten Childs kommt's dann, siehe 'unkorrekt.jpg';
beim vierten ist dann wieder alles in Butter -> 'geht_wieder.jpg'.
Hat jemand eine halbwegs logische Erklärung dafür? :wiejetzt:

Ach ja, irgendwie muss ich noch auf das Beenden eines Childs reagieren, aber wie?
Beim OnDestroy mit o.g. Prozedur zählt immer noch das gerade geschlossene Fenster mit. :shock:

uwewo 1. Mär 2006 16:32

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Hallo,

das ist völlig klar, beim freigeben der PageControls gehst Du falsch herum vor.

Ändere Deine Schleife von

Delphi-Quellcode:
for i := 0 to PageControl1.PageCount -1 do
in

Delphi-Quellcode:
for i := PageControl1.PageCount -1 downto 0 do
und alles ist wunderbar.

Uwe

hincapie 2. Mär 2006 08:11

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
@ uwewo:
Es scheint wohl so, habe den Code umgestellt auf:
Delphi-Quellcode:
   for i := PageControl1.PageCount -1 downto 0 do
     PageControl1.Pages[i].Free;
Jetzt funktioniert es richtig! Danke für den Tipp!!

Hhm, nun brauche ich nur noch ne vernünftige Lösung für das Schliessen der Childs.
Mit dieser Schleife im OnDestroy oder OnClose des ChildFensters wird immer noch das eigentlich gerade geschlossene Fenster mit angezeigt.

Mavarik 2. Mär 2006 11:16

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Zitat:

Zitat von hincapie
Hhm, nun brauche ich nur noch ne vernünftige Lösung für das Schliessen der Childs.
Mit dieser Schleife im OnDestroy oder OnClose des ChildFensters wird immer noch das eigentlich gerade geschlossene Fenster mit angezeigt.

Wie wäre es, wenn Du den Pointer des gerade zu schliessenden Fensters mit an die Routine übergibst...

Dann kannst Du den abtesten und das Fenster ignorieren..

Frank :coder:

uwewo 2. Mär 2006 13:29

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Hi hincapie,

eigentlich finde ich es eh nicht so toll, daß Du jedesmal alle
PageControls entfernst und dann alle wieder erstellst.

Du kannst doch auch über den Index, einzelne bei Gelegenheit freigeben
und neue einfach hinzufügen.

Oder verstehe ich es nicht richtig.

Uwe

Mavarik 2. Mär 2006 13:59

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Zitat:

Zitat von uwewo
Hi Frank,

Ich? War nicht meine Idee!

hincapie 2. Mär 2006 15:03

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Zitat:

Zitat von Mavarik
Zitat:

Zitat von hincapie
Hhm, nun brauche ich nur noch ne vernünftige Lösung für das Schliessen der Childs.
Mit dieser Schleife im OnDestroy oder OnClose des ChildFensters wird immer noch das eigentlich gerade geschlossene Fenster mit angezeigt.

Wie wäre es, wenn Du den Pointer des gerade zu schliessenden Fensters mit an die Routine übergibst...

Dann kannst Du den abtesten und das Fenster ignorieren..

Frank :coder:

Hab noch nicht viel mit Pointern zu tun gehabt. :oops:
Wie sollte das denn Deiner Meinung nach aussehen? :?:

Flocke 2. Mär 2006 16:05

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Du kannst alternativ auch testen, ob das Fenster bald zerstört werden wird:
Delphi-Quellcode:
for c:=0 to MDIChildCount -1 do
  if not (csDestroying in MDIChildren[c].ComponentState) then
    with tTabSheet.Create(Self) do
    begin
      PageControl := PageControl1;
      caption := MDIChildren[c].caption;
    end;
Dann kannst du die Routine auch im OnDestroy der MDI-Fenster benutzen (wenn das Ereignis ausgelöst wird ist das Flag csDestroying schon gesetzt).

hincapie 2. Mär 2006 16:21

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
Zitat:

Zitat von Flocke
Du kannst alternativ auch testen, ob das Fenster bald zerstört werden wird:
Delphi-Quellcode:
for c:=0 to MDIChildCount -1 do
  if not (csDestroying in MDIChildren[c].ComponentState) then
    with tTabSheet.Create(Self) do
    begin
      PageControl := PageControl1;
      caption := MDIChildren[c].caption;
    end;
Dann kannst du die Routine auch im OnDestroy der MDI-Fenster benutzen (wenn das Ereignis ausgelöst wird ist das Flag csDestroying schon gesetzt).

Danke! Funzt!! :thumb: :zwinker:

hincapie 3. Mär 2006 09:44

Re: Problem mit Liste der geöffneten MDI-Child-Fenster
 
So, gleicher Kontext, neues Problem:

Ich möchte nun mit einem Klick auf das TabSheet das dazugehörige Child-Fenster in den Vordergrund bringen.
Diese Anweisung funktioniert nur bedingt:
Delphi-Quellcode:
procedure TFrameForm.PageControl1Change(Sender: TObject);
begin
  MdiChildren[PageControl1.ActivePageIndex].BringToFront;
end;
Beim ersten Klick wechselt nur die Reihenfolge der Tabsheets im PageControl, beim nächsten Klick wird erst das richtige Childfenster in den Vordergrund gebracht.
Hat jemand eine Erklärung dafür? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz