Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: ColorDialog mit OnChange gesucht

  Alt 1. Mär 2015, 11:15
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. 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.
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 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.
$2B or not $2B

Geändert von himitsu ( 1. Mär 2015 um 11:30 Uhr)
  Mit Zitat antworten Zitat