Seite 1 von 1

XbpClipBoard() und Filelist

Verfasst: Mo, 08. Jun 2020 15:16
von Schubi
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?

Re: XbpClipBoard() und Filelist

Verfasst: Mo, 08. Jun 2020 15:47
von flanelli
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.

Re: XbpClipBoard() und Filelist

Verfasst: Mo, 08. Jun 2020 16:55
von Schubi
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.

Re: XbpClipBoard() und Filelist

Verfasst: Mo, 08. Jun 2020 17:17
von Tom
XbpClipoard:SetBuffer() unterstützt meines Wissens weniger Formate als :GetBuffer, und die FILELIST gehört leider nicht dazu.

Re: XbpClipBoard() und Filelist

Verfasst: Di, 09. Jun 2020 23:48
von AUGE_OHR
hi,
Schubi hat geschrieben: Mo, 08. Jun 2020 15:16 oClipBoard:setBuffer(aFiles, XBPCLPBRD_FILELIST) schreiben?
Hat jemand eine Idee, wie man das realieren kann?
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

Re: XbpClipBoard() und Filelist

Verfasst: Mi, 10. Jun 2020 8:25
von Schubi
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.

Re: XbpClipBoard() und Filelist

Verfasst: Mi, 10. Jun 2020 9:35
von AUGE_OHR
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.

Re: XbpClipBoard() und Filelist

Verfasst: Mi, 10. Jun 2020 10:46
von Tom
Konkatinierte Strings als vermeintliche Dateiliste wird kaum ein D&D-Empfänger als solche interpretieren, Jimmy.

Re: XbpClipBoard() und Filelist

Verfasst: Do, 11. Jun 2020 4:26
von AUGE_OHR
Tom hat geschrieben: Mi, 10. Jun 2020 10:46 Konkatinierte Strings als vermeintliche Dateiliste wird kaum ein D&D-Empfänger als solche interpretieren, Jimmy.
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
damit kann ich die Items "aus" Xbase++ "in" ein Word Dokument einfügen was für den Anwender wie ein "DragDrop" funktioniert.

Re: XbpClipBoard() und Filelist

Verfasst: Do, 11. Jun 2020 7:13
von Tom
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.

Re: XbpClipBoard() und Filelist

Verfasst: Do, 11. Jun 2020 21:16
von AUGE_OHR
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.

Re: XbpClipBoard() und Filelist

Verfasst: Do, 11. Jun 2020 21:23
von Tom
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.

Re: XbpClipBoard() und Filelist

Verfasst: Do, 11. Jun 2020 22:51
von Werner_Bayern
Servus Steffen,

das geht z. B. mit PowerShell. Mit RunShell() bzw. ShellexecuteA sollte das möglich sein. Habs aber nicht getestet.

Re: XbpClipBoard() und Filelist

Verfasst: Fr, 12. Jun 2020 4:46
von AUGE_OHR
hi Tom,
Unter Windows kannst du sie jedoch so nicht einfügen.
das der Explorer auch OLE-DragDrop kann "sehe" ich im Source von "WinFile" :D
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.

Re: XbpClipBoard() und Filelist

Verfasst: Fr, 12. Jun 2020 9:31
von Tom
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.

Re: XbpClipBoard() und Filelist

Verfasst: Fr, 12. Jun 2020 13:10
von Schubi
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.

Re: XbpClipBoard() und Filelist

Verfasst: Sa, 13. Jun 2020 3:21
von AUGE_OHR
hi,
Schubi hat geschrieben: Fr, 12. Jun 2020 13:10 wie ich geschrieben hatte, ging es darum, die kopierten Files unter Windows auch wieder einzufügen.
OK, also "mit Inhalt".

Re: XbpClipBoard() und Filelist

Verfasst: Sa, 13. Jun 2020 9:28
von Tom
Oh, wow, endlich kapiert. 8)

Re: XbpClipBoard() und Filelist

Verfasst: Sa, 13. Jun 2020 10:23
von Tom
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.

Re: XbpClipBoard() und Filelist

Verfasst: Di, 20. Jul 2021 13:56
von Marcus Herz
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)

Re: XbpClipBoard() und Filelist

Verfasst: Di, 20. Jul 2021 15:11
von Marcus Herz
Bin einen Schritt weiter: erkenn einen markierten Anhang, wenn dieser mit Inhalt sichtbar ist. Nur den Dateinamen draggen, das fehlt noch.