Datei in Variable speichern?

Hydiho, liebe Experten!
In letzter Zeit hab ich immer wieder Probleme, dass ich 2 Sachen gleichzeitig in der Zwischenablage speichern möchte. Daher hab ich mir vorgenommen ein dafür vorgesehenes Programm zu schreiben. Allerdings weiß ich nicht, welchen Datentyp eine Variable haben muss, damit ich in ihr auch komplette Dateien und Bilder, halt alles, speichern kann.
Also, wer kann mir weiterhelfen?
mfg Koopa

Hallo,

Allerdings weiß ich nicht, welchen Datentyp eine
Variable haben muss, damit ich in ihr auch komplette Dateien
und Bilder, halt alles, speichern kann.

Auf Bilder und Text kannst Du ohnehin nicht mit dem selben Befehl zugreifen, dashalb macht das auch keinen Sinn.

Die Bilder kannst Du in ein Bytearray packen, den Text in einen String. Etas anderens bekommst Du aus der/in die Zwischenablage nicht.

Gruß Rainer
PS. Ach ja, VB oder VBA?

VB… hmm schade
aber könnte man nicht eine Zwischenablage „simulieren“?
Also beim Kopier-Befehl guckt das Programm erst, was es ist. Wenns ein Bild ist, packt das Programm es in die Byte-Variable. Wenns ein String ist, packt das Programm es in die String-Variable. Und wenn es eine Datei ist, packt das Programm die Datei in den Temp-Ordner?

Hallo,

aber könnte man nicht eine Zwischenablage „simulieren“?

ja, natürlich. Du musst nur Bilder und Text getrennt lassen.

Also beim Kopier-Befehl guckt das Programm erst, was es ist.

Das merkst Du doch schon, wenn Du die Daten holst.
‚Nachsehen was es ist‘ ist gar nicht nötig.

Mit Clipboard.GeText holst Du den Text aus der Zwischenablage, mit Clpboard.GetData die Bilder.

Wenns ein Bild ist, packt das Programm es in die
Byte-Variable. Wenns ein String ist, packt das Programm es in
die String-Variable.

Ja. Bilder übergibst Du an das Bytearry, Text an eine Stringvariable.

Und wenn es eine Datei ist, packt das
Programm die Datei in den Temp-Ordner?

Eine Datei? In der Zwischenablage? Wie ist die da hin gekommen? Wenn das mit [Strg & C] (copy) passiert ist, dann ist das Text.

Wohin und wie Du das auf der Festplatte parkst ist Dir überlassen.
Weil Du ja mehrere verschiedene Daten sichern und zurückholen willst, musst Du Dir nur überlegen wie Du das machst, wie Du es verwaltest.
Du kannst den User entweder wählen lassen, was in die Zwischenablage geschrieben werden soll oder einen Stack simulieren.

Um die Daten auf die Platte zu bekommen, sieh Dir mal ‚Put‘ an, das vereinfacht Dein Vorhaben.

Gruß Rainer

Danke für die Hilfe!
Jetzt hab ich ein neues Problem

>&gt:stuck_out_tongue_winking_eye:rivate Sub Ablage2_save_Click()
>>Ablage2 = Clipboard.GetText
>>Ablage2_Pic = Clipboard.GetData
>>End Sub
>&gt:stuck_out_tongue_winking_eye:rivate Sub Ablage2_load_Click()
>>Clipboard.SetText = Ablage2
>>Clipboard.SetData = Ablage2_Pic
>>End Sub

Die erste Ablage wird per Strg + C und Strg + V gesteuert
Die zweite per Strg + D (save) und Strg + F (load)

Wie sage ich dem Programm, dass es beim drücken von Strg + F, Strg + V simuliert?
Und wird beim Befehl Clipboard.SetData im Code oben nicht der Inhalt, der vorher durch SetText erstellt wurde, gelöscht?
Und noch eine Frage:
Muss ich irgendwas zum Quellcode hinzufügen, wenn ich das Programm nicht nur Programmintern nutzen will? Ich meine, wenn ich die Form nicht im Vordergrund habe und Strg + D drücke, wird sich z.B. beim Firefox, von dem ich irgendwas in die Zwischenablage kopieren will, ein Fenster zum Lesezeichen hinzufügen öffnen.

Hallo,

Jetzt hab ich ein neues Problem

das seiht aber nach ein paar Problemen mehr aus.

>&gt:stuck_out_tongue_winking_eye:rivate Sub Ablage2_save_Click()
>>Ablage2 = Clipboard.GetText
>>Ablage2_Pic = Clipboard.GetData
>>End Sub
>&gt:stuck_out_tongue_winking_eye:rivate Sub Ablage2_load_Click()
>>Clipboard.SetText = Ablage2
>>Clipboard.SetData = Ablage2_Pic
>>End Sub

hmmm. Wenn ‚Ablage2_save‘ und ‚Ablage2_load‘ steuerelemente sind, die ein Click-Ereignis haben und Du uns einiges an Code und Deklaration nur verschwiegen hast, dann kann das so klappen, vermute ich.

Die erste Ablage wird per Strg + C und Strg + V gesteuert
Die zweite per Strg + D (save) und Strg + F (load)

Das steht wo? Ich lese da we wird durch einen Mausklick ausgelöst.

Wie sage ich dem Programm, dass es beim drücken von Strg + F,
Strg + V simuliert?

Indem Du dem Programm erst mal beibringst, daß es erkennen kann, daß Strg + D/F gedrückt wurden.

Und wird beim Befehl Clipboard.SetData im Code oben nicht der
Inhalt, der vorher durch SetText erstellt wurde, gelöscht?

Nein, der Text und das Bild tun sich nichts. Das hier funktioniert deshalb mit VB6:

Option Explicit

Private Sub Command1\_Click()
 Clipboard.SetData Picture1.Image
 Clipboard.SetText Text1.Text
 Picture2.Picture = Clipboard.GetData
 Text2.Text = Clipboard.GetText
End Sub

Und noch eine Frage:
Muss ich irgendwas zum Quellcode hinzufügen, wenn ich das
Programm nicht nur Programmintern nutzen will? Ich meine, wenn
ich die Form nicht im Vordergrund habe und Strg + D drücke,

Dann brauchst Du etwas, mit dem Dein unsichtbares Programm auf den Tastendruck reagiert. Mit VB-Mitteln allein geht das nicht, dazu benötigst Du einen API-Aufruf ‚GetAsyncKeystete‘.
Sieh mal in die FAQ, dort findest Du einen Link zur API-Guide. da wird erklärt, wie das funktioniert.

wird sich z.B. beim Firefox, von dem ich irgendwas in die
Zwischenablage kopieren will, ein Fenster zum Lesezeichen
hinzufügen öffnen.

Firefox reagiert von sich aus auf dies Tastenkombination? Dann nimm eine andere. :smile:

Bevor ich noch etwas mehr Code tippe, verrätst Du auch noch, womit Du programmierst? Mein VB6-Code wird so nur in VB5/VB6 funktionieren. Wenn Du etwas anderes hast, nützt Dir mein Code gar nichts und allgemeine Erklärungen scheinen Dir nichts zu nützen, dafür bist Du von einem lauffähigen Programm viel zu weit weg.

Gruß Rainer

Nabend,
Vorweg: Ich arbeite mit VB 6.0

Naja okay dann pack ich mal aus:
Ich hab im Internet eine schöne Vorlage für ein Programm gefunden, dass per Klick auf einen Button die Userform verschwinden lässt und im Tray ein Symbol erscheinen lässt. Das Programm hab ich in soweit verändert, dass es anstatt beim Klicken des Buttons, beim Laden der Userform die selbige unsichtbar macht und zum Tray-Icon minimiert.
Dann hab ich noch im Menü-Editor 4 unsichtbare Menüs erstellt (Ablage1_save, Ablage1_load, Ablage2_save und Ablage 2_load) Diesen Menüeinträgen hab ich per Shortcut im Menü-Editor eine Tastenkombination zugewiesen.
Wenn man diese Tastenkombinationen benutzt, kommt dementsprechend das Click-Ereignis, nach dem du gefragt hast.

Wie es aussieht, muss ich mich in nächster Zeit mehr mit den API-Funktionen beschäftigen. Ich muss gestehen, ich hab im Moment noch nicht mal den leisesten Schimmer, was API bedeutet, aber das wird sich ändern^^

