Einzelnen Beitrag anzeigen

Thomasl

Registriert seit: 19. Jun 2006
Ort: Vreden
66 Beiträge
 
Delphi 11 Alexandria
 
#1

Dateien per IDropTarget öffnen.

  Alt 24. Mär 2007, 18:18
Hallo
ich möchte mehrere Dateien aus dem Exlorer mit Rechtsklick öffnen.
Es gibt 3 möglichkeiten.
1. paramstr
2. Dynamic Data Exchange (DDE)
3. COM and IDropTarget, by using a DropTarget key
MSDN

paramstr geht bei mir nur mit einer Datei.
DDE habe ich auch zum laufen gebracht mit diesem Beispiel
Codegear.com Id=17787
es ist möglich mehrere Dateien gleichzeitig zu öffnen.
aber ab einer bestimmten anzahl kommt eine windows warnung, das das öffnen sehr lange dauern kann.
was es auch tut (mind 0,5sec pro Datei (3ghz C2D)).


Mit diesem Beispiel ist es möglich Dateien per OLE Drag&Drop in das eigene anwendungsfenster schieben.
Zum testen habe ich einfach die Winamp.exe gegen diese Programmdatei ausgetauscht.
beim öffen friert der explorer für einige zeit ein das programm öffnet sich, aber es landen keine einträge ins fenster.

Hat jemand ein Funktionierendes beispiel??
mit passenden registry einstellungen.

Delphi-Quellcode:
{ **************************************************  **************

  Source File Name :  ExplorerDragDropFrm.pas

  Typ              :  Hauptformular

  Autor            :  Andreas Kosch

  Compiler        :  Delphi 4.02 CSS

  Betriebssystem  :  Windows 98

  Beschreibung    :  Dateien via OLE Drag&Drop vom Explorer

                      übernehmen.

**************************************************  ************** }




//unit ExplorerDragDropFrm;
unit drag;


interface



uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls, ComCtrls, ActiveX, ShlObj, ComObj, ShellAPI;



type

  TForm1 = class(TForm, IDropTarget)

    ListBox1: TListBox;
    StatusBar1: TStatusBar;

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

  private

    { Private-Deklarationen }

  public

    { Public-Deklarationen }

    // IDropTarget

    function DragEnter(const dataObj: IDataObject;

                       grfKeyState: Longint;

                       pt: TPoint;

                       var dwEffect: Longint): HResult; stdcall;

    function DragOver(grfKeyState: Longint;

                      pt: TPoint;

                      var dwEffect: Longint): HResult; stdcall;

    function DragLeave: HResult; stdcall;

    function Drop(const dataObj: IDataObject;

                  grfKeyState: Longint; pt: TPoint;

                  var dwEffect: Longint): HResult; stdcall;

  end;



var

  Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.FormCreate(Sender: TObject);

begin

  OleInitialize(nil);

  OleCheck(RegisterDragDrop(Handle, Self));

end;



procedure TForm1.FormDestroy(Sender: TObject);

begin

  RevokeDragDrop(Handle);

  OleUninitialize;

end;



{-----------------------------------------------------------------}

{ IDropTarget-Implementierung                                     }

{-----------------------------------------------------------------}



function TForm1.DragEnter(const dataObj: IDataObject;

                             grfKeyState: Longint;

                             pt: TPoint;

                             var dwEffect: Longint): HResult;

begin

  dwEffect := DROPEFFECT_COPY;

  Result := S_OK;

end;



function TForm1.DragOver(grfKeyState: Longint;

                            pt: TPoint;

                            var dwEffect: Longint): HResult;

begin

  dwEffect := DROPEFFECT_COPY;

  Result := S_OK;

end;



function TForm1.DragLeave : HResult;

begin

  Result := S_OK;

end;



function TForm1.Drop(const dataObj: IDataObject;

                        grfKeyState: Longint;

                        pt : TPoint;

                        var dwEffect : Longint): HResult;

var

  aFmtEtc : TFORMATETC;

  aStgMed : TSTGMEDIUM;

  szBuffer : array[0..MAX_PATH] of Char;

  i, iCount : Integer;

begin

  ListBox1.Items.Clear;

  if (dataObj = nil) then

    raise Exception.Create('IDataObject-Zeiger ist ungültig!');

  with aFmtEtc do

  begin

    cfFormat := CF_HDROP;

    ptd := nil;

    dwAspect := DVASPECT_CONTENT;

    lindex := -1;

    tymed := TYMED_HGLOBAL;

  end;

  OleCheck(dataObj.GetData(aFmtEtc, aStgMed));

  try

    FillChar(szBuffer, SizeOf(szBuffer), #0);

    iCount := DragQueryFile(aStgMed.hGlobal, $FFFFFFFF, @szBuffer, MAX_PATH);

    for i := 0 to iCount - 1 do

    begin

      DragQueryFile(aStgMed.hGlobal, i, @szBuffer, MAX_PATH);

      ListBox1.Items.Add(szBuffer);

    end;

  finally

    ReleaseStgMedium(aStgMed);

  end;

  Result := S_OK;

end;



end.
Thomas Levering
  Mit Zitat antworten Zitat