DDE-Abfrage zur Zwischenablage (clipbrd.exe)

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

DDE-Abfrage zur Zwischenablage (clipbrd.exe)

Beitrag von Andromeda_104 »

Hallo an alle Leser hier im Forum,

normalerweise ist die Nutzung von DDE in Calc keine große Sache und ich hatte bislang auch noch keine Schwierigkeiten im Definieren der DDE-Pfade; nicht nur unter Calc - auch aus Fremdquellen mit DDE-Server nach Calc. Jetzt bin ich aber bei einem Problem, welches mich fast verzweifeln lässt. Mit meinen Kenntnissen komme ich nicht weiter und vielleicht hat jemand schon ähnliche Gedanken angestellt.

Die Aufgabe
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Der Zellinhalt von A1 soll per DDE mit der Zwischenablage verknüpft werden. Ändert sich der Inhalt vom Clipboard, so soll sich auch der Inhalt von A1 ändern.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Gibt es eine Möglichkeit, einen entsprechenden Code zu hinterlegen, welcher diese DDE-Abfrage erledigt? Oder gäbe es ein Alternativ-Clipboard mit DDE-Server? Meine Suche bei Google führt mich bislang im Kreis.

Ich freue mich über jeden Hinweis von euch um diese knifflige Nuss zu knacken.

LG
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: DDE-Abfrage zur Zwischenablage (clipbrd.exe)

Beitrag von F3K Total »

Hi,
wenn es nicht DDE sein muss,
anbei eine Datei mit Makro, das einen

Code: Alles auswählen

com.sun.star.datatransfer.clipboard.XClipboardListener
registriert, die Datei "merkt", wenn etwas in die Zwischenablage kopiert wird und schreibt es in Zelle A1 der Tabelle 1
Hier der Code

Code: Alles auswählen

global oClipboardListener
global oClipboardHandle

Sub AddClipboardListener
    oClipboardListener = CreateUnoListener( "ClipboardListener_", "com.sun.star.datatransfer.clipboard.XClipboardListener" )
    oClipboardHandle = createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
    oClipboardHandle.addClipboardListener(oClipboardListener)
End Sub

Sub RemoveClipboardListener
    On Error Resume Next
    oClipboardHandle.removeClipboardListener(oClipboardListener)
End Sub 

Sub ClipboardListener_changedContents(oEvent)
    osheet = Thiscomponent.sheets(0)
    oData = oEvent.Contents
    oDataTypSeq = oData.getTransferDataFlavors
    sValue = oData.getTransferData(oDataTypSeq(0))
    oCellA1 = osheet.getcellbyposition(0,0)
    oCellA1.String = sValue
End Sub

Sub ClipboardListener_disposing
end sub
Das Makro AddClipboardListener zur Erzeugung des Listeners, habe ich an das Dokumentereignis Ansicht wurde erzeugt gehängt, wird die Ansicht geschlossen, wird der Listener mit dem Makro RemoveClipboardListener wieder beendet.
Gruß R
EDIT: Momentan klappt es nur mit reinem Text, wenn du ein anderes Format brauchst, sag bescheid, dann versuche ich das umzubauen.
Dateianhänge
InsertClipboardToA1.ods
(8.98 KiB) 101-mal heruntergeladen
Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

Re: DDE-Abfrage zur Zwischenablage (clipbrd.exe)

Beitrag von Andromeda_104 »

Hallo R.

ich danke dir in außerordentlicher Weise für deine schnelle und zielgerichtete Hilfe. Es funktioniert so wie es soll. Selber hätte ich das niemals lösen können und man sieht wieder einmal, dass es eben Leute braucht, die vom Fach sind. Ganz toll!

Liebe Grüße
Ronny
Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

Re: DDE-Abfrage zur Zwischenablage (clipbrd.exe)

Beitrag von Andromeda_104 »

Hallo R.,

ich habe heute ausführlich getestet und unter Vista funktioniert es absolut fehlerfrei; nicht nur mit reinem Text, sondern auch mit Zahlen bzw. Mischinhalt sowie Sonderzeichen. Der ClipboardListener reagiert dabei sowohl auf händisches Kopieren als auch auf automatisches über die Eingabeaufforderung bzw. Batch-Datei - dies auch sehr rasch und ohne merkliche Verzögerung.

Bei XP hingegen klappt es nur dann, wenn ich es händisch kopiere. Versuche ich einen Kopiervorgang in der Eingabeaufforderung bzw. über eine Batch-Datei, so wird nachweislich jedes Mal zwar etwas im Clipboard hinterlegt, aber es wird nichts daraus übernommen ins Feld A1. Stattdessen erscheint folgende Fehlermeldung mit Aufpoppen des Makros:

BASIC-Laufzeitfehler. Objektvariable nicht belegt.
Hinweispfeil auf Zeile: oCellA1.String = sValue

Nach Wegdrücken kommt eine zweite identische Warnmeldung. Erst dann lässt sich das Makro-Fenster schließen.

Ich habe das automatische Kopieren auf mehreren Wegen versucht.

1.
type "C:\...Pfad...XYZ.txt" | clip (...so läuft es unter Vista Home Premium 32 bit)

2.
clip < "C:\...Pfad...XYZ.txt"

3.
cliptext from "C:\...Pfad...XYZ.txt" (Programm ClipText von Horst Schaeffer)

In allen drei Fällen wird der zu kopierende Inhalt ins Clipboard übernommen ... aber eben nicht in A1 angezeigt.

LG
Ronny
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: DDE-Abfrage zur Zwischenablage (clipbrd.exe)

Beitrag von F3K Total »

Tja, da musst du dann wohl selber forschen ...
Gruß R
Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

Re: DDE-Abfrage zur Zwischenablage (clipbrd.exe)

Beitrag von Andromeda_104 »

Hallo R.,

ich komme leider nicht auf die Lösung der beschriebenen Problematik. Unter Aufrufen von clipbrd und der Kontrolle der Zwischenablage werden in allen 3 genannten Fällen Inhalte dorthin kopiert. Es ist mir unklar, weshalb sich das Makro mit der Fehlermeldung auftut, obwohl die Daten im Gleichschritt in die Zwischenablage geschrieben werden. Es findet doch eine Veränderung des Clipboard-Inhaltes statt - ergo sollte es in A1 erscheinen.

Wenn es grundsätzlich nicht gehen würde, hätte ich dasselbe Phänomen unter Vista - wo es aber problemlos funktioniert. Und weshalb sollte es nur mit reinem Text funktionieren (siehe EDIT)? Es geht mit allen Zeichen; Zahlen, Buchstaben und sogar Sonderzeichen.

Leider kann ich den ?BASIC?-Code in der betreffenden Zeile nicht verstehen, da ich kein Informatiker bin. Welche Objektvariable kann nicht belegt werden? Was wäre eine mögliche Erklärung?

Hat jemand hier im Forum unter Umständen auch schon einmal denselben Laufzeitfehler erhalten und eine mögliche Ursache gefunden? Behindern sich die Batch-Datei und das Makro gfs. untereinander?

LG
R. :roll:


_________________
Moderation: Thema verschoben von OOo Calc nach OOo Basic und Java, wo alle Themen zur individuellen Programmierung hingehören.—lorbass, Moderator
Antworten