PDA

Vollständige Version anzeigen : Zwischenablage und Text


ebs17
20.02.2013, 23:06
Die Nutzung der Zwischenablage als Übertrager von Informationen ist beim regulären Programmieren eher ein Workaround, weil man im Normalfall Objektmodelle nutzt und direkt Informationen von Objekt an Objekt übergibt (z.B. Übergabe eines Wertes aus einem Recordset an eine Excelzelle oder eine Wordtextmarke) und so auch Anwendungssicherheit gewinnt.

Die Zwischenablage ist jederzeit und von überall erreichbar und somit prinzipiell auch ständig von außen störbar und somit ein "unsicherer Kandidat".

Trotzdem kann auch manchmal die Anwendung eines Workarounds notwendig werden. Die folgende kurze Codesequenz zeigt, wie man ohne Inanspruchnahme von Win-API's Text (nur Text) in die Zwischenablage übergeben sowie übernehmen kann:
Sub TXTtoCB()
Const csText = "hallo welt"

' bei Verweis auf MS Office X.0 Object Library
'Dim cb As New DataObject

Dim cb As Object ' Late Binding

Set cb = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
With cb
.SetText csText
.PutInClipboard
End With
End Sub


Sub TXTfromCB()
Dim cb As Object
Dim sData As String

Set cb = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
With cb
.GetFromClipboard
Debug.Print .GetText
End With
End Sub


Sub aufruf_cb()
TXTtoCB
TXTfromCB
End Sub

FW
06.05.2015, 09:58
ich erhalte beiliegende Fehlermeldung bei der Objekt-Zuweisung:

Set cb = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

Bei klappt aber auch die API-Funktion "GetClipboardData" nicht. Gibt es da vielleicht einen Zusammenhang?

ebs17
06.05.2015, 18:36
Funktioniert denn das Ganze bei Early Binding?
Funktioniert die Zwischenablage überhaupt?

FW
08.05.2015, 09:01
Hallo Eberhard,
danke für Deine Antwort.
Ja, die Zwischenablage funktioniert, sowohl manuell, als auch die entsprechenden Acc-Funktionen.
Early Binding habe ich in der Tat nicht probiert (warum eigentlich nicht?), werde das probieren und mich nochmal melden.
Danke
Frank

FW
13.05.2015, 09:06
Hallo Eberhard,
ja, beim "Early Binding" tritt derselbe Fehler auf!
Ne Idee?
Danke
Frank

TommyK
13.05.2015, 11:17
Hallo Frank,

hier gibt es noch eine ältere Lösung von mir.
Die nutzt die MS Forms Library.
Zwischenablage in MS-Access nutzen (http://www.tksoft-online.de/article/55-ms-access/ms-access-codes/codeschnipsel-sonstiges/176-zwischenablage-in-ms-access-nutzen)

daolix
13.05.2015, 12:55
Hallo tommy
dein bsp ist jetzt das gleiche wie das von eberhard. die verwendete guid verweist auf das dataobjekt der msforms.

FW
16.05.2015, 14:25
@daolix:dein bsp ist jetzt das gleiche wie das von Eberhard.Dem ist offensichtlich nicht so!
@TommyK: Dein Beispiel klappt primstens, vielen Dank!
@Eberhard: Warum genügt in Deinem Beispiel, wie in dem von TommyK, kein einfaches "New" zum Initialisieren des Objekts?

daolix
16.05.2015, 18:32
Dem ist offensichtlich nicht so!Da hast du recht, ist nicht das gleiche. Hab ich auf die schnelle echt nicht erkannt. Bei Eberhard kommt LateBinding zum einsatz, bei Tommy EarlyBinding.
Da aber die von Eberhard verwendete Guid die des DataObjectes der bei Tommy verwendeten FM20.dll ist oder zumindest sein sollte, kann man jetzt nur raten warum das Bsp von ebs17 bei dir nicht läuft.
entweder deine fm20.dll verwendet eine andere guid, was erstmal komisch ist und man evtl per TyplibCombrowser ermitteln müsste, oder du hast Probleme beim Latebinding im allgemeinen oder latebinding mit Guids im besonderem, oder die fm ist/war nicht richtig registriert, oder was völlig anderes.

FW
18.05.2015, 08:44
@daolix: Eberhards Beispiel klappt in beiden Fällen, Early- & Late-Binding, nicht!

Josef P.
18.05.2015, 12:26
@Frank:
Findest du in deiner Windows-Registry den HKEY_CLASSES_ROOT-Eintrag "{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"?
Bei mir zeigt der auf "Microsoft.Vbe.Interop.Forms.DataObjectClass"
(RT-Version: v2.0.50727)

mfg
Josef

FW
20.05.2015, 08:42
Hallo Josef,
Unter diesem Eintrag finde ich nur den Standard-Wert "Microsoft Forms 2.1 DataObject"!?

FW
28.05.2015, 09:37
… das Thema hat sich offensichtlich erledigt!
Meine Frage, warum die "umständliche" Initialisierung Mit der GUID, wenn dann doch ein "New" genügt, bleibt also unbeantwortet?

ebs17
28.05.2015, 11:56
Die Frage war ja eigentlich, warum es bei Dir (und offensichtlich einzigen in der bisherigen Runde) nicht klappt, und die ist wohl nicht von außen zu beantworten.

Ansonsten ging es um simples Late Binding, und das macht schon in vielerlei Fällen Sinn.

daolix
28.05.2015, 12:30
die instanzierung von objecten mittels guid kann angewendet werden wenn
a) wie vom vorredner erwähnt latebinding zum einsatz kommt und
b) das zu instanzierende object keine eigene progid (wie das hier verwendete dataobject) besitzt. bei guid handelt es sich hierbei um die entsprechende clsid.

FW
28.05.2015, 14:23
@ Eberhard: Beim Early Bindung würde in Deinem Code das CreateObject entfallen?
Wenn ja, war das mein Verständnisproblem, ich habe in beiden Fällen mit CreateObject initialisiert...

ebs17
28.05.2015, 20:02
Dim cb As New DataObject
Hier wird ein Objekt deklariert (über Dim) und gleich initialisiert (über New). Sauberer wäre es, beide Schritte zu trennen:
Dim cb As DataObject
Set cb = New DataObject
Das ist aber nun kein Sonderfall bei der Zwischenablage, sondern generell bei allen Objekten üblich.

Dass dann noch Methoden von Early Binding und Late Binding gemischt werden und das ganze noch meist funktioniert ... nun ja, VBA macht einiges möglich.