Hallo,

Ich hab im Internet eine schöne Vorlage für ein Programm
gefunden, dass per Klick auf einen Button die Userform
verschwinden lässt und im Tray ein Symbol erscheinen lässt.

OK.

Das Programm hab ich in soweit verändert, dass es anstatt beim
Klicken des Buttons, beim Laden der Userform die selbige
unsichtbar macht und zum Tray-Icon minimiert.
Dann hab ich noch im Menü-Editor 4 unsichtbare Menüs erstellt
(Ablage1_save, Ablage1_load, Ablage2_save und Ablage 2_load)
Diesen Menüeinträgen hab ich per Shortcut im Menü-Editor eine
Tastenkombination zugewiesen.

Auch OK. Die funktioniert aber nur, wenn die Form nicht unsichtbar ist.

Wenn Du bei unsichtbarer Form auf Tasten reagieren möchtest, dann sieh Dir das mal an …

Option Explicit

Private Declare Function GetAsyncKeyState Lib "user32" \_
 (ByVal vKey As Long) As Integer

Private Sub Form\_Load()
 Timer1.Interval = 300
 Timer1.Enabled = True
End Sub

Private Sub Timer1\_Timer()
 Dim i As Integer
 For i = 32 To 128
 If GetAsyncKeyState(i) 0 Then
 List1.AddItem Chr(i)
 Exit For
 End If
 Next
End Sub

Gruß Rainer

Hallo,

der Code leicht verändert ist auch lustig.
Wenn Du das Programm minimierst, kannst Du in der Taskleiste beobachten, daß es auf Strg+D/Strg+F geagiert, in der Taskleiste wechsellt die Schrift.

Keine großartig neue Erkenntnis, aber bevor Du Dir den Kopf an der Tastenkombination zerbrichst … :smile:

Option Explicit

Private Declare Function GetAsyncKeyState Lib "user32" \_
 (ByVal vKey As Long) As Integer

Private Sub Form\_Load()
 Timer1.Interval = 200
 Timer1.Enabled = True
End Sub

Private Sub Timer1\_Timer()
 Dim i As Integer
 Dim arr(122) As Boolean
 For i = 10 To 127
 If GetAsyncKeyState(i) 0 Then
 arr(i) = True
 End If
 Next
 If arr(17) = True And arr(68) = True Then
 Me.Caption = "D"
 End If
 If arr(17) = True And arr(70) = True Then
 Me.Caption = "F"
 End If
End Sub

Hallo,
Soweit ist mir alles klar, allerdings hab ich heute mal debuggt, um nachzuschauen, ob das mit dem Füllen der Ablage-Variablen funktioniert. VB wirft mir beim Debuggen die Meldung „Typen unverträglich“ an den Kopf, wenn es die Zeile „Clipboard.SetData (Ablage1_Pic)“ durchgeht. MSDN benutzt bei seinem Beispiel zur SetData-Methode eine Object-Variable und keine Byte-Variable.
Also hab ich das mal testweise geändert. Es meckerte nicht mehr. Doch bei der Zeile „Ablage2_Pic = Clipboard.GetData“ gab er den Laufzeitfehler 91 aus „Objektvariable oder With-Blockvariable nicht festgelegt“. Wo liegt das Problem? Deklariert hab ich die Variable…

Dim Ablage1 As String
Dim Ablage1\_Pic As Object
Dim Ablage2 As String
Dim Ablage2\_Pic As Object
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

...
If arr(17) = True And arr(68) = True Then
 KeyAscii = 3
 Ablage2 = Clipboard.GetText
 Ablage2\_Pic = Clipboard.GetData
End If
If arr(17) = True And arr(70) = True Then
 Clipboard.SetText (Ablage2)
 Clipboard.SetData (Ablage2\_Pic)
 KeyAscii = 16
End If

mfg Koopa

Hallo,

Du hast nur das falsche Objekt gewählt und ein ‚Set‘ vergessen.

Option Explicit

Dim Ablage2\_pic As New StdPicture

Private Sub Command1\_Click()
 Set Ablage2\_pic = Clipboard.GetData
End Sub

