Announcement

Collapse
No announcement yet.

Wie bekomme ich Drag and Drop in RichEdit als AsText?

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

  • Wie bekomme ich Drag and Drop in RichEdit als AsText?

    Guten Abend,

    ich habe ein schwerwiegendes Problem in Verbindung mit Microsoft Anwendungen, die Textformatierung beibehalten, wenn ich Texte aus ihnen Kopiere oder per Drag and Drop in meine Anwendung ziehe.

    Eine HTML formatierte Seite mit großer und kleiner Schrift übernimmt diesen Stil auch in meine RichEdit Komponente, wenn ich deren Text dort einfüge.

    Das Problem mit der Zwischenablage lässt sich lösen:
    <b>RichEdit1.SelText := ClipBoard.AsText;</b>

    Mein Problem liegt im Drag and Drop, denn dort kann ich partou keine Lösung finden, um das Design nicht mit zu übernehmen (also auch nur AsText). Ich weiß zudem nicht, wo ich bei diesem Problem ansetzen soll. Mit den Drag and Drop Events habe ich schon rumgespielt, was jedoch zu keinem Erfolg geführt hat.

    Hat jemand eine Lösung für mich parat, mit der ich dieses dumme Problem endlich aus der Welt schaffen kann? Schon jetzt vielen Dank für sämtliche Hinweise.

    MfG

  • #2
    joo,<br>
    was ist den "source" deiner Drag&Drop operation?
    <pre>
    procedure TForm1.RichEdit1DragDrop(Sender, Source: TObject; X, Y: Integer);
    begin
    With Sender as TRichEdit do
    SelText:= //Was ist Source???
    end;
    </pre> Gruß Andrea

    Comment


    • #3
      Guten Tag,

      keine Ahnung, irgendein Text, der aus einer beliebigen anderen Anwendung (IE, Word,...) in mein Programm gezogen wird.

      Im Prinzip also ein String, der vermutlich in irgendeinem MS Format formatiert ist. Eben das ist ja das Problem. ;-)

      Mf

      Comment


      • #4
        Hallo,

        das folgende Beispielprojekt stammt aus meinem Buch <i>COM/DCOM/COM+ mit Delphi</i>:

        <pre>

        <font color="#003399"><i>{ ************************************************** **************
        Source File Name : IDataObjectTest2Frm.pas
        Typ : Hauptformular
        Autor : Andreas Kosch
        Compiler : Delphi 4.02 CSS
        Betriebssystem : Windows 98
        Beschreibung : Beispiel zum IDataObject-Interface
        (Word-Dokument direkt im RTF-Format über-
        nehmen)
        ************************************************** ************** }</i></font>

        <b>unit</b> IDataObjectTest2Frm;

        <b>interface</b>

        <b>uses</b>
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
        StdCtrls, OleCtnrs, ComCtrls, ActiveX;

        <b>type</b>
        TForm1 = <b>class</b>(TForm)
        StatusBar1: TStatusBar;
        ButtonSave: TButton;
        OleContainer1: TOleContainer;
        ButtonOpen: TButton;
        OpenDialog1: TOpenDialog;
        SaveDialog1: TSaveDialog;
        RichEdit1: TRichEdit;
        ButtonLoad: TButton;
        <b>procedure</b> ButtonOpenClick(Sender: TObject);
        <b>procedure</b> FormCreate(Sender: TObject);
        <b>procedure</b> ButtonSaveClick(Sender: TObject);
        <b>procedure</b> ButtonLoadClick(Sender: TObject);
        <b>private</b>
        <font color="#003399"><i>{ Private-Deklarationen }</i></font>
        <b>public</b>
        <font color="#003399"><i>{ Public-Deklarationen }</i></font>
        <b>end</b>;

        <b>var</b>
        Form1: TForm1;

        <b>implementation</b>

        <font color="#003399"><i>{$R *.DFM}</i></font>

        <b>uses</b> ComObj;

        <font color="#003399"><i>{ Startverzeichnis der TOpenDialog-Instanz mit dem aktuellen
        Windowsverzeichnis vorbelegen. }</i></font>

        <b>procedure</b> TForm1.FormCreate(Sender: TObject);
        <b>var</b>
        szWinDir : <b>array</b>[0..99] <b>of</b> Char;
        <b>begin</b>
        FillChar(szWinDir, SizeOf(szWinDir), #0);
        GetWindowsDirectory(szWinDir, SizeOf(szWinDir));
        OpenDialog1.InitialDir := szWinDir;
        <font color="#003399"><i>// Inhalt wird direkt im RTF-Format eingefügt</i></font>
        RichEdit1.PlainText := True;
        <b>end</b>;

        <font color="#003399"><i>{ Wurde eine DOC-Datei ausgewählt. Wenn ja, dann soll ein
        OLE-Objekt in der TOleContainer-Instanz daraus erstellt
        werden. }</i></font>

        <b>procedure</b> TForm1.ButtonOpenClick(Sender: TObject);
        <b>begin</b>
        <b>with</b> OpenDialog1 <b>do</b>
        <b>if</b> Execute <b>then</b>
        OleContainer1.CreateObjectFromFile(FileName, False);
        ButtonSave.Enabled := True;
        StatusBar1.SimpleText := Format(<font color="#9933CC">'Datei »%s« ist im OleContainer'</font>,
        [OpenDialog1.Filename]);
        <b>end</b>;

        <font color="#003399"><i>{ Für den Fall, daß ein eingebettetes OLE-Objekt nicht im speziellen
        Format des OleContainers gespeichert werden soll, sondern im
        ursprünglichen Dateiformat, muß das universelle IDataObject-Interface
        bemüht werden.
        In diesem Fall muß das gesuchte Format über seine Bezeichnung als
        Zeichenkette gesucht werden. }</i></font>

        <b>procedure</b> TForm1.ButtonSaveClick(Sender: TObject);
        <b>const</b>
        RTF_NAME = <font color="#9933CC">'Rich Text Format'</font>;
        RTF_NAME_MAX = 254;
        <b>var</b>
        aDataObject : IDataObject;
        aEnumFmt : IEnumFORMATETC;
        aFormatEtc : TFormatEtc;
        aMedium : TStgMedium;
        pFmtName : PChar;
        bFmtFound : Boolean;
        pRTFData : PChar;
        <b>begin</b>
        <font color="#003399"><i>// Zieldateiname definiert ?</i></font>
        <b>if</b> <b>not</b> SaveDialog1.Execute <b>then</b>
        Abort;
        bFmtFound := False;
        OleContainer1.DoVerb(1);
        OleContainer1.OLEObjectInterface.QueryInterface(ID ataObject, aDataObject);
        <font color="#003399"><i>// IDataObject der Quelle ok ?</i></font>
        <b>if</b> aDataObject = <b>nil</b> <b>then</b>
        Abort;
        <font color="#003399"><i>// cfFormat-Wert für den RTF-Inhalt des Word-Dokuments ermitteln</i></font>
        OleCheck(aDataObject.EnumFormatEtc(DATADIR_GET, aEnumFmt));
        <b>while</b> (<b>not</b> bFmtFound) <b>and</b>
        (aEnumFmt.Next(1, aFormatEtc, <b>nil</b>) = S_OK) <b>do</b>
        <b>begin</b>
        pFmtName := AllocMem(RTF_NAME_MAX + 1);
        GetClipBoardFormatName(aFormatEtc.cfFormat, pFmtName, RTF_NAME_MAX);
        <b>if</b> (<b>String</b>(pFmtName) = RTF_NAME) <b>then</b>
        bFmtFound := True;
        FreeMem(pFmtName);
        <b>end</b>;
        <b>if</b> <b>not</b> bFmtFound <b>then</b>
        Abort;
        OleCheck(aDataObject.GetData(aFormatEtc, aMedium));
        <font color="#003399"><i>// RTF-Format wird über einen globalen Puffer übergeben</i></font>
        pRTFData := GlobalLock(aMedium.hglobal);
        <b>try</b>
        RichEdit1.Text := pRTFData;
        <b>finally</b>
        GlobalUnlock(aMedium.hglobal);
        <b>end</b>;
        OleContainer1.Close;
        RichEdit1.Lines.SaveToFile(SaveDialog1.Filename);
        ButtonLoad.Enabled := True;
        <b>end</b>;

        <font color="#003399"><i>{ Zur Kontrolle kann das gerade angelegte RTF-Dokument erneut
        über die Datei in die TRichEdit-Instanz geladen werden. }</i></font>

        <b>procedure</b> TForm1.ButtonLoadClick(Sender: TObject);
        <b>begin</b>
        <b>with</b> RichEdit1 <b>do</b>
        <b>begin</b>
        Lines.Clear;
        PlainText := False;
        Lines.LoadFromFile(SaveDialog1.Filename);
        <b>end</b>;
        <b>end</b>;

        <b>end</b>.

        </pre&gt

        Comment


        • #5
          Hallo,

          die Funktion <b>Drop</b> übergibt einen Interface-Zeiger für <b>IDataObject</b>. Über diesen Weg muss der als CF_TEXT formatierte Inhalt abgerufen werden (siehe <b>TFORMATETC</b>-Feld <b>cfFormat</b>). Die Suche nach der Zeichenkette IDataObject liefert hier im FORUM einige Beispiele zurück

          Comment

          Working...
          X