Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Drag-and-Drop auf Frame-Komponente realisieren (https://www.delphipraxis.net/190817-drag-drop-auf-frame-komponente-realisieren.html)

Freyr77 10. Nov 2016 12:36

Delphi-Version: 10 Seattle

Drag-and-Drop auf Frame-Komponente realisieren
 
Hi.

Ich brauche in einem meiner Frames eine Drag-And-Drop Lösung, die mir ausschließlich den Pfad der "gedropten" Anwendung ausspuckt, damit ich diese anschließend im Grid verarbeiten lassen kann.

Leider funktioniert das einfach nicht. Auf einer normalen "Form" klappt das wunderbar, auf dem Frame wird mir immer das Verbotszeichen angezeigt wenn ich den Drop versuche.

Der Code der auf der Form funktioniert hat steht jetzt im Frame:

Delphi-Quellcode:
constructor TFrame1.Create(AOwner: TComponent);
begin
  inherited;
    DragAcceptFiles(Handle,True);
end;

procedure TFrame1.WMDROPFILES(var msg: TWMDropFiles);
const
  MAXFILENAME = 255;
var
  cnt, fileCount : integer;
  fileName : array [0..MAXFILENAME] of char;
begin
  // how many files dropped?
  fileCount := DragQueryFile(msg.Drop, $FFFFFFFF, fileName, MAXFILENAME) ;

  // query for file names
  for cnt := 0 to -1 + fileCount do
  begin
    DragQueryFile(msg.Drop, cnt, fileName, MAXFILENAME) ;

    //do something with the file(s)
    memo1.Lines.Insert(0, fileName) ;
  end;

  //release memory
  DragFinish(msg.Drop) ;
end;
... funktioniert aber nicht.

Jemand eine Ahnung? Google hat mir bisher auch nicht wirklich geholfen.:|

Uwe Raabe 10. Nov 2016 13:42

AW: Drag-and-Drop auf Frame-Komponente realisieren
 
Das DragAcceptFiles im Frame-Create kannst du weglassen. Das Form muss weiterhin das DropFiles übernehmen, kann aber die Message einfach an das Frame weiterreichen. Die Methode im Frame muss dann auch kein Message-Handler mehr sein.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle,True);
end;

procedure TForm1.WMDROPFILES(var Message: TWMDropFiles);
begin
  MyFrame1.HandleDropFiles(Message);
end;

procedure TMyFrame.HandleDropFiles(var Message: TWMDropFiles);
const
  MAXFILENAME = 255;
var
  cnt, fileCount : integer;
  fileName : array [0..MAXFILENAME] of char;
begin
  // how many files dropped?
  fileCount := DragQueryFile(Message.Drop, $FFFFFFFF, fileName, MAXFILENAME) ;

  // query for file names
  for cnt := 0 to -1 + fileCount do
  begin
    DragQueryFile(Message.Drop, cnt, fileName, MAXFILENAME) ;

    //do something with the file(s)
    memo1.Lines.Insert(0, fileName) ;
  end;

  //release memory
  DragFinish(Message.Drop) ;
end;

Freyr77 10. Nov 2016 14:26

AW: Drag-and-Drop auf Frame-Komponente realisieren
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1353262)
Das DragAcceptFiles im Frame-Create kannst du weglassen. Das Form muss weiterhin das DropFiles übernehmen, kann aber die Message einfach an das Frame weiterreichen. Die Methode im Frame muss dann auch kein Message-Handler mehr sein.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle,True);
end;

procedure TForm1.WMDROPFILES(var Message: TWMDropFiles);
begin
  MyFrame1.HandleDropFiles(Message);
end;

procedure TMyFrame.HandleDropFiles(var Message: TWMDropFiles);
const
  MAXFILENAME = 255;
var
  cnt, fileCount : integer;
  fileName : array [0..MAXFILENAME] of char;
begin
  // how many files dropped?
  fileCount := DragQueryFile(Message.Drop, $FFFFFFFF, fileName, MAXFILENAME) ;

  // query for file names
  for cnt := 0 to -1 + fileCount do
  begin
    DragQueryFile(Message.Drop, cnt, fileName, MAXFILENAME) ;

    //do something with the file(s)
    memo1.Lines.Insert(0, fileName) ;
  end;

  //release memory
  DragFinish(Message.Drop) ;
end;

Dankeschön :thumb:

Hab das jetzt auch ziemlich genau so gelöst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz