Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: ColorDialog mit OnChange gesucht

  Alt 1. Mär 2015, 10: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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

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