Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   ColorDialog mit OnChange gesucht (https://www.delphipraxis.net/184132-colordialog-mit-onchange-gesucht.html)

Nelphin 1. Mär 2015 07:41

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!

himitsu 1. Mär 2015 10:15

AW: ColorDialog mit OnChange gesucht
 
Erstmal must du nachsehn, ob es dafür irgendwas gibt.
Hier die vom TColorDialog gekapselte WinAPI https://msdn.microsoft.com/de-de/lib.../ms646912.aspx
und da deren Callback https://msdn.microsoft.com/de-de/lib.../ms646908.aspx .

Es gibt kein wirkliches Event in TColorDialog, für diesen Callback. (in Dialogs.pas)
Man könnte jetzt die API hooken.
Delphi-Quellcode:
function ChooseColor(var CC: TChooseColor): Bool; stdcall;
(CommDlg.pas)

[add]
schau mal, was du mit Überschreiben solcher Events machen kannst, wenn du den TColorDialog ableitest und um sowas erweiterst. :stupid:
Delphi-Quellcode:
procedure DefaultHandler(var Message); override;
function MessageHook(var Msg: TMessage): Boolean; override;
procedure WMInitDialog(var Message: TWMInitDialog); message WM_INITDIALOG;
[/add]

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:
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;
Also eigenes Event schreiben, den Originalcode kopieren, (wenn gefunden) noch die eigenen Behandlungen da rein und letztendlich in DialogData den eigenen Callback eintragen.



Dann gibt es bestimmt auch Color-Dialoge von drittanwendern, wo deine gewünschte Funktion drin ist.

Und die beste letzte Lösung: an http://quality.embarcadero.com/ wenden, den "Fehler"/Featurerequest melden, warten bis es eingebaut wurde und dann XE8, XE9 oder XE10 kaufen.

Sailor 1. Mär 2015 11:06

AW: ColorDialog mit OnChange gesucht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Versuch's mal hiermit

Nelphin 1. Mär 2015 13:00

AW: ColorDialog mit OnChange gesucht
 
Zitat:

Zitat von Sailor (Beitrag 1291904)
Versuch's mal hiermit

Super, ich hab mir das eben kurz angeschaut und ich denke daraus kann ich mir basteln was ich gesucht habe!

VIELEN DANK!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr.

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