Announcement

Collapse
No announcement yet.

Drag und Drop

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

  • Drag und Drop

    hallo
    hat jemand eine lösung für drag und drop von text aus word und excel in delphi?
    danke, psp

  • #2
    Hallo,

    das folgende Beispiel aus meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> demonstriert das Drag&Drop aus externen Anwendungen (wie zum Beispiel WordPad oder Microsoft Word) in ein TMemo des eigenen Delphi-Programms. Das eigene Programm muss dazu das COM-Interface <b>IDropTarget</b> implementieren:
    <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.
    16.01.2003: Test mit Delphi 7 und Microsoft Word XP unter Windowx XP
    ************************************************** ************** }

    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}

    uses ShellAPI;

    procedure TFormMain.FormCreate(Sender: TObject);
    begin
    OleInitialize(nil);
    OleCheck(RegisterDragDrop(Handle, Self));
    ShellExecute(Handle, 'open', 'wordpad', 'IDataObject.doc', nil, SW_SHOW);
    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


    • #3
      danke,
      das buch habe ich.
      ps

      Comment

      Working...
      X