Drag von Xb-Parts

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
olaf870
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 128
Registriert: Mi, 26. Okt 2005 18:41
Wohnort: Berlin
Kontaktdaten:

Drag von Xb-Parts

Beitrag von olaf870 »

Hallo,

ich will einen mit XbpBrowse angezeigten Datensatz in ein Formular "ziehen". Geht das mit dem DragDataObject() oder ist DragDataObject() nur für das Ziehen von Elementen aus Windows-Systemprogrammen gut?
Gruß
Olaf 870
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: Drag von Xb-Parts

Beitrag von Klaus Schuster »

Hallo Leute,

bisher hat niemand auf Olafs Frage reagiert. Hat vielleicht dennoch jemand neue Erkenntnisse, wie man Objekte innerhalb einer Anwendung (z.B. ein Bild aus einem Static in ein anderes Static) verschieben kann?
Gruß Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Drag von Xb-Parts

Beitrag von Tom »

Hallo, Klaus.

Das von Olaf erwähnte DragDataObject ist für die Interoperation zwischen Xbase++-Anwendungen und anderen Windows-Anwendungen gedacht. Innerhalb einer Xbase++-Anwendung sind hierfür die Objektvariablen und -slots "dropZone", "dragEnter" und "dragDrop" zu verwenden, wobei Du dann bestimmst, welche Daten wie bewegt werden und was sie auslösen. Ein Beispiel findest Du bei ":dropZone" in der Doku. Das ist letztlich relativ simpel.
Herzlich,
Tom
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: Drag von Xb-Parts

Beitrag von Klaus Schuster »

Hallo Tom,

auf dies alles bin ich schon gestossen und habe das Demoprogramm ausprobiert. Es funktioniert wenn ich Dateien etc. von aussen in die dropZone ziehe. Nur innerhalb bringe ich es einfach nicht hin. Wie teile ich z.B. dem Listboxelement mit, dass es gezogen werden kann und betroffen ist? Oder muss ich das nicht tun?

Du siehst mich auf unterster Ebene ratlos.
Gruß Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Drag von Xb-Parts

Beitrag von brandelh »

Hat nicht Steffen erklärt, dass Xbase Programme nur als ZIEL dienen können ?
Gruß
Hubert
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: Drag von Xb-Parts

Beitrag von Klaus Schuster »

Hallo Hubert,

da weißt Du wohl mehr als ich; es sieht jedoch fast so aus.
Gruß Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Drag von Xb-Parts

Beitrag von Tom »

Man kann aus allen Xbase-Parts auch draggen. Allerdings ist das ein wenig komplizierter. Man muss LbDown+LbMotion überwachen, eine abgeleitete Klasse verwenden, etwas Hokuspokus betreiben. Da ich Roger Donnays eXpress++ verwende, mache ich das allerdings nur an zwei, drei Stellen selbst. :wink:
Herzlich,
Tom
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: Drag von Xb-Parts

Beitrag von Klaus Schuster »

Hallo Tom,

machst Du es dann rudimentär, also ohne Veränderung des Mauszeigers, Bewegung des Objekts, usw., oder bildest Du dies alles nach? Anscheinend geht es mit eXpress++ einfach(er)?
Gruß Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Drag von Xb-Parts

Beitrag von Tom »

Hallo, Klaus.

Ich habe schon seit Ewigkeiten D&D-Funktionalitäten in meinen Anwendungen. Dafür überwache ich, wie gesagt, LbDown (es gibt auch erweiterte Funktionalitäten, bei denen dann RbDown verwendet wird) und die anschließenden Events. Riecht es nach D&D (auf LbDown folgt Motion, Lb ist immer noch down), wird ein kleiner Dialog erzeugt, der Mauszeiger ändert sich, auch abhängig davon, wo die Maus dann steht (mögliches Ziel oder kein mögliches Ziel). Die im Dialog enthaltenen Ziele reagieren entsprechend (LbUp und D&D ist aktiv). So kann man in einem ziemlich großen Planungssystem, das mehrere Browses, ein Hilfsfenster und noch ein paar andere Gimmicks anzeigt, innerhalb der Browses, über die Browses hinweg und zwischen den Hilfsfenstern und den Browses draggen und droppen. Das ist alles eine Frage des Eventhandlings. Nicht eben extrem simpel, aber auch nicht allzu kompliziert.

In seinem Update zu 1.9 SL1 hat Roger entsprechende Funktionalitäten eingebaut, so dass D&D out of the box funktioniert - jedenfalls prinzipiell. Man muss ein paar Slots bestücken, also Codeblöcke bauen, die im Fall der Fälle evaluiert werden. Dabei geht es um die Datenquellen, aber auch um die -ziele. D&D ist ja nichts weiter als eine allgemeine Brücke zwischen unterschiedlichen Controls. Welche Daten das eine liefert und das andere be-/verarbeitet, das muss man selbst regeln. Im einfachen Fall zeigt das Dragging auf einen bestimmten Datensatz einer bestimmten Workarea, und beim Droppen werden diese Daten eben verwendet. Im noch einfacheren Fall werden die Daten irgendwo abgelegt (STATIC, Get-Set-Funktion) und beim Droppen verwendet. It's up to you. Man kann auch eine Referenz auf das Quellobjekt droppen und dieses dann direkt im Ziel komplett auswerten.
Herzlich,
Tom
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: Drag von Xb-Parts

Beitrag von Klaus Schuster »

Hallo Tom,

und herzlichen Dank für Deine Gedanken! Ich werde mir zuerst eXpress++ ansehen, und dann ggf. etwas Eigenes entwickeln. Die Richtung ist zumindest klarer geworden.
Gruß Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Drag von Xb-Parts

Beitrag von AUGE_OHR »

Klaus Schuster hat geschrieben:Wie teile ich z.B. dem Listboxelement mit, dass es gezogen werden kann und betroffen ist? Oder muss ich das nicht tun?
die Frage ist "wohin" du was "draggen" willst ...

innerhalb einer Xbase++ Applikation ist es kein Problem aber du kannst nichts "aus" einer Xbase++ Applikation in eine andere Windows Applikation "draggen".

Grund : Xbase++ hat nur das Attribut WS_EX_ACCEPTFILES -> o:dropZone
Xbase++ hat nicht das IDataObject() welches zum "draggen" in eine andere Windows Applikation notwendig ist.

Workaround : wenn das Ziel ein "edit" Control ist kann man die Aktion durch das Clipboard schieben.
gruss by OHR
Jimmy
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: Drag von Xb-Parts

Beitrag von Klaus Schuster »

Hallo Jimmy,

Danke für Deine Infos. Ziel ist es, ein XbpBitmap aus einem XbpStatic-Rahmen in einen anderen XbpStatic-Rahmen zu verschieben.
Gruß Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Drag von Xb-Parts

Beitrag von Tom »

Hallo, Klaus.

Der Lösungsansatz muss sich mit zwei Aspekten beschäftigen: a) Wie wird das Drag&Drop erkannt und behandelt? b) Was geschieht während des Vorgangs?

Wie gesagt, im Prinzip ist das gar nicht so schwierig. LbDown über einem Part, das für das Draggen geeignet ist, setzt z.B. im Handler eine statische Variable, die markiert, dass aktuell ein Dragvorgang stattfindet. Der Mauszeiger ändert sich (SetPointer) und möglicherweise - sinnvollerweise - wird ein kleiner Dialog anzeigt, der etwa ein Thumbnail der Grafik enthalten kann, die verschoben werden soll, randlos. Fortan schaut der Handler, ob xbeM_Motion stattfindet, LbDown immer noch aktiv ist bzw. die statische Variable gesetzt ist. Währenddessen bleibt der Mauszeiger aktiv und der Dragdialog bewegt sich mit der Maus. Wenn sich beides über einem Objekt befindet, das kein Ziel sein darf, kann man entsprechend reagieren (Dialog verstecken, Mauszeiger in ein Warnsymbol verwandeln oder ähnliches). Wird nun LbUp verzeichnet, und die Maus befindet sich über einem möglichen Ziel, wurde der Drag-Vorgang erfolgreich beendet - in allen anderen Fällen wird der Dragvorgang abgebrochen, alle Variablen werden zurückgesetzt und der Mauszeiger wieder in den Normalzustand verwandelt. Man kann also, wenn alles richtig war, die Bitmap aus dem Quellobjekt holen und dem Zielobjekt zuweisen. Wenn man will, kann man zusätzliche Möglichkeiten implementieren, also z.B. bei Shift-LbDown eine Kopie verschieben, während man ohne Shift tatsächlich die Inhalte vertauscht oder solche Sachen. Und man kann es auch optisch auf die Spitze treiben, indem man den Presentation Space der Quelle kopiert und als Dragdialog halbtransparent mit der Maus führt. Das mache ich z.B. in einem komplexen Ownerdrawing-Browse, was zur Folge hat, dass sich die Zelle, die man bewegen will, quasi aus dem Browse herauslöst und transparent mit der Maus bewegt wird. Das hilft ungemein, weil man eben immer noch sehen kann, mit welchen Daten man den Dragvorgang ausgelöst hat. Die Möglichkeiten sind unbegrenzt, und wenn man das Prinzip einmal implementiert hat, kann man es leicht auf andere Systematiken adaptieren.

Das implizite D&D verwende ich nur bei Dateizuweisungen. Ganze Dialoge oder einzelne Felder sind in solchen Fällen Dropzones. Wird zum Beispiel irgendeine Datei über das Dokumentenmanagement zu einem Kunden gezogen, legt das Programm automatisch einen Eintrag an, holt sich die Datei, kopiert sie in den Dokumentenordner und bietet einen Dialog für die Datenbeschreibungen an. Befindet man sich allerdings in diesem Dialog, weil man ihn manuell aufgerufen hat, kann man dort immer noch die Datei ins entsprechende Feld ziehen.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Drag von Xb-Parts

Beitrag von AUGE_OHR »

Klaus Schuster hat geschrieben:Danke für Deine Infos. Ziel ist es, ein XbpBitmap aus einem XbpStatic-Rahmen in einen anderen XbpStatic-Rahmen zu verschieben.
hab mal getestet wie das mit einem Bild ist ( Text war klar )

Code: Alles auswählen

   oBMP:= XbpBitmap():new():create()
   oBMP:loadfile("DXE_BUTTONs.jpg")

   oDlg := NewForm():New()
   oDlg:oBild1:caption := oBMP
   oDlg:Create()

   oDlg:oBild2:SetCaption( oDlg:oBild1:caption )
wenn man das Bild als Caption gesetzt hat kann man es tatsächlich ( als Object ? ) einem anderem XbpStatic() zuweisen =D>
gruss by OHR
Jimmy
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: Drag von Xb-Parts

Beitrag von Klaus Schuster »

Hallo Jimmy, hallo Tom,

danke für euer Engagment!

Mal sehen, was ich mit diesen Ideen zustande bringe.
Gruß Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Drag von Xb-Parts

Beitrag von AUGE_OHR »

siehe dazu auch den Thread in der Wissensbasis "Text2BMP"
http://www.xbaseforum.de/viewtopic.php?f=16&t=5090
gruss by OHR
Jimmy
Antworten