Announcement

Collapse
No announcement yet.

Drag & Drop zwischen Exe und DLL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Drag & Drop zwischen Exe und DLL

    Hallo,

    wer kann mir die Verwendung von DragObject erklären, bzw. wie kann man dafür sorgen, dass ein aus einem DLL-Formular gezogenes Objekt im Exe-Formular akzeptiert wird?

    Vielen Dank für jede Mitteilung,

    Gruß Marco.

  • #2
    Hallo,

    das folgende Beispiel stammt aus meinem Buch <b>COM/DCOM mit Delphi</b> und demonstriert den Zugriff auf die Interface-Methoden von <b>IDropTarget</b>:
    <pre>
    { ************************************************** **************
    Source File Name : TMemoDragDropFrm.pas
    Typ : Hauptformular
    Autor : Andreas Kosch
    Compiler : Delphi 4.02 CSS
    Betriebssystem : Windows 98
    Beschreibung : Text via OLE Drag&Drop übernehmen aus einer
    anderen Anwendung (wie zum Beispiel WordPad)
    übernehmen.
    ************************************************** ************** }

    unit TMemoDragDropFrm;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, ComCtrls, ActiveX, ShlObj, ComObj;

    type
    TFormMain = class(TForm, IDropTarget)
    StatusBar1: TStatusBar;
    Memo1: TMemo;
    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
    FormMain: TFormMain;

    implementation

    {$R *.DFM}

    procedure TFormMain.FormCreate(Sender: TObject);
    begin
    OleInitialize(nil);
    OleCheck(RegisterDragDrop(Handle, Self));
    end;

    procedure TFormMain.FormDestroy(Sender: TObject);
    begin
    RevokeDragDrop(Handle);
    OleUninitialize;
    end;

    {-----------------------------------------------------------------}
    { IDropTarget-Implementierung }
    {-----------------------------------------------------------------}

    function TFormMain.DragEnter(const dataObj: IDataObject;
    grfKeyState: Longint;
    pt: TPoint;
    var dwEffect: Longint): HResult;
    begin
    dwEffect := DROPEFFECT_COPY;
    Result := S_OK;
    end;

    function TFormMain.DragOver(grfKeyState: Longint;
    pt: TPoint;
    var dwEffect: Longint): HResult;
    begin
    dwEffect := DROPEFFECT_COPY;
    Result := S_OK;
    end;

    function TFormMain.DragLeave : HResult;
    begin
    Result := S_OK;
    end;

    function TFormMain.Drop(const dataObj: IDataObject;
    grfKeyState: Longint;
    pt : TPoint;
    var dwEffect : Longint): HResult;
    var
    aFmtEtc : TFORMATETC;
    aStgMed : TSTGMEDIUM;
    pData : PChar;
    begin
    if (dataObj = nil) then
    raise Exception.Create('IDataObject-Zeiger ist ungültig!');
    with aFmtEtc do
    begin
    cfFormat := CF_TEXT;
    ptd := nil;
    dwAspect := DVASPECT_CONTENT;
    lindex := -1;
    tymed := TYMED_HGLOBAL;
    end;
    OleCheck(dataObj.GetData(aFmtEtc, aStgMed));
    try
    pData := GlobalLock(aStgMed.hGlobal);
    // Text ersetzen
    Memo1.Text := pData;
    finally
    GlobalUnlock(aStgMed.hGlobal);
    ReleaseStgMedium(aStgMed);
    end;
    Result := S_OK;
    end;

    end.
    </pre&gt

    Comment

    Working...
    X