Announcement

Collapse
No announcement yet.

Drag und Drop zwischen verschiedenen Anwendungen

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

  • Drag und Drop zwischen verschiedenen Anwendungen

    Hallo,

    ich möchte daß der Anwender die Möglichkeit hat in einem TMemo/TRichtext oder TDBMemo/TDBRichText den Inhalt per Drag und Drop in eine andere Anwendung z.B. MS Word zu ziehen.

    Was muß ich tun, damit MS Word das gezogene Objekt akzeptiert?

    Gruß
    Bernhard

  • #2
    Hallo,

    in den Anwendungen, die über OLE Drag_Drop Daten austauschen sollen, müssen die vordefinierten COM-Interfaces <b>IDropTarget</b> und <b>IDropSource</b> implementiert werden. Bei Anwendungen wie zum Beispiel MS Word ist das der Fall, eine Delphi-Anwendung muss ggf. diese Arbeitschritte nachholen. Das folgende Beispiel demonstriert die Implementierung eines "Ziels" (d.h. in die TMemo-Instanz kann Text aus Word heraus gezogen werden):

    <pre>
    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;
    //
    ...
    //
    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;
    </pre>

    Wenn die eigene Anwendung die Quelle für die Daten sein soll, muss das <b>IDropSource</b> implementiert werden.

    P.S: Ein <b>TRichEdit</b> ist von Haus aus in der Lage, seinen Inhalt via DragDrop an Word zu übergeben, wenn die Eigenschaft <b>DragMode</b> auf <i>dmManual</i> steht

    Comment


    • #3
      Hallo,

      vielen Dank für Ihre Antwort und Beispiel.

      Gruß
      Bernhar

      Comment


      • #4
        <p>Hallo Bernhard,<br>
        <br>
        vor einiger Zeit war im c't ein Artikel zu diesem Thema. Leider weiss<br>
        ich die Ausgabe nicht mehr. Der Autor des Artikels hat ein Demo-Programm<br>
        und den Quellcode seiner Komponenten im Internet veröffentlicht.<br>
        <br>
        Die Adresse lautet:<br>
        www.oec.uni-osnabrueck.de/student_home/dsteinwe/delphi/DietersDelphiSite.htm
        <br>
        Gruß Thomas</p&gt

        Comment

        Working...
        X