Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - drag/drop mouseover


whitef - Sa 16.03.13 03:36
Titel: drag/drop mouseover
hi,
irgendwie klappt bei mir ein einfaches imagewechsel nicht, wenn ich ein drag ausführe.

testweise hier eine einfach rückmeldung mittels showmessage //welches nicht ausgelöst wird!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
uses
ShellApi;
...
  private
    Procedure WMDROPFILES (Var aMsg: tMessage);  message WM_DROPFILES;
...
Procedure TForm1.WMDROPFILES (Var aMsg: tMessage);
...
procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
showmessage('test');
//image1.visible := False;
//image2.visible := True;
end;


Form1.DragKind := dkDrag;
Form1.DragMode := dmManual;

Irgendwie steh ich gerade auf dem Schlauch...


bummi - Sa 16.03.13 08:27

Nachdem Du verwendest unterstelle ich, dass es bei dem Post um Drag&Drop aus dem Explorer geht


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
type
  TForm2 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
        procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation
uses ShellAPI;
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
end;

procedure TForm2.WMDropFiles(var Msg: TWMDropFiles);
var
  CFileName: array [0 .. MAX_PATH] of Char;
  FileName:String;
  i,DroppedFileCount:Cardinal;
begin
  try
   DroppedFileCount := DragQueryFile(Msg.Drop, $FFFFFFFFnil0);
   for I := 0 to DroppedFileCount - 1 do
      begin
        SetLength(FileName,  DragQueryFile(Msg.Drop, i, nil0));
        DragQueryFile(Msg.Drop, i, PChar(FileName), Length(FileName) +1 );
        Memo1.Lines.Add(FileName);
      end;
  finally
    Msg.Result := 0;
    DragFinish(Msg.Drop)
  end
end;


Andreas L. - Sa 16.03.13 08:43

Falls du Drag 'n' Drop während dem Ausführen aus der IDE testen möchtest (debugging): Bei mir funktionieren diverse DragDrop-Codes als auch Komponenten* nur wenn die IDE nicht mit Adminrechten gestartet wurde. (RAD Studio 2009 Pro / Win Vista)

* = Die Drag and Drop Component Suite [http://melander.dk/delphi/dragdrop] von Andres Melander ist sehr zu empfehlen :wink:


whitef - Sa 16.03.13 19:47

danke für die rückmeldungen.
richtig, ich versuche aus dem explorer dateien auf meine form zu ziehen.

mir fehlt nur das OnDrag Ereignis was jedoch nicht ausgelöst wird.
Das Symbol beim drag wird angezeigt, jedoch kommt kein "showmessage".

Eine extra komponente wollte ich nun ungern hierfür einsetzen müssen, aber danke für die anregung!


bummi - So 17.03.13 10:28

Wenn Du mehr brauchst wirst Du in eigene Komponenten IDropTarget implementieren müssen, oder eine Komponente schreiben die es beinhaltet und der eine Komponenten zugewiesen wird. Spätesten hier machst es Sinn, wie von Andreas L. empfohlen, auf die erprobten Komponenten von Andres Melander zurückzugreifen.