🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Zwischenablage befüllen / einfügen

Alles zur Programmierung im LibreOffice.
Frieder
Beiträge: 28
Registriert: Di 13. Dez 2011, 12:28
Kontaktdaten:

Re: Zwischenablage befüllen / einfügen

Beitrag von Frieder » So 12. Feb 2012, 16:29

Hallo
Ja der Code war leider nicht ganz sauber (War ja auch nicht von mir.)

ich habe ihn gesäubert:

Code: Alles auswählen

Global sTxtCString As String 

Sub  clipboard_1 
Dim sText  As String
   sText =Inputbox ("Bitte geben sie den Text ein," &Chr(10)& _
                    "den sie in die Zwischenablage Kopieren möchten.","Ihr Text","ABC123" )                
   CopyToClipBoard(sText) 
End  Sub 

Sub  CopyToClipBoard( sText ) 
dim  oClip As Object
dim oTR As Object
   ' 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 
   'oClip.flushClipboard() ' does not work 
End  Sub 

Function  Tr_getTransferData(aFlavor as com.sun.star.datatransfer.DataFlavor) 
   If  (aFlavor.MimeType ="text/plain;charset=utf-16")Then 
     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" 
   aFlavor.HumanPresentableName ="Unicode-Text" 
   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 
     Tr_isDataFlavorSupported = true 
   Else 
     Tr_isDataFlavorSupported = false 
   End  If 
End  Function

Die Zwischenablage ist nicht einfach ein Ordner, in den Man etwas hineinkopiert, und herausholt,
sondern ein Programm, dass Kopieren selbständig macht, und einem die Daten auch wieder in einem bestimmten Format zu Verfügung stellt.
Um dies tuen zu können, muss die Zwischenablage mit dem Programm, das die Daten holt oder Bringt (z.B. Libreoffice Basic Makro) kommunizieren.
Dazu wir der Listener benötigt.(ein zuhörer: er hört das was die Zwischenablage fragt, und antwortet darauf.)
Ich versuche das mahl zu verdeutlichen:
Makro an Zwischenablage: Ich habe Daten für dich, hier ist der Listener, mit dem du kommunizieren kannst. [oClip.setContents(oTR,Null) ].
Zischenablage: ich habe folgende Datentypen...,Wird dieser Datentyp unterstüzt? [Tr_isDataFlavorSupported]
Listener: Ja [Tr_isDataFlavorSupported = true]
Zischenablage: Was sind das für Daten [Tr_getTransferDataFlavors()]
Listener: Es ist Unicode text [aFlavor.MimeType ="text/plain;charset=utf-16"
aFlavor.HumanPresentableName ="Unicode-Text"]
Zischenablage: Gib mir die Daten [Tr_getTransferData]
Listener:Hier nimm sie.[Tr_getTransferData() = sTxtCString]


P.S.
Da hier mit einem Listener gearbeitet wird, kann der Code nicht in ein einzelnes Sub gesteckt werden.
und das Sub "clipboard_1" ist ja nur zu Demonstrationszwecken da.
P.P.S. an alle die es interessiert:
dieser Listener bildet eine Ausnahme, er benötigt die Methode "disposing" nicht:

Code: Alles auswählen

sub Tr_disposing (oEvent)
end sub
,
da es kein Event-Listener ist.
Man sieht an den "Dbg_Methods" eines Listeners immer, ob ein "disposing" Benötigt wird oder nicht.


Gruß Frieder
Zuletzt geändert von Frieder am So 12. Feb 2012, 18:07, insgesamt 5-mal geändert.

Frieder
Beiträge: 28
Registriert: Di 13. Dez 2011, 12:28
Kontaktdaten:

Re: Zwischenablage befüllen / einfügen

Beitrag von Frieder » So 12. Feb 2012, 17:25

Hallo Eric March
Mit dem Leerzeichen läuft der Code. Und Programmierschlamperei (durch mich) gegen Fehlerbehandlung, was passiert da, dass so viele Programmmodule ineinandergreifen müssen? Auch ist mir das mit dem UTF-16 und dem UniCode nicht klar weswegen damit umgegangen wird.
Wenn wir uns darauf beschränken, dass der doofe Programmierer (ich) nur in Windows operiert und einzig Stringvariablen [oder das was im Zweifelsfall als eine Ausgabe für PRINT taugen täte - also keine Arrays] hernimmt um sie in die Zwischenablage zu bringen, wie weit könnte der Code dann reduziert werden? (Persönlich halte ich von Einleitungsmakros wie clipboard_1, die auch gleich den Code des aufgerufenen 2. Porgrammmoduls enthalten könnten, nichts. Wenn wiederum ein darin aufgerufener Code nur einmal im Prozedere benötigt wird setze ich ihn gerne gleich an Ort und Stelle. Motto: GoSubs nur da wo mehrere drauf zugreifen oder mehrmals aber nicht in einer Schleife.)

Eric March
…der gerne etwas lernen will und nicht nur Gegebenes kritiklos einsetzen.
Wenn du etwas lernen willst, dann tue auch etwas dafür. Lese z.B.das hier:Andrew Pitonyaks Buch
Wir sind hier nicht deine privaten Nachhilfelehrer.
Und wenn du nicht auf unsere Vorschläge hören willst,
und statt dessen deine eigenen unsinnigen Weisheiten hier verbreitest,
dann können und wollen wir dir auch nicht helfen.

Hier ist der Code des Ersten Makros, und zwar aufs Minimum reduziert und Extrem ausführlich dokumentiert.

Code: Alles auswählen

Option Explicit 'Bewirkt, das man alle Variablen in diesem Modul Deklarieren Muss!!
Sub main
msgbox getClipboardText ()
end sub
'--------------------------------------
Function getClipboardText () AS String 
dim oClip as object ,oConverter as object
dim oClipContents as object ,oTypes as object
dim i%
'Die Systhem-Zwischenablage
oClip = createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
'Ein Converter: convertiweert verschiedene Variablen ineinander.
oConverter = createUnoService("com.sun.star.script.Converter")
On Error Resume Next 'Falls ein Fehler auftrit: Ignorieren.
'Der Inhalt der Zwischenablage(Bilder,Dateien,Text,.....)
oClipContents = oClip.getContents 
'Auslesen was für Typen es momentan dadrin giebt(als Array) 
oTypes = oClipContents.getTransferDataFlavors
For i=LBound(oTypes) To UBound(oTypes)  'Schleife vom anfang des array bis zum Ende       
  If oTypes(i).MimeType = "text/plain;charset=utf-16" Then 'Den Type, den wir wollen
    'oClipContents.getTransferData(oTypes(i))=unkonventierter Text
    'Text convertieren:
     getClipboardText = oConverter.convertToSimpleType _
        	     (oClipContents.getTransferData(oTypes(i)), com.sun.star.uno.TypeClass.STRING)
    Exit Function 'Funktionr verlassen
  End If
Next
End Function
Wenn du den Code immer noch nicht verstehst, dann solltest du Andrew Pitonyaks Buch Lesen.
Mit der Zwischenablage zu hantieren, ist nicht ganz Trivial.
Um den Code wirklich zu verstehen, muss man schon ein par grundlegende Kenntnisse haben.

Gruß Frieder

Eric March
Beiträge: 54
Registriert: Do 16. Jun 2011, 16:08

Re: Zwischenablage befüllen / einfügen

Beitrag von Eric March » So 12. Feb 2012, 19:20

@Karolus:
Ich bin auch für Struktur, aber aus Erfahrung dagegen alles zu splitten wenn ein einziger autarker Codeblock genügt. Mit Spagetticode hat das nichts zu tun, ein Heer an Subs nenne ich ein Labyrinth in dem man sicher verlaufen kann.

Eine Aufgabe die es zu erfüllen gilt gibt es akut nicht, ich suche schlicht Wege wie ich die Zwischenablage in eine Variable bekomme oder einen ermittelten Wert in die Zwischenablage. Ich habe beruflich genug Fälle in denen nichts als die Z.A. Werte liefert und es zu genügen hat einen Button zu drücken der eine Aktion auslöst (und wo sich Einkleben, Erfassen, Löschen verbietet).

@Frieder
Ja der Code war leider nicht ganz sauber (War ja auch nicht von mir.)
Dies nahm ich auch nicht an (im Sinne von: ich rechne nicht mit solcher Schlamperei von dir).

