Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Drag / Drop Tutorial (https://www.delphipraxis.net/105878-drag-drop-tutorial.html)

haentschman 1. Jan 2008 15:02


Drag / Drop Tutorial
 
... ein erfolgreiches neues Jahr euch allen... :cheer:


... mit der SuFu komme ich zu keinem vernünftigem Ergebnis... :(

:?: - wo finde ich ein Tutorial zu Drag / Drop.
:?: - wie funktioniert das prinzipiell (kein Code).

...ich möchte erst einmal verstehen wie das funktioniert... den Rest kriege ich schon. :-D

Danke... :hi:

DeddyH 1. Jan 2008 15:08

Re: Drag / Drop Tutorial
 
Vielleicht hilft Dir diese Seite erstmal weiter (englisch): http://www.blong.com/Conferences/Bor...dDrop/4114.htm

P.S.: Auch Dir ein frohes neues Jahr :-D :cheer: (dieser Smiley ist echt witzig)

MrKnogge 1. Jan 2008 15:11

Re: Drag / Drop Tutorial
 
Was möchtest du denn Dragen und Dropen ?

Wenn es um Dateien/Ordner vom Explorer zum Programm geht, so funktioniert es, in dem du auf die entsprechende Message von Windows reagierst und sie auswertest.

haentschman 1. Jan 2008 15:15

Re: Drag / Drop Tutorial
 
Dank für die schnelle Antwort...

... :cheer: ist wirklich :-D

... für den Anfang geht es erst einmal um Dateinamen vom Explorer in eine FileListBox.

...mit Englisch komme ich zwar einigermaßen zurecht, wenn es aber ans eingemachte geht...hört es auf.. :(

MrKnogge 1. Jan 2008 15:20

Re: Drag / Drop Tutorial
 
Dann bekommste jetzt einfach doch den Source :mrgreen: :

Delphi-Quellcode:
uses ShellApi;

...
type
 
  private
    { Private-Deklarationen }
    procedure WMDROPFILES (var Msg: TMessage); message WM_DROPFILES;

...

procedure TForm1.WMDROPFILES (var Msg: TMessage);
var
  i, anzahl, size: integer;
  Dateiname: PChar;
begin
  inherited;
  anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
  for i := 0 to (anzahl - 1) do
  begin
    size := DragQueryFile(Msg.WParam, i , nil, 0) + 1;
    Dateiname:= StrAlloc(size);
    DragQueryFile(Msg.WParam,i , Dateiname, size);
    ListBox1.items.add(StrPas(Dateiname));
    StrDispose(Dateiname);
  end;
  DragFinish(Msg.WParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Form1.Handle, true);
end;
Gruß

haentschman 1. Jan 2008 15:24

Re: Drag / Drop Tutorial
 
...vielen Dank.

dann mache ich jetzt mal Copy / Paste und schaue mir das mal in Ruhe an...

Danke... :hi:

haentschman 1. Jan 2008 16:07

Re: Drag / Drop Tutorial
 
... ich löcher Euch einfach mal... :-D

... das Beispiel funktioniert ja... aber warum :gruebel: :oops:


- nullterminierte Strings :gruebel:

... ich habe die Funktion mal angehalten und mir die verschiedenen Werte mal angeschaut. (auf manche kann ich nicht zugreifen)

Delphi-Quellcode:
anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
- die Anzahl repräsentiert ja die Menge der Dateinamen...aber wie wird die übergeben / wo versteckt ?


Delphi-Quellcode:
size := DragQueryFile(Msg.WParam, i , nil, 0) + 1;
- die Länge des Strings :gruebel:


Delphi-Quellcode:
DragQueryFile(Msg.WParam,i , Dateiname, size);
- der Dateiname zurück :gruebel:



...learning by doing ist manchmal ein Krampf... :oops:

Sorry...

Hawkeye219 1. Jan 2008 16:21

Re: Drag / Drop Tutorial
 
Hallo,

die Erklärung zu den benötigten Funktionen findest du bei Microsoft: DragAcceptFiles und DragQueryFile.

Ich habe die Routine von MrKnogge mal in eine handliche Funktion umgewandelt, dann kann man sie relativ einfach in mehreren Applikationen verwenden.

Delphi-Quellcode:
// uses ShellAPI

function GetFilesDropped (aHandle: THandle; aList: TStrings): Boolean;
var
  FileCount : Integer;
  Index    : Integer;
  Buffer   : array [0..MAX_PATH] of Char;
begin
  FileCount := DragQueryFile(aHandle, Cardinal(-1), nil, 0);
  aList.BeginUpdate;
  try
    for Index := 0 to FileCount - 1 do
      begin
        DragQueryFile(aHandle, Index, @Buffer, SizeOf(Buffer));
        aList.Add(Buffer);
      end;
  finally
    aList.EndUpdate;
  end;
  Result := (FileCount > 0);
end;

// in der Applikation:
type
  TForm1 = class (TForm)
    [...]
    procedure FormCreate (Sender: TObject);
  private
    procedure WMDropFiles (var aMsg: TMessage); message WM_DROPFILES;
  end;

procedure Form1.FormCreate (Sender: TObject);
begin
  DragAcceptFiles (Handle, True);
end;

procedure Form1.WMDropFiles (var aMsg: TMessage);
begin
  if GetFilesDropped(aMsg.WParam, ListBox.Items) then
    ShowMessage ('files dropped');
end;
Gruß Hawkeye

haentschman 1. Jan 2008 16:34

Re: Drag / Drop Tutorial
 
Danke...

Zitat:

die Erklärung zu den benötigten Funktionen findest du bei Microsoft: DragAcceptFiles und DragQueryFile.
...die Links waren gut. :thumb:

...jetzt ist mir einiges mit dem 'Return Value' viel klarer. :-D

- ich spiel dann mal ein bischen rum... kopieren per Drag/Drop etc.

Danke noch mal... :hi:

haentschman 2. Jan 2008 17:03

Re: Drag / Drop Tutorial
 
...aufwärm... :roll:

ich habe mal ein bischen rumgespielt...

und... :wiejetzt:

1. ShellApi eingebunden

2.
Delphi-Quellcode:
private
    { Private-Deklarationen }
    procedure DropFiles (var Msg: TMessage); message WM_DROPFILES;
3.
Delphi-Quellcode:
procedure TFAnlagenkomponenten.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(FAnlagenkomponenten.ListBox1.Handle, true);
end;
4.
Delphi-Quellcode:
procedure TFAnlagenkomponenten.DropFiles(var Msg: TMessage);
var
  i, anzahl, size: integer;
  Dateiname: PChar;
begin
  inherited;
  anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
  for i := 0 to (anzahl - 1) do
  begin
    size := DragQueryFile(Msg.WParam, i , nil, 0) + 1;
    Dateiname:= StrAlloc(size);
    DragQueryFile(Msg.WParam,i , Dateiname, size);
    Label2.Caption:= intToStr(size);
    Label3.Caption:= StrPas(Dateiname);
    ListBox1.items.add(StrPas(Dateiname));
    StrDispose(Dateiname);
  end;
  DragFinish(Msg.WParam);
end;
... die Procedure 4. wird nicht angesprungen. :gruebel:

... bis auf ein paar Labels für die Visualisierung und procedure Namensänderung hat sich zum Beispiel nichts verändert :gruebel:

Danke für Eure Geduld... :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 Uhr.
Seite 1 von 3  1 23      

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