Format des Clipboard-Inhaltes ändern

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von praetor.

    Format des Clipboard-Inhaltes ändern

    Hallo,

    folgendes Problem bekomme ich ohne Eure Hilfe leider nicht in den Griff:

    In der Zwischenablage befindet sich formatierter Text (Kopiert aus einem Word-Dokument, also wahrscheinlich im RTF-Format)
    Der formatierter Text soll aus dem Clipboard ausgelesen und als unformatierter Text in das Clipboard zurückgeschrieben werden.

    Ich habe eine Lösung gefunden, die eine RichTextBox als Zwischenspeicher verwendet:

    Quellcode

    1. If My.Computer.Clipboard.ContainsText Then
    2. ' RTB1 ist eine RichTextBox
    3. RTB1.Rtf = Clipboard.GetData(DataFormats.Rtf)
    4. Clipboard.SetData(DataFormats.Text, RTB1.Text)
    5. End IfIf


    Ich würde aber sehr gern ohne die RichTextBox auskommen. Versuche mit DataObject etc. waren bislang nicht erfolgreich.

    Grüße
    praetor
    Grüße
    praetor
    @praetor Willkommen im Forum. :thumbup:
    Ganz einfach, so wie Du es geschrieben hast.
    Ohne RichTextBox oder ein anderes Control, das RichText versteht geht es nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Willkommen im Forum.
    Nun, es kommt meines Erachtens auch drauf an, was daraus werden soll. Wenn ich in Word ein paar wieauchimmer-formatierte Zeilen habe und diese in die Zwischenablage kopieren und dann in VB mit Clipboard.GetText raushole, erhalte ich den unformatierten Text. Alle anderen Infos gehen flöten. Aber es klingt, als ob das auch hier erwünscht wäre. Aber Du hast das bestimmt schon probiert und bist bei einigen Stellen hängen geblieben, oder?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Das eigentliche Problem ist folgendes:
    Wenn in einem Quell-Worddokument die automatische Silbentrennung aktiviert ist und man übernimmt von dort Text über die Zwischenablage als "nur Text" in ein Zieldokument, dann erscheinen im Zieldokument mitten im Text feste Bindestriche. Interessanterweise stimmen die Standorte diese neuen Trennstriche noch nicht mal mit den Trennstellen im Quelldokument überein. Microsoft hat da irgend etwas vermurkst, aber das ist schon seit viele Word-Versionen so.
    Vermeiden lässt sich das zumindest mit der in meinem ersten Beitrag beschriebenen Maßnahmen. Aber eben ziemlich mit der Brust durchs Auge ...
    Grüße
    praetor
    @praetor Jetzt wollen wir mal Nägel mit Köpfen machen.
    Was muss ich tun, um Deinen Effekt zu reproduzieren?
    Was passiert?
    Was soll passieren?
    Und all diese Informationen beim nächsten MNal bitte im Eröffnungspost.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Jetzt wollen wir mal Nägel mit Köpfen machen.
    Und all diese Informationen beim nächsten MNal bitte im Eröffnungspost.

    Aber sehr gern! :thumbup: Eine ausführliche Problemanalyse mit der bisherigen Lösunsvariante findet sich im Anhang.
    Ich war davon ausgegangen, dass die Begleitumstände für meine Ausgangsfrage nicht relevant sind. Deshalb hatte ich sie im Eröffnungspost zunächst nicht erwähnt.

    Viele Grüße
    praetor
    Dateien
    Grüße
    praetor
    @praetor Ich hab mal rumgespielt und folgendes herrausbekommen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim txt = Clipboard.GetText(TextDataFormat.Text)
    4. Me.RichTextBox1.Text = txt
    5. End Sub
    6. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    7. ' Formatierung bleibt erhalten
    8. Dim rtf = Clipboard.GetText(TextDataFormat.Rtf)
    9. Me.RichTextBox1.Rtf = rtf
    10. End Sub
    11. End Class
    Bild 1 mit Button1, Bild 2 mit Button2, Hintergrund ist der formatierte Winword-Text

    Fazit: Das Clipboard formatiert und entformatiert Text <=> Richtext
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Fazit: Das Clipboard formatiert und entformatiert Text <=> Richtext

    @RodFromGermany, ja das ist schon klar und letztlich ja auch der Hintergrund meines Lösungsansatzes. Aber das hilft noch nicht bei der Frage, wie man das ohne die Zwischenschaltung eines Controls hinbekommt. Nur deshalb eine Userform zu erzeugen, ist ziemlich unelegant.

    Grüße
    praetor
    Grüße
    praetor
    Du musst doch eigentlich nur eine Abwandlung nutzen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim txt = Clipboard.GetText(TextDataFormat.Text)
    3. Clipboard.SetText(txt)
    4. End Sub

    um den in txt stehenden nun unformatierten Text zurück in die Zwischenablage zu schreiben.
    Gruss Alex

    praetor schrieb:

    Aber das hilft noch nicht bei der Frage ...
    Doch.
    Nur bekommst Du im allgemeinen hier im Forum keine fertigen Lösungen gepostet, sondern Du bekommst einen Weg gezeigt, wie Du zu Deiner Lösung kommst.
    Stichworte:
    Clipboard.GetText(...)
    Clipboard.SetText(...)
    und der jeweils zweite Parameter in beiden Methoden.
    ====
    In meinem Beispiel befand sich jeweils RichText in der Zwischenablage.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:


    Nur bekommst Du im allgemeinen hier im Forum keine fertigen Lösungen gepostet,

    Das erwarte ich auch nicht. Und meine Aufbereitung des Problems weiter oben belegt das wohl auch. Aber ich sehe weiter nicht, dass Eure Vorschläge tatsächlich zum Ziel führen.

    Wird mit

    VB.NET-Quellcode

    1. Dim txt = Clipboard.GetText(TextDataFormat.Text)

    gelesen, dann enthält txt bereit die unerwünschten Trennstriche. Eine Weiterverarbeitung ist an dieser Stelle also sinnlos.
    Wird mit

    VB.NET-Quellcode

    1. Dim txt = Clipboard.GetText(TextDataFormat.Rtf)

    gelesen, dann enthält txt das RTF-Rohformat, d.h. mit allen Steuerzeichen.
    Schreibt man dann mit

    VB.NET-Quellcode

    1. Clipboard.SetText(txt,TextDataFormat.Text)

    zurück, dann bleiben die Steuerzeichen logischerweise als reiner Text erhalten. Also kein sinnvoller Weg.
    Versucht man stattdessen mit

    VB.NET-Quellcode

    1. Clipboard.SetText(txt, TextDataFormat.Rtf)

    zurückzuschreiben, bleibt die Zwischenablage leer.
    Die Alternative

    VB.NET-Quellcode

    1. Clipboard.SetData(DataFormats.Rtf, txt)

    führt ebenfalls zu einer leeren Zwischenablage.

    Habe ich eine Möglichkeit übersehen?

    Grüße
    praetor
    Grüße
    praetor
    @praetor Wahrscheinlich hab ich Deine Möglichkeit übersehen.
    Schreib mal, was wo in Deine Zwischenablage reinkommt und wo es wie raus soll, damit ich das nachstellen kann.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Schreib mal, was wo in Deine Zwischenablage reinkommt und wo es wie raus soll, damit ich das nachstellen kann.
    [*]Anwender markiert in Word-Dokument A einen Textbereich und übernimmt ihn in die Zwischenablage. Zu diesem Zeitpunkt ist in Dokument A die automatische Silbetrennung aktiv.
    [*]Anwender wechselt zu Word-Dokument B und fügt den Inhalt der Zwischebalge als "nur Text" ein.
    [/list]Das Ganze findet also innerhalb von MS Word statt. Programmiert wird ein Word-Addin.

    Danke, dass Du weiter darüber nachdenkst :thumbup:
    Grüße
    praetor
    @praetor In meinem Beispiel sind doch auch in Word die Silbentrennzeichen drinne.
    Bei Button1 sind sie weg,
    bei Button2 sind sie noch drinne.
    Bei mir.
    Was ist bei Dir anders?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:


    In meinem Beispiel sind doch auch in Word die Silbentrennzeichen drinne.
    Bei Button1 sind sie weg,

    Ja, die gesetzten bedingten Trennstriche sind bei Button 1 weg. Aber probiere das mal mit einem deutlich längeren Text aus und du wirst sehen, dass vereinzelt in Worten Binde(trenn)striche entstehen, die dort nichts zu suchen haben. In meinem PDF-Dokument habe ich das unter Ziff. II gezeigt.
    Grüße
    praetor

    RodFromGermany schrieb:

    Kannst Du mal diesen Text posten?

    Ja klar, s. Anhang. Aber eigentlich ist es egal, was man nimmt.
    Dateien
    Grüße
    praetor

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „praetor“ ()

    @praetor Ja und?
    Sorry, da waren noch keine Trennzeichen drinne.
    ==>
    Das ist echt sehr unklar, das kann ein Fehler im Framework sein.
    Probier mal verschiedene Frameworkes und wenn das nicht hilft, mach ne Meldung an Microsoft.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()