2016-04-19 7 views
1

ich eine Drag ‚n Drop-Anwendung zu entwickeln, und ich fühle mich beunruhigt mit dem Standard DragCursor wenn Drag & Drop ein Element wie die folgenden Liste des Standard DragCursors:Delphi - Drag and Drop + MouseDown- + MouseUp

Default DragCursors

ich versuche also eine neue Art und Weise für den Benutzer finden Sie in den Drag ‚n Drop-Bewegung wie GMAIL zu entwickeln:

Gmail

Meine Frage ist: Gibt es die Möglichkeit, Drag & Drop-Ereignisse zusammen Mausereignisse in Delphi 7 zu verwenden?

enter image description here enter image description here

Wenn ich dmAutomatic in DragMode Fall funktioniert die MouseDown setzen nicht und wenn ich dmManual in DragMode setzen die MouseDown funktioniert gut, aber das DragDrop Ereignis funktioniert nicht.

Hier ist mein Code unten:

type 
    TForm1 = class(TForm) 
    pnlInformacaoDragDrop: TPanel; 
    pnl1: TPanel; 
    pnl2: TPanel; 
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    procedure pnl1DragDrop(Sender, Source: TObject; X, Y: Integer); 
    procedure pnl2DragDrop(Sender, Source: TObject; X, Y: Integer); 
    procedure pnl2DragOver(Sender, Source: TObject; X, Y: Integer; 
     State: TDragState; var Accept: Boolean); 
    procedure pnl1DragOver(Sender, Source: TObject; X, Y: Integer; 
     State: TDragState; var Accept: Boolean); 
    procedure pnl1MouseDown(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    procedure pnl1MouseUp(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    private 
    { Private declarations } 
    public 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

{ TForm1 } 

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
begin 
    if Assigned(Self) then 
    begin 
    if pnlInformacaoDragDrop.Visible then 
    begin 
     pnlInformacaoDragDrop.Left :=X + 10; 
     pnlInformacaoDragDrop.Top := Y + 10; 
    end; 
    end; 
end; 

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
    if Assigned(Self) then 
    begin 
    if not pnlInformacaoDragDrop.Visible then 
     pnlInformacaoDragDrop.Visible := True; 

// img1.BeginDrag(True); 
    end; 
end; 

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
    if Assigned(Self) then 
    begin 
    if pnlInformacaoDragDrop.Visible then 
     pnlInformacaoDragDrop.Visible := False; 
    end; 
end; 

procedure TForm1.pnl1DragDrop(Sender, Source: TObject; X, Y: Integer); 
begin 
    TPanel(Sender).Caption := TPanel(Sender).Caption + ' - ' + TPanel(Source).Caption; 
end; 

procedure TForm1.pnl2DragDrop(Sender, Source: TObject; X, Y: Integer); 
begin 
    TPanel(Sender).Caption := TPanel(Sender).Caption + ' - ' + TPanel(Source).Caption; 
end; 

procedure TForm1.pnl2DragOver(Sender, Source: TObject; X, Y: Integer; 
    State: TDragState; var Accept: Boolean); 
begin 
    Accept := true; 
end; 

procedure TForm1.pnl1DragOver(Sender, Source: TObject; X, Y: Integer; 
    State: TDragState; var Accept: Boolean); 
begin 
    Accept := true; 
end; 

Sorry für meine einfache Frage, aber ich weiß nicht, wie ich es tun kann ...

Vielen Dank!

Antwort

2

Sie können dmAutomatic verwenden und einen Handler für das Ereignis OnStartDrag anstelle der Mausereignisse schreiben, die Sie versuchten zu verwenden.

Von D7 Dokumentation:

Beschreibung

Verwenden Sie die OnStartDrag Event-Handler spezielle Verarbeitung zu implementieren, wenn der Benutzer das Steuerelement zu ziehen beginnt, oder ein Objekt enthält. OnStartDrag tritt nur auf, wenn DragKind dkDrag ist.

...

Der Handler OnStartDrag Ereignis kann eine TDragControlObjectEx Instanz erstellen für die Parameter, um den DragObject drag Cursor zu spezifizieren, oder, gegebenenfalls eine Drag-Bild-Liste.

1

Drag-n-Drop ist ein Modal Betrieb. Es wird notwendigerweise mit den Mausereignissen fliehen, während die Taste gedrückt ist, um die Ziehoperation zu bedienen.

In cmAutomatic weisen Sie die Komponente an, bei gedrückter linker Maustaste automatisch einen Drag-and-Drop-Vorgang zu starten. In dmManual müssen Sie den Ziehvorgang initiieren, indem Sie BeginDrag vom MouseDown-Ereignis aus aufrufen.

IOW, ohne die tatsächlichen Windows-Mausereignisse zu erfassen (WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP, usw.), wird der VCL Drag-n-Drop-Mechanismus die übergeordneten Mausereignisse verdecken. Sollten Sie jedoch entscheiden, diese Nachrichten direkt zu verarbeiten, werden Sie auch den Drag-and-Drop-Mechanismus unterbrechen. Ohne die Ereignisse und das Drag-and-Drop-Subsystem sorgfältig zu verwalten, können Sie die Dinge sehr schlecht verhalten.