![]() |
AW: Laufzeit-Themes verwenden
Hallo zusammen,
das Problem bzw. die Ursache ist gefunden: Delphi-Fehler oder VCL-Fehler. Es passiert folgendermaßen: wenn im Formularereignis "OnPaint" oder "OnActivate" externe Aktionen durchgeführt werden, die sich nicht auf das Formular selbst beziehen, dann werden wohl irgendwelche VCL-Ereignisse/Messages nicht mehr korrekt abgearbeitet. Hintergrund-Info: ich habe mehrere MDI-Anwendungen (ich weiß, MDI wird nicht mehr gerne gesehen, es ist aber aus Anwendersicht oftmals eine sehr elegante Angelegenheit) und dann passiert es zwangsläufig, dass beim Anzeigen einer Form neben den sonstigen Initialisierungen/Größenanpassungen usw. auch mal ein Datenbankzugriff erforderlich ist. Z.B. muss ich Filter/Ranges entfernen oder setzen. Bei modalen Fenstern könnte man das alles in "OnCreate" abarbeiten, nicht so bei MDI-Fenstern. Da ist es fast der Normalfall, dass ein und dieselbe Datenbank mit unterschiedlichen Anzeigekriterien (Filtern, Ranges) in mehreren Fenstern zur Anzeige kommt. Also braucht man OnPaint und OnActivate. Sind Laufzeit-Themes deaktiviert, klappt das auch alles einwandfrei. Nicht jedoch, wenn Lauffzeit-Themes aktiviert sind, und wenn die aufgerufenen Ereignisse "länger dauern", CPU-Zeit beanspruchen, Datenbank-Aktionen durchführen, oder was auch immer der Auslöser ist. Hab ein paar Stunden mit dem Debugger verbraten, aber kann es nicht eingrenzen. Lösung des Problems: strikte Trennung von Aktionen die nur das Formular betreffen und schnell abgearbeitet sind (da funktioniert OnPaint und OnActivate) und alles Andere aufgeteilt in "OnCreate" und "OnActivate". Hab es also prinzipiell so gelöst:
Delphi-Quellcode:
Nochmals vielen Dank für eure Anregungen.
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private-Deklarationen } FFirstActivate: boolean; public { Public-Deklarationen } procedure InitDefaults(FirstActivate: boolean); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FFirstActivate := true; InitDefaults(FFirstActivate); end; procedure TForm1.FormActivate(Sender: TObject); begin if FirstActivate then FirstActivate := false else InitDefaults(false); end; procedure TForm1.InitDefaults(FirstActivate: boolean); begin if FirstActivate then begin ... end; ... end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 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