AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien per IDropTarget öffnen.

Ein Thema von Thomasl · begonnen am 24. Mär 2007 · letzter Beitrag vom 1. Apr 2007
 
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
 


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 · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 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