Seite 1 von 1

[Gelöst] mehrzeiligen Text per Makro in Zwischenablage

Verfasst: Sa, 27.01.2018 10:34
von Stephan
Hallo,

ich finde bisher nur verschiedene Varianten von:
https://forum.openoffice.org/en/forum/v ... xt#p295435

Code: Alles auswählen

Global sTxtCString As String

Sub CopyToClipBoard( sText )
  ' create SystemClipboard instance
  oClip = CreateUnoService( _
      "com.sun.star.datatransfer.clipboard.SystemClipboard")
  oTR = createUnoListener("Tr_", "com.sun.star.datatransfer.XTransferable")
  ' set data
  oClip.setContents(oTR,Null)
  sTxtCString = sText
End Sub

Function Tr_getTransferData( _
    aFlavor as com.sun.star.datatransfer.DataFlavor)
  If (aFlavor.MimeType = "text/plain;charset=utf-16") Then ' was  = "text/plain;charset=utf-16" TRIED = "text/plain;charset=ISO-8859-1" TRIED ="text/html"
    Tr_getTransferData() = sTxtCString
  End If
End Function

Function Tr_getTransferDataFlavors()
  Dim aFlavor As new com.sun.star.datatransfer.DataFlavor
  aFlavor.MimeType = "text/plain;charset=utf-16" ' was  = "text/plain;charset=utf-16" TRIED = "text/plain;charset=ISO-8859-1" TRIED = "text/richtext" TRIED ="text/html"
  aFlavor.HumanPresentableName = "Text" ' was = "Unicode-Text" TRIED = "Text" TRIED = "Rich Text Format" TRIED ="HTML"
  Tr_getTransferDataFlavors() = array(aFlavor)
End Function

Function Tr_isDataFlavorSupported( _
    aFlavor as com.sun.star.datatransfer.DataFlavor) as Boolean
  If aFlavor.MimeType = "text/plain;charset=utf-16" Then ' was  = "text/plain;charset=utf-16" TRIED = "text/plain;charset=ISO-8859-1" TRIED ="text/html"
    Tr_isDataFlavorSupported = true
  Else
    Tr_isDataFlavorSupported = false
  End If
End Function
rufe ich, wie folgt auf:

Code: Alles auswählen

Sub Aufruf()
k = "nur" & CHR(13)
k = k & "ein" & CHR(13)
k = k & "test"

CopyToClipBoard(k)
End Sub
und füge dann den Inhalt der Zwischenablage (normal per Maus "Einfügen") ein, erhalte ich:

im Windows-Editor:

Code: Alles auswählen

nureintest
in Notepad++ (UTF8-fähiger Editor):

Code: Alles auswählen

nur
ein
test
jedoch in OO/LO Writer :shock: : (also nur das erste Wort)
MS Word hat dasselbe Problem nicht, d.h. dort kann ich den, mit obigem Makro in der Zwischenablage erzeugten Inhalt, richtig (untereinander) einfügen.



Wie bekomme ich den Text so in die Zwischenablage, das beim Einfügen in Writer die Darstellung ist wie obenstehend für Notepad++ gezeigt?


Hinweise:
(a)
das vorstehende Beispiel funktioniert auch für OO/LO wenn man statt CHR(13) nur einen Zeilenumbruch (CHR(10)) benutzt, aber dann ist das natürlich später in OO/LO nur ein Zeilenumbruch ... da das Einfügen manuell erfolgen muss kann man auch nicht einfach per Makro die Zeilenumbrüche gegen Absatzumbrüche austauschen, denn das kann ja erst NACH dem Einfügen erfolgen.

(b)
indirekte Lösungen per Selektion (oder Dispatcher), sind mir bekannt, z.B. von Andrew:

Code: Alles auswählen

Sub CopyToClipboard_API()
  Dim o         'Übertragbarer Inhalt
  Dim oClip     'Zwischenspeicher-Service
  Dim oContents 'Inhalt des Zwischenspeichers
  Dim sClipName As String 
'Selektiert den gesamten Dokumentinhalt. Die Selektion ist kopierbar.
  ThisComponent.CurrentController.select(ThisComponent.Text)
  o = ThisComponent.CurrentController.getTransferable() 
  sClipName = "com.sun.star.datatransfer.clipboard.SystemClipboard"
  oClip = CreateUnoService(sClipName)
'Überträgt die Auswahl in die Zwischenablage
  oContents = oClip.setContents(o, Null)
End Sub
Wozu das Ganze?
aus einen Dialog möchte ich die Inhalte mehrerer Textfelder so in die Zwischenablage bekommen das sie beim anschließenden Einfügen in Writer untereinander stehen.
Wahrscheinlich, (ich habs noch nicht probiert) wäre die Notlösung die Texte in ein weiteres Textfeld im Dialog per Makro untereinander zu schreiben, per Makro zu selektieren (ähnlich/analog wie in CopyToClipboard_API()) und dann das Textfeld wieder auszublenden ...



Tja, lange Frage zu einem einfach geglaubten Problem, ich finde nur keine Lösung ...

Gruß
Stephan

Re: mehrzeiligen Text per Makro in Zwischenablage

Verfasst: Sa, 27.01.2018 15:24
von Stephan
mmh, da war ich wohl vorhin noch nicht ganz wach. Folgendes geht:

Code: Alles auswählen

Sub Aufruf()
k = "nur" & CHR(13) & CHR(10)
k = k & "ein" & CHR(13) & CHR(10)
k = k & "test"

CopyToClipBoard(k)
End Sub
der Inhalt der Zwischenablage kann anschließend in allen bereits angesprochenen Fällen (Windows-Editor, Notepad++, MS Word, OO, LO) richtig eingefügt werden und sieht so aus wie gewollt (also untereinander):

Code: Alles auswählen

nur
ein
test

Gruß
Stephan

Re: [Gelöst] mehrzeiligen Text per Makro in Zwischenablage

Verfasst: Sa, 27.01.2018 15:30
von balu
Hallo Stephan,

Du warst jetzt ein wenig schneller als ich, denn ich wollte dir das gleiche vorschlagen (und durfte jetzt meinen Text über Bord werfen.). Die Lösung steht nämlich in Andrew drin, ich hatte dies in der deutschen Version gefunden.
3.3.6. String-Variablen enthalten Text.
Tabelle 10. Zu Visual Basic kompatible Stringkonstanten.

Aber egal. Hauptsache Du hast ein Problem weniger. 8)



Gruß
balu

Re: [Gelöst] mehrzeiligen Text per Makro in Zwischenablage

Verfasst: So, 28.01.2018 09:30
von Stephan
Die Lösung steht nämlich in Andrew drin, ich hatte dies in der deutschen Version gefunden.
3.3.6. String-Variablen enthalten Text.
Tabelle 10. Zu Visual Basic kompatible Stringkonstanten.
Danke für Deine Bemühungen. Zusätzlich konnte ich aus der angegebenen Quelle jetzt noch lernen das:

Code: Alles auswählen

Option Compatible
alternativ zu

Code: Alles auswählen

Option VBASupport 1
verwendet werden kann.


Gruß
Stephan

Re: [Gelöst] mehrzeiligen Text per Makro in Zwischenablage

Verfasst: So, 28.01.2018 13:11
von balu
Danke für Deine Bemühungen.
Gern geschehen. 8)

Freut mich zu hören, das Du jetzt auch noch einen anderen zusätzlichen Nutzen daraus ziehen konntest.

Schönen Sonntag noch.



Gruß
balu