AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Drag & Drop vom Explorer auf unterschiedliche Steuerelemente

Drag & Drop vom Explorer auf unterschiedliche Steuerelemente

Ein Thema von Luckie · begonnen am 8. Mär 2010 · letzter Beitrag vom 8. Mär 2010
Antwort Antwort
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.123 Beiträge
 
Delphi 2006 Professional
 
#1

Drag & Drop vom Explorer auf unterschiedliche Steuerelem

  Alt 8. Mär 2010, 08:41
Mit folgendem Beispiel kann man Dateien aus dem Explorer auf unterschiedliche Steuerelemente seines Formulares ziehen:
Delphi-Quellcode:
unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm6 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure AppMessage(var Msg: Tmsg; var Handled: Boolean);
    function IsDropPointInside(const aDropPoint: TPoint; const aControl: TControl): Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form6: TForm6;

implementation

{$R *.dfm}

uses
  ShellAPI;

procedure TForm6.AppMessage(var Msg: Tmsg; var Handled: Boolean);
const
  BufferLength: word = 255;
var
  DroppedFilename: string;
  FileIndex: Word;
  QtyDroppedFiles: Word;
  pDroppedFilename: array[0..255] of Char;
  DropPoint: TPoint;
begin
  if Msg.Message = WM_DROPFILES then
  begin
    FileIndex := $FFFF;
    QtyDroppedFiles := DragQueryFile(Msg.WParam, FileIndex, pDroppedFilename, BufferLength);
    for FileIndex := 0 to (QtyDroppedFiles - 1) do
    begin
      DragQueryFile(Msg.WParam, FileIndex, pDroppedFilename, BufferLength);
      DroppedFilename := StrPas(pDroppedFilename);
      DropPoint := Msg.pt;
      if IsDropPointInside(DropPoint, Edit1) then
        Edit1.Text := DroppedFilename
      else if IsDropPointInside(DropPoint, Edit2) then
        Edit2.Text := DroppedFilename;
    end;
    DragFinish(Msg.WParam);
    Handled := true;
  end;
end;

procedure TForm6.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Edit1.Handle, true);
  DragAcceptFiles(Edit2.Handle, true);
  Application.OnMessage := AppMessage;
end;

function TForm6.IsDropPointInside(const aDropPoint: TPoint; const aControl: TControl): Boolean;
begin
  Result := PtInRect(aControl.ClientRect, aControl.ScreenToClient(aDropPoint));
end;

end.
Danke auch an Dezipaitor für seine Hilfe.

Stichwörter: WM_DROPPFILES, Drag and drop, DragAcceptFiles
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
27.721 Beiträge
 
Delphi XE3 Professional
 
#2

Re: Drag & Drop vom Explorer auf unterschiedliche Steuer

  Alt 8. Mär 2010, 09:20
Zitat:
FileIndex := $FFFF;
MSDN
If the value of this parameter is 0xFFFFFFFF


Und es sollte erwähnt werden, daß Application.OnMessage überschrieben wird (falls dieses wer übersieht) und in seinem Programm selber dort schon etwas Anderes zugewiesen hat, bzw. noch zuweisen tut.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
  end;

uses
  ShellAPI;

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
const
  BufferLength = 255;
var
  QtyDroppedFiles, FileIndex: Integer; // eigentlich Cardinal, aber für ein sicheres
                                        // Beenden der For-Schleife, bei QtyDroppedFiles=0
  pDroppedFilename: array[0..BufferLength] of Char;
begin
  if Msg.message = WM_DROPFILES then
  begin
    QtyDroppedFiles := DragQueryFile(Msg.wParam, Cardinal(-1), nil, 0);
    try
      for FileIndex := 0 to QtyDroppedFiles - 1 do
      begin
        DragQueryFile(Msg.wParam, FileIndex, @pDroppedFilename, BufferLength);
        if Msg.hwnd = Edit1.Handle then
          Edit1.Text := PChar(@pDroppedFilename)
        else if Msg.hwnd = Edit2.Handle then
          Edit2.Text := PChar(@pDroppedFilename);
      end;
    finally
      DragFinish(Msg.wParam);
      Handled := True;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Edit1.Handle, True);
  DragAcceptFiles(Edit2.Handle, True);
  Application.OnMessage := AppMessage;
end;
PS: bei Windows 7 und einer Anwendung mit Admin-Rechten geht dieses vom "normalen" Explorer nicht mehr.

Da man nur noch Messages zu Anwendungen mit gleichen oder geringeren Rechten verschicken darf,
also müßte da z.B. der Explorer auch mit Admin-Rechten gestartet sein.

PSS: mit "Explorer" ist übrigen vieles gemeint ... der Desktop, der Explorer, die Dateilisten von Open-/Savedialogen ... also alles worin sich ein Explorer versteckt oder welches die hierfür nötigen Messages/Speicherbereiche erstellt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.123 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Drag & Drop vom Explorer auf unterschiedliche Steuer

  Alt 8. Mär 2010, 09:25
Jupp, eigentlich Cardinal, aber dann bekommt man für die for-Schleife eine Warnung, deswegen Integer.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf