XbpClipBoard() und Filelist

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Schubi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 138
Registriert: Mi, 05. Okt 2005 15:10
Wohnort: Wiesloch

XbpClipBoard() und Filelist

Beitrag von Schubi » Mo, 08. Jun 2020 15:16

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?
Grüße Steffen

flanelli
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 106
Registriert: Di, 11. Mai 2010 16:27

Re: XbpClipBoard() und Filelist

Beitrag von flanelli » Mo, 08. Jun 2020 15:47

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.
Ahoile aus dem Süden

Benutzeravatar
Schubi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 138
Registriert: Mi, 05. Okt 2005 15:10
Wohnort: Wiesloch

Re: XbpClipBoard() und Filelist

Beitrag von Schubi » Mo, 08. Jun 2020 16:55

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.
Grüße Steffen

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8089
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 16 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Tom » Mo, 08. Jun 2020 17:17

XbpClipoard:SetBuffer() unterstützt meines Wissens weniger Formate als :GetBuffer, und die FILELIST gehört leider nicht dazu.
Herzlich,
Tom

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12381
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: XbpClipBoard() und Filelist

Beitrag von AUGE_OHR » Di, 09. Jun 2020 23:48

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
gruss by OHR
Jimmy

Benutzeravatar
Schubi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 138
Registriert: Mi, 05. Okt 2005 15:10
Wohnort: Wiesloch

Re: XbpClipBoard() und Filelist

Beitrag von Schubi » Mi, 10. Jun 2020 8:25

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.
Grüße Steffen

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12381
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: XbpClipBoard() und Filelist

Beitrag von AUGE_OHR » Mi, 10. Jun 2020 9:35

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.
gruss by OHR
Jimmy

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8089
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 16 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Tom » Mi, 10. Jun 2020 10:46

Konkatinierte Strings als vermeintliche Dateiliste wird kaum ein D&D-Empfänger als solche interpretieren, Jimmy.
Herzlich,
Tom

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12381
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: XbpClipBoard() und Filelist

Beitrag von AUGE_OHR » Do, 11. Jun 2020 4:26

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.
gruss by OHR
Jimmy

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8089
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 16 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Tom » Do, 11. Jun 2020 7:13

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

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12381
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: XbpClipBoard() und Filelist

Beitrag von AUGE_OHR » Do, 11. Jun 2020 21:16

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.
gruss by OHR
Jimmy

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8089
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 16 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Tom » Do, 11. Jun 2020 21:23

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

Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1792
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Danksagung erhalten: 1 Mal

Re: XbpClipBoard() und Filelist

Beitrag von Werner_Bayern » Do, 11. Jun 2020 22:51

Servus Steffen,

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 light!>

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12381
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: XbpClipBoard() und Filelist

Beitrag von AUGE_OHR » Fr, 12. Jun 2020 4:46

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.
gruss by OHR
Jimmy

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8089
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 16 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Tom » Fr, 12. Jun 2020 9:31

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

Benutzeravatar
Schubi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 138
Registriert: Mi, 05. Okt 2005 15:10
Wohnort: Wiesloch

Re: XbpClipBoard() und Filelist

Beitrag von Schubi » Fr, 12. Jun 2020 13:10

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.
Grüße Steffen

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12381
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: XbpClipBoard() und Filelist

Beitrag von AUGE_OHR » Sa, 13. Jun 2020 3:21

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".
gruss by OHR
Jimmy

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8089
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 16 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Tom » Sa, 13. Jun 2020 9:28

Oh, wow, endlich kapiert. 8)
Herzlich,
Tom

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8089
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 16 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Tom » Sa, 13. Jun 2020 10:23

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

Antworten