Private Sub Command2\_Click()
 Picture1.Picture = Ablage2\_pic
End Sub

Gruß Rainer

Wieso denn jetzt auf einmal „As New StdPicture“?

If arr(17) = True And arr(67) = True Then
 Ablage1 = Clipboard.GetText
 Set Ablage1\_Pic2 = Clipboard.GetData
End If
If arr(17) = True And arr(86) = True Then
 Clipboard.SetText (Ablage1)
 Clipboard.SetData (Ablage1\_Pic)
End If
If arr(17) = True And arr(68) = True Then
 KeyAscii = 3 '(= Strg + C)
 Ablage2 = Clipboard.GetText
 Set Ablage2\_Pic2 = Clipboard.GetData
End If
If arr(17) = True And arr(70) = True Then
 Clipboard.SetText (Ablage2)
 Clipboard.SetData (Ablage2\_Pic)
 KeyAscii = 16 '(= Strg + V)
End If

Wenn ich „New StdPicture“ statt „Object“ nehme, bekomm ich in der Zeile
„Clipboard.SetData (Ablage1_Pic)“ „Typen unverträglich“
Was, und ob ich eine Fehlermeldung bei „Object“ bekomme, nachdem ich „Set“ hinzugefügt hab, kann ich grad nicht sagen. Ich melde mich heute Abend nochmal, da ich keine Zeit mehr hab.

Und ich weiß, dass dort ein Denkfehler bezüglich der Tastenkombinationen drin ist. Wenn ich beim Druck ob Strg + D, Strg + C simuliere speichert er den selben Inhalt in beiden Ablagen. Also hab ich mich dazu umentschieden die Tastenkombinationen zu „Strg + Alt + C“, „Strg + Alt + V“, „Strg + Alt + D“ und „Strg + Alt + F“ zu ändern. Genau deswegen kann ich grad nicht „Object“ testen, weil ziemlich alle Programme auf „Strg + D“ reagieren.

Jemand kennt nicht zufällig eine gute Seite, wo man die Ascii-Codes zu den Tastaturtasten herrausfinden kann? Ich bräuchte nämlich den Code für die Alt-Taste.

mfg Koopa

Hallo,

„Clipboard.SetData (Ablage1_Pic)“ „Typen unverträglich“

Ja, mach mal die Klammern weg. :smile:

Gruß Rainer

Private Sub Timer1\_Timer()
Dim i As Integer
Dim arr(122) As Boolean
For i = 10 To 127
 If GetAsyncKeyState(i) 0 Then
 arr(i) = True
 End If
Next
If arr(17) = True And arr(16) = True And arr(67) = True Then
 Ablage1 = Clipboard.GetText
 Set Ablage1\_Pic = Clipboard.GetData
End If
If arr(17) = True And arr(16) = True And arr(86) = True Then
 Clipboard.SetText Ablage1
 Clipboard.SetData Ablage1\_Pic
End If
If arr(17) = True And arr(16) = True And arr(68) = True Then
 KeyAscii = 3
 Ablage2 = Clipboard.GetText
 Set Ablage2\_Pic = Clipboard.GetData
End If
If arr(17) = True And arr(16) = True And arr(70) = True Then
 Clipboard.SetText Ablage2
 Clipboard.SetData Ablage2\_Pic
 KeyAscii = 16
End If
End Sub

Ich hab statt „Alt“ dazuzunehmen jetzt „Shift“ genommen, weil die Kombinationen dann weiterhin mit einer Hand betätigt werden können und es sich auch keinen Ascii-Code für die Alt-Taste auffinden lies.

KeyAscii = 16 ist doch „Strg + V“… aber wenn 16 = „Strg +V“ ist, warum ist die Shift-Taste auch mit der Value 16 belegt? (Quelle: msdn)
Entweder liegt es daran, dass nichts in die Ablagen gespeichert wird oder es hat sich irgendwo ein Denkfehler eingeschlichen.
Ich kann außerdem auf mysteriöse Art und Weise nicht mehr das Variablen-Überwachungsfenster sehen, wenn ich das Programm starte…

Hallo,

KeyAscii = 16 ist doch „Strg + V“…