Mir ist schon klar, dass diese tollen Programmiersprachen (auch VBA) alles Unmögliche zack-zack zu Stande bringen aber für das Gewöhnliche (grundsätzlicher Zugriff auf die Zwischenablage) ein Register an Systemfunktionalitäten ziehen müssen.
Warum müssten die Z.A. mit einem Programm kommunizieren? Maximal hat das Programm eine Aufforderung ans System zu geben den Inhalt der Z.A. rauszugeben. Nichts letztlich, was Strg+V auf einer leeren Writer-Site auch schafft. Ein Bild in eine Text-Variable ist natürlich eher Murks, und doch ist auch ein Bild nichts als ein Strom von Daten, Bits & Bytes, der in eine Stringvariable (also ein Kette aus Zeichen = Bytes) gequetscht werden könnte. Erst das Anwendungsprogramm interpretiert das Hereingekommene; eine JPG in meiner Textvariable ist natürlich nicht förderlich.
Der Dialog der da über den Listener veranstaltet wird wirkt für mich völlig überkandidelt so lange man nicht plant wasserdicht zu programmieren bloß tue ich das da ich die Z.A. ja selbst beschicke. Ich war deswegen so frei…

Code: Alles auswählen

Sub ZwischenablageReinRaus()
Dim Inhalt As String
Dim Ablage As DataObject
Set Ablage = New DataObject
 'ZA in String [sollte uns genügen]
 Ablage.GetFromClipboard
 Inhalt = Ablage.GetText(1)
 'String in ZA
 Ablage.SetText Inhalt
 Ablage.PutInClipboard
End Sub
Das ist mir schon eigentlich zu verkrampft, aber es genügt in VBA (Office97) Strings zu bedienen.

Code: Alles auswählen

Global sTxtCString As String

Sub clipboard_2()
   sText = "123456"
   oClip = CreateUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
   oTR = createUnoListener("Tr_", "com.sun.star.datatransfer.XTransferable")
   oClip.setContents(oTR,Null)
   sTxtCString = sText
End Sub
…lässt mich ratlos zurück. Lasse ich das laufen kann ich fröhlich überall ‹123456› einkleben. Weswegen es also nicht in einem einzigen Makro gehen solle oder gar eine Schar an Untermakros (Programmmodule) erfordert erschließt sich mir somit um so weniger.

Grüße an alle, für heute mache ich mal Sonntag,
Eric March

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2533
Registriert: Fr 10. Dez 2010, 10:01

Re: Zwischenablage befüllen / einfügen

Beitrag von karolus » So 12. Feb 2012, 20:40

Hallo
Eric March hat geschrieben:

Code: Alles auswählen

Global sTxtCString As String

Sub clipboard_2()
   sText = "123456"
   oClip = CreateUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
   oTR = createUnoListener("Tr_", "com.sun.star.datatransfer.XTransferable")
   oClip.setContents(oTR,Null)
   sTxtCString = sText
End Sub
…lässt mich ratlos zurück. Lasse ich das laufen kann ich fröhlich überall ‹123456› einkleben. Weswegen es also nicht in einem einzigen Makro gehen solle oder gar eine Schar an Untermakros (Programmmodule) erfordert erschließt sich mir somit um so weniger.
Du Held, lass das mal laufen ohne die anderen Listenerfunktionen in einem geladenen Nachbarmodul :lol:

Karo
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Frieder
Beiträge: 28
Registriert: Di 13. Dez 2011, 12:28
Kontaktdaten:

Re: Zwischenablage befüllen / einfügen

Beitrag von Frieder » So 12. Feb 2012, 23:41

Hallo Eric March
Mir ist schon klar, dass diese tollen Programmiersprachen (auch VBA) alles Unmögliche zack-zack zu Stande bringen aber für das Gewöhnliche (grundsätzlicher Zugriff auf die Zwischenablage) ein Register an Systemfunktionalitäten ziehen müssen.Warum müssten die Z.A. mit einem Programm kommunizieren? Maximal hat das Programm eine Aufforderung ans System zu geben den Inhalt der Z.A. rauszugeben. Nichts letztlich, was Strg+V auf einer leeren Writer-Site auch schafft.
Weist du den wie Kompliziert die Funktion aussieht, die du mit Strg+V aufrufst?
Ein Bild in eine Text-Variable ist natürlich eher Murks, und doch ist auch ein Bild nichts als ein Strom von Daten, Bits & Bytes, der in eine Stringvariable (also ein Kette aus Zeichen = Bytes) gequetscht werden könnte. Erst das Anwendungsprogramm interpretiert das Hereingekommene;
Nein das ist nicht so. In der Zwischenablage ist der inhald in einem Container, in dem auch Informationen darüber stehen, was und wie der Inhalat gespeichert ist.
Wäre das nicht so, dann wüste z.B. LO nicht, ob du gerade ein Bild, eine Musikdatei, oder nur Text einfügen willst.
Der Dialog der da über den Listener veranstaltet wird wirkt für mich völlig überkandidelt so lange man nicht plant wasserdicht zu programmieren bloß tue ich das da ich die Z.A. ja selbst beschicke. Ich war deswegen so frei…
...
Das ist mir schon eigentlich zu verkrampft, aber es genügt in VBA (Office97) Strings zu bedienen.
Ich weiß, dass in VBA manches einfacher ist, da VBA mehr fertige Funktionen zur Verfügung stellt als Star-Basic.
die Kommunikation mit der ZA funktioniert aber auf genau die selbe weise wie in LO,
nur das einem in VBA viel Arbeit durch versteckte Funktionen abgenommen wird.

Wenn du aber den Code Zum einfügen
und zum Auslesen einfach in ein separates Modul kopierst,
dann kannst du in Star Basic sogar Bequemer als in VBA mit der Zwischenablage Arbeiten:

Code: Alles auswählen

Sub ZwischenablageReinRaus()
Dim sTextRein As String
Dim sTextRaus As String
sTextRein = "Hallo"
CopyToClipBoard(sTextRein)
sTextRaus= getClipboardText ()

MsgBox "in der Zwischenablage steht jetzt:" & _
         Chr(10)&Chr(10)&_
         sTextRaus
End Sub
Deutlicher als ich es versucht habe dir zu erkläre, wie die beiden Makros funktionieren,
kann man es fast gar nicht.
Da du nicht gewillt bist deine falsche Vorstellung davon wie Computer-Programme funktionieren zu überdenken,
wird wohl auch jeder weitere Versuch es dir zu erklären scheitern.
Deshalb werde ich auch nicht weiter versuchen die Makros zu erklären.
Es bleibt dir überlassen, ob du den Code nutzt, oder ob du doch wieder zu MS-Office wechselst,
weil es da bequemer ist, und man nicht dazu gezwungen wird auch wirklich zu verstehen, was die Makros, die man schreibt wirklich machen.
Wenn du allerdings dabeibleibst, und dich ein wenig in die Materie vertiefst, dann wirst du nach mühsamer Lektüre von Büchern,
und so manche Verirrungen später selber nicht mehr verstehen, warum du die Funktionsweise damals nicht verstanden hast.


Gruß Frieder
Zuletzt geändert von Frieder am Mo 13. Feb 2012, 19:03, insgesamt 1-mal geändert.

Eric March
Beiträge: 54
Registriert: Do 16. Jun 2011, 16:08

Re: Zwischenablage befüllen / einfügen

Beitrag von Eric March » Mo 13. Feb 2012, 17:51

Hallo!

Ich habe nun 2 Makros die das Gewollte tun - nichtsdestoweniger ist es verwirrend wenn behauptet wird, dass man nicht alles in einen Makrorumpf tun kann wenn das doch geht.

Dass LO weiterhin mit der ZA kommunizieren kann verhindert Unfälle, als ein Bild einkleben wo Text hin soll. Dennoch kann man so was je nach Programm durchaus erreichen, mit allen Folgen. Natürlich ist hier der Programmierer gefragt.

Zudem würde ich nicht zu MSO wechseln wollen, ich bin dort und komme gewissermaßen von dort. LO betrachte ich als paralleles, aber sekundäres System bei dem ich aber mit Makros mir einen gewissen Komfort einrichten will. Die Bitte um Code für die Zwischenablage war quasi auf Vorrat falls ich da mal das eine und andere probieren will.

