XbpClipBoard() und Filelist
Moderator: Moderatoren
- Schubi
- Rekursionen-Architekt
- Beiträge: 139
- Registriert: Mi, 05. Okt 2005 15:10
- Wohnort: Wiesloch
- Hat sich bedankt: 5 Mal
XbpClipBoard() und Filelist
Hallo zusammen,
eine Frage zu XbpClipBoard:
Warum kann man unter Windows ins Clipboard kopierte Files mit
aFiles := oClipBoard:getBuffer(XBPCLPBRD_FILELIST)
auslesen, aber nicht mit
oClipBoard:setBuffer(aFiles, XBPCLPBRD_FILELIST) schreiben?
Hat jemand eine Idee, wie man das realieren kann?
eine Frage zu XbpClipBoard:
Warum kann man unter Windows ins Clipboard kopierte Files mit
aFiles := oClipBoard:getBuffer(XBPCLPBRD_FILELIST)
auslesen, aber nicht mit
oClipBoard:setBuffer(aFiles, XBPCLPBRD_FILELIST) schreiben?
Hat jemand eine Idee, wie man das realieren kann?
Grüße Steffen
-
- Rekursionen-Architekt
- Beiträge: 151
- Registriert: Di, 11. Mai 2010 16:27
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
Re: XbpClipBoard() und Filelist
möglicherweise liegt da dein problem....
Die Methode :setBuffer() überträgt Daten in das Clipboard. Dabei können drei verschiedene Standarddatenformate in das Clipboard geschrieben werden: Textdaten im ASCII Format oder Grafikdaten im Format einer Bitmap oder einer Meta-Datei. Die Methode erkennt in diesen Fällen das Datenformat anhand des Datentyps, der im Parameter <xBuffer> übergeben wurde. Wenn Grafikdaten in das Clipboard übertragen werden sollen, müssen sie in Form eines XbpBitmap-Objekts oder XbpMetafile-Objekts angegeben werden. Soll allerdings ein benutzerdefiniertes Format zum Speichern der Daten in die Zwischenablage verwendet werden, muß im Parameter <nFormatId> die Id des Formats angeben werden, die von :registerFormat() beim Registrieren des Formats zurückgeben wurde.
Bevor die Methode :setBuffer() ausgeführt werden kann, muß das Clipboard durch :open() geöffnet worden sein. Außerdem muß die Methode :clear() verwendet werden, um die sich aktuell in der Zwischenablage befindenden Daten zu löschen. Wurde :clear() nicht aufgerufen, schlägt die Methode :setBuffer() fehl.
Die Methode :setBuffer() überträgt Daten in das Clipboard. Dabei können drei verschiedene Standarddatenformate in das Clipboard geschrieben werden: Textdaten im ASCII Format oder Grafikdaten im Format einer Bitmap oder einer Meta-Datei. Die Methode erkennt in diesen Fällen das Datenformat anhand des Datentyps, der im Parameter <xBuffer> übergeben wurde. Wenn Grafikdaten in das Clipboard übertragen werden sollen, müssen sie in Form eines XbpBitmap-Objekts oder XbpMetafile-Objekts angegeben werden. Soll allerdings ein benutzerdefiniertes Format zum Speichern der Daten in die Zwischenablage verwendet werden, muß im Parameter <nFormatId> die Id des Formats angeben werden, die von :registerFormat() beim Registrieren des Formats zurückgeben wurde.
Bevor die Methode :setBuffer() ausgeführt werden kann, muß das Clipboard durch :open() geöffnet worden sein. Außerdem muß die Methode :clear() verwendet werden, um die sich aktuell in der Zwischenablage befindenden Daten zu löschen. Wurde :clear() nicht aufgerufen, schlägt die Methode :setBuffer() fehl.
Ahoile aus dem Süden
- Schubi
- Rekursionen-Architekt
- Beiträge: 139
- Registriert: Mi, 05. Okt 2005 15:10
- Wohnort: Wiesloch
- Hat sich bedankt: 5 Mal
Re: XbpClipBoard() und Filelist
Hallo Flanelli,
soweit alles klar, aber XBPCLPBRD_FILELIST ist kein benutzerdefiniertes Format, es wird von Alaska vorgegeben und lässt sich auch problemlos mit :getbuffer() auslesen.
Nur andersherum das :setbuffer() funktioniert eben nicht.
Es ist zwar auch nicht explizit dokumentiert, aber es hätte ja sein können, jemand weiß einen Trick.
soweit alles klar, aber XBPCLPBRD_FILELIST ist kein benutzerdefiniertes Format, es wird von Alaska vorgegeben und lässt sich auch problemlos mit :getbuffer() auslesen.
Nur andersherum das :setbuffer() funktioniert eben nicht.
Es ist zwar auch nicht explizit dokumentiert, aber es hätte ja sein können, jemand weiß einen Trick.
Grüße Steffen
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: XbpClipBoard() und Filelist
XbpClipoard:SetBuffer() unterstützt meines Wissens weniger Formate als :GetBuffer, und die FILELIST gehört leider nicht dazu.
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: XbpClipBoard() und Filelist
hi,
Das du unter Xbase++ ein Array bekommst liegt am Wrapper von Alaska die es dir so präsentieren.
wenn du also ein Array an das Clipboard übergeben willst musst du es "serialisieren" d.h. einen String daraus machen.
das "einfache" ClipBoard kann nur CF_TEXT und kein "Array"
Das du unter Xbase++ ein Array bekommst liegt am Wrapper von Alaska die es dir so präsentieren.
wenn du also ein Array an das Clipboard übergeben willst musst du es "serialisieren" d.h. einen String daraus machen.
Code: Alles auswählen
Function NachClp(aArray)
LOCAL lRet := .F.
LOCAL cText := ""
LOCAL ii, iMax := LEN(aArray)
FOR ii := 1 TO iMax
ctext += aArray[ii] + CRLF
NEXT
oClipBoard := XbpClipBoard():new():create()
oClipBoard:open()
oClipBoard:clear()
lRet := oClipBoard:setBuffer(cText)
oClipBoard:close()
RETURN lRet
gruss by OHR
Jimmy
Jimmy
- Schubi
- Rekursionen-Architekt
- Beiträge: 139
- Registriert: Mi, 05. Okt 2005 15:10
- Wohnort: Wiesloch
- Hat sich bedankt: 5 Mal
Re: XbpClipBoard() und Filelist
Danke Jimmy,
dann hast du eine Liste der Files als Text in der Zwischenablage.
Unter Windows kannst du sie jedoch so nicht einfügen.
Ich hatte schon Varianten davon aus einem Delphi-Forum, aber das funktioniert alles nicht, da Windows wahrscheinlich den Typ nicht als File-Liste erkennt.
dann hast du eine Liste der Files als Text in der Zwischenablage.
Unter Windows kannst du sie jedoch so nicht einfügen.
Ich hatte schon Varianten davon aus einem Delphi-Forum, aber das funktioniert alles nicht, da Windows wahrscheinlich den Typ nicht als File-Liste erkennt.
Grüße Steffen
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: XbpClipBoard() und Filelist
hi,
jetzt verstehe ich nicht ganz was zu möchtest.
wenn ich ein Notepad öffne bekomme ich doch die Liste der Files.
auch jedes "Eingabe" Feld eignet sich für Crtl-V
bitte beschreibe noch mal genau was du meinst.
p.s. siehe dir mal DragDataObject() an was ähnlich wie Clipboard() ist.
es gibt "Get" aber kein "Set" denn dazu müsste die App als "Sender" registriert sein.
jetzt verstehe ich nicht ganz was zu möchtest.
wenn ich ein Notepad öffne bekomme ich doch die Liste der Files.
auch jedes "Eingabe" Feld eignet sich für Crtl-V
bitte beschreibe noch mal genau was du meinst.
p.s. siehe dir mal DragDataObject() an was ähnlich wie Clipboard() ist.
es gibt "Get" aber kein "Set" denn dazu müsste die App als "Sender" registriert sein.
gruss by OHR
Jimmy
Jimmy
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: XbpClipBoard() und Filelist
Konkatinierte Strings als vermeintliche Dateiliste wird kaum ein D&D-Empfänger als solche interpretieren, Jimmy.
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: XbpClipBoard() und Filelist
natürlich nichts "echtes" aber man kann es simulieren.
hier ein "DragDrop" wo ich aus einem Listview die markierten Items "ziehe" und den TEXT in ein WC_EDIT oder RTF "einfüge" beim "fallen-lassen"
Code: Alles auswählen
METHOD DXE_ListView:Prep4Drag( nNo )
LOCAL aDropPos := ::GetCursorPos()
LOCAL aData := ::getData()
LOCAL nLen := LEN( aData )
LOCAL i
LOCAL cString := ""
LOCAL nHwnd := 0
LOCAL cItem
LOCAL aFiles
LOCAL oClipBoard
LOCAL nEdit := 0
LOCAL nError := 0
LOCAL nMax := 0
LOCAL oDlg := LastDialog( self )
// count lengh
FOR i := 1 TO nLen
cItem := ::cStartDir + ::getItem( aData[ i ] ) + CRLF // CHR(0)
cString += cItem
NEXT
nMax := LEN( cString )
nHwnd := ::WindowFromPoint( aDropPos )
DO CASE
CASE nHwnd = oDlg:oLWLeft:hLv
IF nNo = 1
// MOVE inside Listview
ELSE
PostAppEvent( xbeP_Activate,,, LastDialog( self ) :oPB06 )
ENDIF
CASE nHwnd = oDlg:oLWRight:hLv
IF nNo = 2
// MOVE inside Listview
ELSE
PostAppEvent( xbeP_Activate,,, LastDialog( self ) :oPB06 )
ENDIF
CASE nHwnd > 0 // external EDIT Control
// Clipboard-Objekt erzeugen
oClipBoard := XbpClipBoard() :new() :create()
oClipBoard:open()
oClipBoard:clear()
oClipBoard:setBuffer( cString )
oClipBoard:close()
@ User32:ShowWindow( nHwnd, SW_RESTORE )
@ User32:BringWindowToTop( nHwnd )
@ User32:SetForegroundWindow( nHwnd )
@ User32:SetFocus( nHwnd )
::keybd_event( VK_CONTROL, 0, 0, 0 )
::keybd_event( ASC( "V" ), 0, 0, 0 )
::keybd_event( ASC( "V" ), 0, KEYEVENTF_KEYUP, 0 )
::keybd_event( VK_CONTROL, 0, KEYEVENTF_KEYUP, 0 )
ENDCASE
RETURN NIL
gruss by OHR
Jimmy
Jimmy
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: XbpClipBoard() und Filelist
Ich denke, es geht Schubi darum, aus Xbase-Programmen eine Dateiliste an die Zwischenablage zu übergeben, die Drittprogramme auch als eine solche erkennen. Wenn ich in meiner eigenen Welt unterwegs bin, kann ich auch ein Array in einen String umwandeln und wieder zurück.
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: XbpClipBoard() und Filelist
dann so Schubi mal sagen wofür er es genau verwenden will.
in vielen Fällen reicht die "Simulation" aus um Daten "aus" Xbase++ "in" eine andere App zu bringen.
in vielen Fällen reicht die "Simulation" aus um Daten "aus" Xbase++ "in" eine andere App zu bringen.
gruss by OHR
Jimmy
Jimmy
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: XbpClipBoard() und Filelist
Das hat er doch geschrieben, Jimmy. "Unter Windows kannst Du sie jedoch so nicht einfügen." Ich denke, darin liegt auch die Schwierigkeit bei dieser Systematik, denn die FileList im Clipboard hängt aus Explorersicht an einem Cut- oder an einem Copy-Vorgang. Bei einem Copy-Vorgang sind die Originale noch da, bei einem Cut-Vorgang muss es neben der FileList noch weitere Informationen geben, da die Originale nicht mehr da sind, wo sie waren, aber dennoch (also nicht nur die Namen, sondern auch die Inhalte) eingefügt werden können. Wenn man einen Cut-Vorgang simulieren wollen würde, müsste man aber mehr als nur die FileList in der Zwischenablage zur Verfügung stellen, nämlich die Date(ie)n selbst auch. Deshalb geht das nicht und hat auch so keinen Sinn. Anders gesagt: Wenn Du eine FileList an die Zwischenablage schiebst, ist nur ein Teil des Jobs getan. Deshalb ist das eine Nur-Lese-Sache.
Herzlich,
Tom
Tom
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2128
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: XbpClipBoard() und Filelist
Servus Steffen,
das geht z. B. mit PowerShell. Mit RunShell() bzw. ShellexecuteA sollte das möglich sein. Habs aber nicht getestet.
das geht z. B. mit PowerShell. Mit RunShell() bzw. ShellexecuteA sollte das möglich sein. Habs aber nicht getestet.
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: XbpClipBoard() und Filelist
hi Tom,
https://github.com/microsoft/winfile
das was Xbase++ im Clipboard "lesen" kann ist das selbe was es "schreiben" kann.
da wir "nur" von eine FILELIST reden sehe ich nicht wo es nicht gehen sollte
---
eine FILELIST sind nur die "Namen" und nicht der "Inhalt" die man vom Explorer bekommt und nicht über das Clipboard gehen.
die FILELIST kann ich z.b. in ein "Eingabe-Feld" wie zum öffnen einer Datei ziehen.
wenn der User aus der Xbase++ App was in ein Word Dokument per Crtl-C / Crtl-V bekommt dann kann man das auch per Software als "DragDrop-Simulation" machen.
wenn Schubi etwas anderes meint möge er bitte eine konkrete Situation schildern wo er das Problem hat.
das der Explorer auch OLE-DragDrop kann "sehe" ich im Source von "WinFile"Unter Windows kannst du sie jedoch so nicht einfügen.
https://github.com/microsoft/winfile
das was Xbase++ im Clipboard "lesen" kann ist das selbe was es "schreiben" kann.
da wir "nur" von eine FILELIST reden sehe ich nicht wo es nicht gehen sollte
---
eine FILELIST sind nur die "Namen" und nicht der "Inhalt" die man vom Explorer bekommt und nicht über das Clipboard gehen.
die FILELIST kann ich z.b. in ein "Eingabe-Feld" wie zum öffnen einer Datei ziehen.
wenn der User aus der Xbase++ App was in ein Word Dokument per Crtl-C / Crtl-V bekommt dann kann man das auch per Software als "DragDrop-Simulation" machen.
wenn Schubi etwas anderes meint möge er bitte eine konkrete Situation schildern wo er das Problem hat.
gruss by OHR
Jimmy
Jimmy
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: XbpClipBoard() und Filelist
Wenn das Clipboard aus unserer Sicht (nur) eine Filelist enthält, enthält es tatsächlich mehr als das. Lies einfach, was ich geschrieben habe, Jimmy. Danke.
Herzlich,
Tom
Tom
- Schubi
- Rekursionen-Architekt
- Beiträge: 139
- Registriert: Mi, 05. Okt 2005 15:10
- Wohnort: Wiesloch
- Hat sich bedankt: 5 Mal
Re: XbpClipBoard() und Filelist
Hallo und danke an alle,
wie ich geschrieben hatte, ging es darum, die kopierten Files unter Windows auch wieder einzufügen.
Habe die Sache inzwischen einfacher gelöst, indem die Files in einen speziellen "Zwischenablagen"-Ordner kopiert werden, aus dem sie der Bearbeiter dann weiterbenutzen kann.
wie ich geschrieben hatte, ging es darum, die kopierten Files unter Windows auch wieder einzufügen.
Habe die Sache inzwischen einfacher gelöst, indem die Files in einen speziellen "Zwischenablagen"-Ordner kopiert werden, aus dem sie der Bearbeiter dann weiterbenutzen kann.
Grüße Steffen
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: XbpClipBoard() und Filelist
Allgemein gesprochen: Die Zwischenablage ist kein gutes Protokoll für den Austausch von Daten zwischen Anwendungen. Man hat sie nicht exklusiv, es gibt keine Rückgabewerte und keine Bestätigung durch den Empfänger. Und der Prozess kann gestört werden, das ganze ist sehr wackelig - und darauf ausgelegt, dass Cut und Paste unmittelbar aufeinander folgen. Wenn man z.B. Dateien über die Zwischenablage von einem Remoteserver holt und das dauert ein wenig, killt jeder Zugriff auf das Clipboard den gesamten Vorgang. Für Datenaustausch sollte man andere Protokolle wählen.
Herzlich,
Tom
Tom
- Marcus Herz
- 1000 working lines a day
- Beiträge: 862
- Registriert: Mo, 16. Jan 2006 8:13
- Wohnort: Allgäu
- Hat sich bedankt: 40 Mal
- Danksagung erhalten: 197 Mal
- Kontaktdaten:
Re: XbpClipBoard() und Filelist
Hab den Beitrag eben erst entdeckt. Dateiliste (mit Inhalt) in die Zwischenablage einfügen,. ist in Xclass enthalten. Kann ich in Regensburg zeigen.
(ist auch in der Demo von List & Label 27 enthalten, demnächst als Beta erhältlich)
Was ich gerade suche: EINEN von vielen markierten Anhängen aus einer Mail per Drag&Drop auszulesen. Da kann ich gar nichts finden. Jemnad einen Tipp?
(MAil mit allen Anhängen ist kein Problem)
(ist auch in der Demo von List & Label 27 enthalten, demnächst als Beta erhältlich)
Was ich gerade suche: EINEN von vielen markierten Anhängen aus einer Mail per Drag&Drop auszulesen. Da kann ich gar nichts finden. Jemnad einen Tipp?
(MAil mit allen Anhängen ist kein Problem)
Gruß Marcus
Den Kopf in den Sand zu stecken verbessert die Welt auch nicht.
Den Kopf in den Sand zu stecken verbessert die Welt auch nicht.
- Marcus Herz
- 1000 working lines a day
- Beiträge: 862
- Registriert: Mo, 16. Jan 2006 8:13
- Wohnort: Allgäu
- Hat sich bedankt: 40 Mal
- Danksagung erhalten: 197 Mal
- Kontaktdaten:
Re: XbpClipBoard() und Filelist
Bin einen Schritt weiter: erkenn einen markierten Anhang, wenn dieser mit Inhalt sichtbar ist. Nur den Dateinamen draggen, das fehlt noch.
Gruß Marcus
Den Kopf in den Sand zu stecken verbessert die Welt auch nicht.
Den Kopf in den Sand zu stecken verbessert die Welt auch nicht.