![]() |
Delphi-Version: 5
ColorDialog mit OnChange gesucht
Hallo,
ich möchte gerne das der Benutzer diverse Farbeinstellungen vornehmen kann, nun funktioniert das auch gut über TColordialog. Noch schöner wäre es, wenn der Benutzer seine Änderung schon innerhalb des Dialogs sehen könnte aber es scheint kein OnChange Event zu geben. Ich hab versucht über einen Timer die ColorDialog.Color dauernd abzufragen aber die scheint sich erst bei .execute zu ändern. Es ist halt lästig das der Benutzer den Dialog erst schließen muss um das Ergebnis zu beurteilen, dann gefällt die Farbe nicht, wieder öffnen, wieder schliessen usw.. Kennt jemand eine alternative oder kann man das OnChange Event irgendwie an einen TColorDialog dranbasteln? Danke! |
AW: ColorDialog mit OnChange gesucht
Erstmal must du nachsehn, ob es dafür irgendwas gibt.
Hier die vom TColorDialog gekapselte WinAPI ![]() und da deren Callback ![]() Es gibt kein wirkliches Event in TColorDialog, für diesen Callback. (in Dialogs.pas) Man könnte jetzt die API hooken.
Delphi-Quellcode:
(CommDlg.pas)
function ChooseColor(var CC: TChooseColor): Bool; stdcall;
[add] schau mal, was du mit Überschreiben solcher Events machen kannst, wenn du den TColorDialog ableitest und um sowas erweiterst. :stupid:
Delphi-Quellcode:
[/add]
procedure DefaultHandler(var Message); override;
function MessageHook(var Msg: TMessage): Boolean; override; procedure WMInitDialog(var Message: TWMInitDialog); message WM_INITDIALOG; Oder du überschreibst
Delphi-Quellcode:
.
function TCommonDialog.TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool;
Darin ist DialogData ein TChooseColor (tagCHOOSECOLORA), in welchem der Callback ausgetauscht werden könnte. Geheimer und nicht öffentlich zugänglicher Original-Callback (Dialogs.pas > Implementation)
Delphi-Quellcode:
Also eigenes Event schreiben, den Originalcode kopieren, (wenn gefunden) noch die eigenen Behandlungen da rein und letztendlich in DialogData den eigenen Callback eintragen.
function DialogHook(Wnd: HWnd; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT_PTR; stdcall;
begin Result := 0; if Msg = WM_INITDIALOG then begin CenterWindow(Wnd); CreationControl.FHandle := Wnd; CreationControl.FDefWndProc := Pointer(SetWindowLong(Wnd, GWL_WNDPROC, IntPtr(CreationControl.FObjectInstance))); CallWindowProc(CreationControl.FObjectInstance, Wnd, Msg, WParam, LParam); CreationControl := nil; end; end; Dann gibt es bestimmt auch Color-Dialoge von drittanwendern, wo deine gewünschte Funktion drin ist. Und die beste letzte Lösung: an ![]() |
AW: ColorDialog mit OnChange gesucht
Liste der Anhänge anzeigen (Anzahl: 1)
Versuch's mal hiermit
|
AW: ColorDialog mit OnChange gesucht
Zitat:
VIELEN DANK! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 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