![]() |
MDI Client form visible=false bleibt nicht
Hallo Zusammen,
sorry für den blöden Titel. Es ist etwa kompliziert das Problem zu beschreiben und muss deshalb leider etwas ausholen. [Edit] Das Problem vorab: Wenn ein MDI child Form das Property visible=false gesetzt wird, bleibt false nur solange das Form nicht erneu geöffnet wird. Wird es neu geöffnet, ist visible wieder auf true. Ich habe eine MDI Anwendung mit XE2 geschrieben. Mir ist bekannt dass MDI Client forms visible=true sind. Ich habe einen Fall indem ich die gleiche Form als MDI child oder als modale form benötige. Als Beispiel das Adressenform. Unter Stammdaten öffne ich die Form als MDI child. Wenn ich jedoch eine Rechnung erstelle und möchte auf das Adressenform zugreifen um eine Adresse auszuwählen bzw. eine neue anlegen und Übernehmen, wir die AdressenForm modal geöffnet. Die gleiche Form also einmal MDI und einmal als modales Fenster. Dieses Scenario funktionierte mit Delphi5 einwandfrei. Unter Delphi XE2 nicht mehr so einfach. Das Problem ist, wenn das AdressenForm.visible=true oder false ist, kann ich die Form als MDI child öffnen. Wenn ich eine neue Instanz erzeugen und das Form direkt nach dem erzeugen auf visible=false Setze, wird das Form nach dem erzeugen erzeugt, angezeigt, wieder unsichbar gemacht und durch ShowModal erneut angezeigt. Somit flackert die Form. Ich muss das Form auf visible=false setzen damit ShowModal funktioniert. ShowModal erwartet visible=false. Wenn ich die Form über den Inspektor auf visible=False setze und das Form so speichere funktioniert alles einwandfrei. Sobald ich das Form in Delphi öffne, wird das Property automatisch auf visible=True gesetzt. Wenn ich es bemerke, ist alles gut. Denke ich nicht daran, und stelle visible=false flackert die Form beim Öffnen. Das könnte ein Delphi Bug oder sogar auch so gewollt sein. Wie gesagt, unter Delphi5 ist dieses Verhalten nicht zu beobachten. Kennt jemand dieses Problem? Gruß Kostas |
AW: MDI Client form visible=false bleibt nicht
Delphi-Quellcode:
unit MDI_Auch_Fuer_Modal;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMDIForm_Auch_Fuer_Modal = class(TForm) Button1: TButton; private { Private-Deklarationen } protected procedure DoCreate; override; public { Public-Deklarationen } Constructor Create(Aowner:TComponent;aFormStyle:TFormStyle);overload; end; var MDIForm_Auch_Fuer_Modal: TMDIForm_Auch_Fuer_Modal; implementation {$R *.dfm} { TForm2 } constructor TMDIForm_Auch_Fuer_Modal.Create(Aowner: TComponent; aFormStyle: TFormStyle); begin inherited Create(Aowner); Formstyle := aFormStyle; end; procedure TMDIForm_Auch_Fuer_Modal.DoCreate; begin inherited; if Formstyle <> fsMDIChild then visible := false; end; { Aufrufbeispiele procedure TForm1.ShowAsMDIClick(Sender: TObject); begin TMDIForm_Auch_Fuer_Modal.Create(self); end; procedure TForm1.ShowModalClick(Sender: TObject); begin with TMDIForm_Auch_Fuer_Modal.Create(self,fsNormal) do begin Showmodal; Free; end; end; } end. |
AW: MDI Client form visible=false bleibt nicht
Besten Dank Thomas, werde ich gleich mal ausprobieren.
vom Gefühl her würde ich vermuten dass bei inherited Create(Aowner); das Form wieder erzeugt und gleich angezeigt wird. Ich bin gespannt. Gruß Kostas. |
AW: MDI Client form visible=false bleibt nicht
Hallo Thomas,
ich habe deine Variante eingebaut mit dem überscheiben des Constructors weil es besser ist als meine Variante. Das Flackern ist jedoch geblieben. Damit meine ich folgendes: Ich setze ein Brakpoint bei FormCreate und einen unter FormShow. Wenn das Form mit fsNormal erzeugt wird, wird aufgerufen: FormCreate, FormShow, FormShow. Setze ich beim Form das Property Visible:=false wird aufgerufen: FormCreate, FormShow. Aktuell ist es nur ein Schönheitsfehler. Es kann jedoch zum Problem werden wenn ich in FormShow Anweisungen stehen habe. Hast du eine Idee wie ich das in den Griff bekomme? [EDIT] HALT hat sich erledigt. So gehts:
Delphi-Quellcode:
Setzt ist es perfekt. Besten Dank Thomas.
procedure TfrmBaseChild.DoCreate;
begin if Formstyle <> fsMDIChild then visible := false else inherited; end; Gruß Kostas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz