2017-11-07 6 views
2

Erstellen einer Delphi VCL Forms-Anwendung und stellen 2 TButton und ein TApplicationEvents auf dem Formular:FindDragTarget erkennt nicht deaktiviert Kontrollen

enter image description here

Dann legen Sie diese Ereignis-Handler:

unit Unit2; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.AppEvnts; 

type 
    TForm2 = class(TForm) 
    Button1: TButton; 
    Button2: TButton; 
    ApplicationEvents1: TApplicationEvents; 
    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form2: TForm2; 

implementation 

{$R *.dfm} 

procedure TForm2.Button1Click(Sender: TObject); 
begin 
    Screen.Cursor := crHelp; 
end; 

procedure TForm2.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); 
var 
    Target: TControl; 
    Point: TPoint; 
begin 
    if Msg.Message = WM_LBUTTONDOWN then 
    begin 
    if Screen.Cursor = crHelp then 
    begin 
     Screen.Cursor := crDefault; 
     Handled := True; 
     GetCursorPos(Point); 
     Target := FindDragTarget(Point, True); 
     if Assigned(Target) then 
     ShowMessage(Target.Name) 
     else 
     ShowMessage(IntToStr(Point.X) + ', ' + IntToStr(Point.Y)); 
    end; 
    end; 
end; 

end. 

Jetzt Klicken Sie auf Button1, um den Mauszeiger auf crHelp zu ändern. Klicken Sie erneut auf Button1, die korrekt den Namen "Button1" zeigt.

Klicken Sie erneut auf Button1, um den Mauszeiger erneut auf crHelp zu ändern.

Klicken Sie dann auf der untauglichen Button2: Sie können das jetzt sehen FindDragTarget die deaktivierte Steuerung nicht erkannt hat, obwohl das Argument AllowDisabled-True gesetzt.

Wie kann ich ein deaktiviertes Steuerelement mit einem Mausklick erkennen?

Delphi 10.1.2

Antwort

5

Das "Problem" (das eigentlich ist konstruktionsbedingt) ist, dass die FindDragTarget Funktion nicht für behinderte Kinder Windowed Kontrollen überprüft.

function FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean): TControl; 
var 
    Window: TWinControl; 
    Control: TControl; 
begin 
    ... 
    Control := Window.ControlAtPos(Window.ScreenToClient(Pos), AllowDisabled); 
    ... 
end; 

Beachten Sie, dass Window.ControlAtPos nur AllowDisabled Argument geht aber nicht die AllowWinControls (die False Standardeinstellung).

FindDragTarget findet nur untergeordnete TGraphicControl Nachkommensteuerelemente (die ihren übergeordneten Handle verwenden).

können Sie diese Funktion statt:

function FindDragTargetEx(const Pos: TPoint; AllowDisabled: Boolean; AllowWinControls: Boolean): TControl; 
var 
    Window: TWinControl; 
    Control: TControl; 
begin 
    Result := nil; 
    Window := FindVCLWindow(Pos); 
    if Window <> nil then 
    begin 
    Result := Window; 
    Control := Window.ControlAtPos(Window.ScreenToClient(Pos), AllowDisabled, AllowWinControls); 
    if Control <> nil then Result := Control; 
    end; 
end; 
+0

Vielen Dank! – user1580348

+0

Gern geschehen :) – kobik