Damit sei es hier zu Ende, ich habe nämlich schon die nächste Frage auf Lager - zwei Probleme in einem bei dem ich einen vorhandenen Dispatchercode zumindest mal in was vernünftiges Umtauschen will.

Eric March

Frieder
Beiträge: 28
Registriert: Di 13. Dez 2011, 12:28
Kontaktdaten:

Re: Zwischenablage befüllen / einfügen

Beitrag von Frieder » Mo 13. Feb 2012, 19:11

Hallo Marc
Ich habe nun 2 Makros die das Gewollte tun - nichtsdestoweniger ist es verwirrend wenn behauptet wird, dass man nicht alles in einen Makrorumpf tun kann wenn das doch geht.
Natürlich geht das, mit dem Dispacher.
Wenn du Code hast, in dem das auch ohne Dispacher in Star-Basic geht, dann veröffentliche ihn doch bitte hier.


Gruß Frieder

Eric March
Beiträge: 54
Registriert: Do 16. Jun 2011, 16:08

Re: Zwischenablage befüllen / einfügen

Beitrag von Eric March » Mo 13. Feb 2012, 19:26

Asldenn ;)

Code: Alles auswählen

Sub ZwischenablegeInVariable
Dim oClip, oClipContents, oTypes
Dim oConverter, convertedString$
Dim i%, iPlainLoc%
 iPlainLoc = -1
 oClip = createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
 oConverter = createUnoService("com.sun.star.script.Converter")
 oClipContents = oClip.getContents()
 oTypes = oClipContents.getTransferDataFlavors()
 For i=LBound(oTypes) To UBound(oTypes)
  If oTypes(i).MimeType = "text/plain;charset=utf-16" Then
   iPlainLoc = i
   Exit For
  End If
 Next
 If (iPlainLoc >= 0) Then
  TextClipboard = oConverter.convertToSimpleType(oClipContents.getTransferData(oTypes(iPlainLoc)), com.sun.star.uno.TypeClass.STRING)
 End If
End Sub


Global sTxtCString As String
Global Nachricht as string

Sub VariableInZwischenablage
    sText = "123456"
 oClip = CreateUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
 oTR = createUnoListener("Tr_", "com.sun.star.datatransfer.XTransferable")
 oClip.setContents(oTR,Null)
 sTxtCString = sText
End Sub
Das ist das derzeitige Resultat meiner Anfrage hier.

Eric March

Frieder
Beiträge: 28
Registriert: Di 13. Dez 2011, 12:28
Kontaktdaten:

Re: Zwischenablage befüllen / einfügen

Beitrag von Frieder » Mo 13. Feb 2012, 19:35

Hallo Marc

Code: Alles auswählen

Global sTxtCString As String
Global Nachricht as string

Sub VariableInZwischenablage
    sText = "123456"
oClip = CreateUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
oTR = createUnoListener("Tr_", "com.sun.star.datatransfer.XTransferable")
oClip.setContents(oTR,Null)
sTxtCString = sText
End Sub
Wie Karo bereits erwähnt hat, läuft dieser Code super, solange die anderen Listener-Funktionen noch irgendwo in einem anderen Modul existieren.

Code: Alles auswählen

Function Tr_getTransferData(aFlavor as com.sun.star.datatransfer.DataFlavor) 
...
Function  Tr_getTransferDataFlavors()
...
Function  Tr_isDataFlavorSupported(aFlavor as com.sun.star.datatransfer.DataFlavor) as Boolean 
Wenn du den Code allerdings laufen lässt, ohne diese Funktionen irgendwo noch bereitzustellen, dann kommt es zum Abstutz von LO.
du kannst das gerne ausprobieren. :lol:

Gruß Frieder

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2533
Registriert: Fr 10. Dez 2010, 10:01

Re: Zwischenablage befüllen / einfügen

Beitrag von karolus » Di 14. Feb 2012, 00:53

Hallo Frieder
dann kommt es zum Abstutz von LO.
Nein, den Gefallen hat mir LO nicht getan, ich musste es per Terminalkommando abschiessen.

Gruß Karo
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten