Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Drag & Drop auf Programm-Icon (https://www.delphipraxis.net/200224-drag-drop-auf-programm-icon.html)

H.Bothur 31. Mär 2019 12:52

Drag & Drop auf Programm-Icon
 
Moin,

ich habe mal ein bisschen mit Drag&Drop herumgespielt und bekomme mit folgendem Code auch einen Verzeichnispfad aus dem Explorer in eine Listbox:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  protected
    procedure WMDROPFILES(var Msg: TMessage); message WM_DROPFILES;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  DF_NUMBEROFFILES = $FFFFFFFF;

procedure TForm1.WMDROPFILES(var Msg: TMessage);
var
  i,
  anzahl,
  size: Integer;
  Dateiname: PChar;

begin
 inherited;
 anzahl := DragQueryFile(Msg.WParam, DF_NUMBEROFFILES, 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;

end.
Allerdings klappt das nur wenn das Programm läuft - wenn ich eine Datei auf das Desktop-Icon ziehe wird zwar das Programm gestartet, aber eben nicht der Verzeichnispfad an die Listbox übergeben. Was muss ich denn machen damit das funktioniert ?

Gruß
Hans

Andreas L. 31. Mär 2019 13:24

AW: Drag & Drop auf Programm-Icon
 
Zitat:

Zitat von H.Bothur (Beitrag 1429176)
Allerdings klappt das nur wenn das Programm läuft - wenn ich eine Datei auf das Desktop-Icon ziehe wird zwar das Programm gestartet, aber eben nicht der Verzeichnispfad an die Listbox übergeben. Was muss ich denn machen damit das funktioniert ?

Wenn du eine oder mehrere Dateien auf das Desktop-Symbol oder direkt auf die EXE-Datei ziehst werden die Dateien als Parameter übergeben. Diese kannst du mit ParamStr auslesen.
Delphi-Quellcode:
  ParamStr(0) --> ergibt immer Pfad + Name der EXE
  ParamStr(1) --> ergibt den ersten Parameter
  ParamStr(2) --> usw.
Wenn bereits eine Instanz deines Programms läuft wird eine neue Instanz gestartet. Wenn du die Dateien aber in der bereits gestrateten Instanz erlangen möchtest, musst du z. B. einen Mutex definieren der die Parameter der neuen Instanz an die laufende übergibt und danach die neue Instanz schließt. Siehe https://www.swissdelphicenter.ch/de/showcode.php?id=42 und https://wikiwebpedia.com/mutex-object-delphi

H.Bothur 31. Mär 2019 13:30

AW: Drag & Drop auf Programm-Icon
 
[QUOTE=Andreas L.;1429178]
Zitat:

Zitat von H.Bothur (Beitrag 1429176)
Wenn du eine oder mehrere Dateien auf das Desktop-Symbol oder direkt auf die EXE-Datei ziehst werden die Dateien als Parameter übergeben. Diese kannst du mit ParamStr auslesen.

Danke - das wusste ich nicht !!

Schönen Sonntag !
Hans

dummzeuch 31. Mär 2019 14:59

AW: Drag & Drop auf Programm-Icon
 
Nur so am Rande bemerkt:
Es ist nicht notwendig, hier mit einem PChar und StrAlloc zu arbeiten. Es geht auch so:

Delphi-Quellcode:
const
  DF_NUMBEROFFILES = $FFFFFFFF;

procedure TForm1.WMDROPFILES(var Msg: TMessage);
var
  i,
  anzahl,
  size: Integer;
  Dateiname: string;

begin
 inherited;
 anzahl := DragQueryFile(Msg.WParam, DF_NUMBEROFFILES, nil, 0);
 for i := 0 to (anzahl - 1) do
 begin
   size := DragQueryFile(Msg.WParam, i, nil, 0);
   SetLength(Dateiname, size);
   DragQueryFile(Msg.WParam, i, PChar(Dateiname), size);
   Listbox1.Items.Add(Dateiname);
 end;
 DragFinish(Msg.WParam);
end;
(Code ungetestet runtergetippt)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 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