![]() |
Verwendung von TTitleBarPanel mit ModalPopupMode := pmAuto
Liste der Anhänge anzeigen (Anzahl: 1)
Bei der Verwendung von TTitleBarPanel in Forms, die mit ShowModal aufgerufen werden, ist mir ein merkwürdiges Verhalten aufgefallen. Wenn Application.ModalPopupMode := pmAuto gesetzt ist (was ja bei neueren Delphi-Anwendungen standardmäßig der Fall ist), wird die Custom Titlebar beim zweiten Aufruf des Fensters nicht über die normale Titlebar gezeichnet, sondern darunter, als wäre sie nicht richtig zugewiesen (siehe Anhang). Beim ersten Aufruf des Fensters sieht alles korrekt aus.
Reproduzieren lässt sich der Fehler mit zwei Forms und einer Titlebar in Form2. Die Titlebar wird über
Delphi-Quellcode:
und
CustomTitlebar.Control := TitleBarPanel1
Delphi-Quellcode:
in Form2 zugewiesen. Öffnet man über den Button in Form1 nun Form2, schließt Form2 wieder und öffnet es dann nochmal, tritt der Fehler wie auf dem Bild auf.
CustomTitlebar.Enabled := True
Wenn unter TForm2.FormActivate die API-Methode SetWindowPos mit dem Parameter SWP_FRAMECHANGED aufgerufen wird, tritt das Problem nicht mehr auf. In komplexeren Fenstern führt das aber zu einem unschönen Flackern. Gibt es einen eleganteren Weg, den Fehler zu umgehen oder handelt es sich dabei um einen Bug in Delphi? pmAuto führt generell an verschiedenen Stellen zu Problemen (siehe ![]()
Delphi-Quellcode:
program Project1;
uses Vcl.Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.ModalPopupMode := pmAuto; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.Run; end.
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Unit2; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Form2.ShowModal; end end.
Delphi-Quellcode:
unit Unit2;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.TitleBarCtrls; type TForm2 = class(TForm) TitleBarPanel1: TTitleBarPanel; procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } protected end; var Form2: TForm2; implementation {$R *.dfm} uses Unit1; procedure TForm2.FormActivate(Sender: TObject); begin SetWindowPos(Handle, 0, Left, Top, Width, Height, SWP_FRAMECHANGED); // Diese Zeile behebt das Problem end; end. |
AW: Verwendung von TTitleBarPanel mit ModalPopupMode := pmAuto
Zitat:
Delphi-Quellcode:
TFormXYZData ist dabei ein Objekt das die Daten enthält, die das Form anzeigen bzw. entgegennehmen soll. Man kann auch einen record verwenden, dann muß der Parameter für Execute aber ein Var-Parameter sein.
class function TFormXYZ.Execute(aFormdata: TFormXYZData): boolean;
var LInstance: TFormXYZ; begin LInstance := TFormXYZ.Create(nil); try LInstance.Initialize(aFormData); Result := LInstance.ShowModal := mrOK; if Result then LInstance.GetUserInput(aFormData); finally LInstance.Free; end; end; Auf diese Weise kommt man auch nicht in Versuchung, eine Form als Datenspeicher zu mißbrauchen. :wink: |
AW: Verwendung von TTitleBarPanel mit ModalPopupMode := pmAuto
Zitat:
Mit
Delphi-Quellcode:
im
SetWindowPos
Delphi-Quellcode:
funktioniert es schon besser, weil das Fenster ja noch nicht gezeigt wird. Das ist aber natürlich immer noch ein Hack, den ich eigentlich gerne anders lösen würde. Lässt sich das pmAuto vielleicht umgehen? Ich habe die Dokumentation allerdings schon so verstanden, dass das die "empfohlene" Variante ist. Aber wenn es tatsächlich ein Bug ist, muss es wahrscheinlich erstmal bei dem SetWindowPos-Workaround bleiben.
TForm2.FormShow
|
AW: Verwendung von TTitleBarPanel mit ModalPopupMode := pmAuto
Zitat:
Ansonsten bleibt nur, die verantwortliche Stelle im VCL-Kode zu suchen und zu fixen. Tritt das Problem auch in Delphi 11.x auf? Falls nicht würde ich die Änderungen am VCL-Kode für "moderneres" Erscheinungsbild von MDI-Anwendungen im Verdacht haben; da wurde einiges verschlimmbessert, was auch nicht-MDI Anwendungen torpedieren kann. |
AW: Verwendung von TTitleBarPanel mit ModalPopupMode := pmAuto
Zitat:
Code:
nicht nur global setzt sondern nochmal für jedes Fenster einzeln. Das ist etwas Aufwand, aber deutlich besser als der vorherige Hack. In der Zwischenzeit sind durch das globale
pmAuto
Code:
noch weitere Fehler aufgetreten, weil die Window Handles jedes Mal neu erzeugt werden (zB leere ComboBoxes, wenn die nicht bei jedem Form-Aufruf neu beschrieben werden).
pmAuto
In der Dokumentation zu PopupMode steht auch etwas dazu, das ich überlesen habe: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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 by Thomas Breitkreuz