Nein. 16 ist der Tastencode der Shifttaste. 17 ist Strg und 18 Alt.
V ist 86. Das sind aber tastencodes, die nicht immer mit dem ASCII-Code identisch sind.

aber wenn 16 = „Strg +V“ ist,

Ist es nicht.

Falls Du die ASCII-Tabelle zu Hilfe genommen hast, war das falsch. :smile:

Ich bau mir immer schnell ein kleines Programm, wenn ich Tastencode brauche und sehe damit nach. Taste Tippen, Code ablesen.

Option Explicit

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Command1\_Click()
 List1.Clear
End Sub

Private Sub Timer1\_Timer()
 Dim cnt As Integer
 For cnt = 1 To 128
 If GetAsyncKeyState(cnt) 0 Then
 List1.AddItem cnt
 While GetAsyncKeyState(cnt) 0
 Wend
 End If
 Next cnt
End Sub

Gruß Rainer

Hallo,

eine Frage:

Was soll hier …

If arr(17) = True And arr(16) = True And arr(70) = True Then
 Clipboard.SetText Ablage2
 Clipboard.SetData Ablage2\_Pic
 KeyAscii = 16
End If

Keyascii = 16 bewirken?

Wenn Du ‚Option Explicit‘ über dein Projet schreibst, wird Dir VB erzählen, daß es die Variable ‚KeyAscii‘ nicht kennt. So legt es die Variable halt an und schreibt da eine 16 rein, weil du das so wolltest. Es bewirkt aber nichts.

Ich nehme an, Du möchtest an dieser Stelle die Shifttaste drücken, warum ist mir unklar, aber das funktioniert so nicht.

Wenn Du eine Taste drücken möchtest, dann geht das mit

SendKeys [Taste]

Du hast ja mal von Strg & V gesprochen, ‚Inhalt einfügen‘, das wäre dann …

SendKeys „^V“, 1

‚, 1‘ bedeutet hier: ‚Warte mit dem Fortsetzen des Programms, bis die Tastenkombination verarbeitet wurde‘.

Gruß Rainer

Hallo,
hehe kommt davon, wenn man sich aus anderen Programmen einfach mal was abguckt und man nicht den Code genau durchliest^^"
Naja jedenfalls klappt jetzt fast alles.
Wenn ich Bilder wieder einfüge (ich benutze zum testen Paint, da es anscheinend das einzigste Windows-Programm neben dem Editor ist, dass nicht auf „Strg + Shift + D“ reagiert), bekomm ich das 16x16 Pixel große Symbol des Visual Component Managers eingefügt statt des vorher kopierten Bildes.
mfg Koopa

Hallo Koopa,

Wenn ich Bilder wieder einfüge …
bekomm ich das 16x16 Pixel große Symbol des Visual Component
Managers eingefügt statt des vorher kopierten Bildes.

was machst Du in welcher Reihenfolge?

Bild kopieren, dann VB starten, dann Programm ausführen?

VB verwendet beim Start die Zwischenablage für irgendetwas.
Wenn Du ein Bild kopierst, VB nur startest und wieder schließt, ist das Bild schon nicht mehr in der Zwischenablage. Kann das die Ursache sein?

Wenn Du erst das Programm startest, minimiertst, dann das Bild kopierst … einfügst, wird das Ergebnis eventuell anders aussehen.

Gruß Rainer

Hallo Rainer,

1.Ich starte VB,
2.starte das Programm,
3.öffne Paint,
4.kritzle irgendwas,
5.markiere es,
6.drücke „Strg + Shift + D/C“ und
7.drücke „Strg + Shift + F/V“ und dann bekomm ich das Symbol reinkopiert.

Hi,

1.Ich starte VB,
2.starte das Programm,
3.öffne Paint,
4.kritzle irgendwas,
5.markiere es,
6.drücke „Strg + Shift + D/C“ und
7.drücke „Strg + Shift + F/V“ und dann bekomm ich das Symbol
reinkopiert.

hmmm. Das soll so funktionieren.
Da hilft wohl nur der Debugger, um den Denkfehler zu finden.

Scheinbar sicherst Du das Bildchen, das VB in die Zwischenablage schiebt und fügst das ein, statt dem Bild. Wie das passiert ist so schwer zu sagen.

Gruß Rainer