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
Hat sich bedankt: 3 Mal

XbpClipBoard() und Filelist

Beitrag 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?
Grüße Steffen
flanelli
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 125
Registriert: Di, 11. Mai 2010 16:27
Hat sich bedankt: 1 Mal
Danksagung erhalten: 6 Mal

Re: XbpClipBoard() und Filelist

Beitrag 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.
Ahoile aus dem Süden
Benutzeravatar
Schubi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 138
Registriert: Mi, 05. Okt 2005 15:10
Wohnort: Wiesloch
Hat sich bedankt: 3 Mal

Re: XbpClipBoard() und Filelist

Beitrag 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.
Grüße Steffen
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8494
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 24 Mal
Danksagung erhalten: 101 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Tom »

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: 12597
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 3 Mal
Danksagung erhalten: 13 Mal

Re: XbpClipBoard() und Filelist

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
Schubi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 138
Registriert: Mi, 05. Okt 2005 15:10
Wohnort: Wiesloch
Hat sich bedankt: 3 Mal

Re: XbpClipBoard() und Filelist

Beitrag 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.
Grüße Steffen
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12597
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 3 Mal
Danksagung erhalten: 13 Mal

Re: XbpClipBoard() und Filelist

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8494
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 24 Mal
Danksagung erhalten: 101 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Tom »

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: 12597
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 3 Mal
Danksagung erhalten: 13 Mal

Re: XbpClipBoard() und Filelist

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8494
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 24 Mal
Danksagung erhalten: 101 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12597
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 3 Mal
Danksagung erhalten: 13 Mal

Re: XbpClipBoard() und Filelist

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8494
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 24 Mal
Danksagung erhalten: 101 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1893
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 12 Mal
Danksagung erhalten: 23 Mal

Re: XbpClipBoard() und Filelist

Beitrag von Werner_Bayern »

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 lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12597
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 3 Mal
Danksagung erhalten: 13 Mal

Re: XbpClipBoard() und Filelist

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8494
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 24 Mal
Danksagung erhalten: 101 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Schubi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 138
Registriert: Mi, 05. Okt 2005 15:10
Wohnort: Wiesloch
Hat sich bedankt: 3 Mal

Re: XbpClipBoard() und Filelist

Beitrag 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.
Grüße Steffen
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12597
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 3 Mal
Danksagung erhalten: 13 Mal

Re: XbpClipBoard() und Filelist

Beitrag 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".
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8494
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 24 Mal
Danksagung erhalten: 101 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Tom »

Oh, wow, endlich kapiert. 8)
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8494
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 24 Mal
Danksagung erhalten: 101 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Marcus Herz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 410
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 13 Mal
Danksagung erhalten: 62 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag 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)
Gruß Marcus

Es gibt keine Grenzen, aber du kannst welche ziehen.
Benutzeravatar
Marcus Herz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 410
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 13 Mal
Danksagung erhalten: 62 Mal
Kontaktdaten:

Re: XbpClipBoard() und Filelist

Beitrag von Marcus Herz »

Bin einen Schritt weiter: erkenn einen markierten Anhang, wenn dieser mit Inhalt sichtbar ist. Nur den Dateinamen draggen, das fehlt noch.
Gruß Marcus

Es gibt keine Grenzen, aber du kannst welche ziehen.
Antworten