LIST BOXES – Verabschieden Sie sich von der Alt-Taste!

Die Aktion „Drag & Drop“ ist eine Standardaktion beim Arbeiten mit dem Computer. Im Falle von Listboxen ist es notwendig, die „Alt“-Taste zu drücken, um mehrere Elemente gleichzeitig zu verschieben. Oder besser „war“, denn ab 4D v19 R7 ist dies nicht mehr erforderlich!

LIST BOXES Drag-and-Drop-Möglichkeiten

Eine benutzerfreundlichere Schnittstelle

Aus technischen und historischen Gründen war es bisher erforderlich, die „Alt“-Taste auf der Tastatur zu drücken, um mehrere Elemente gleichzeitig zu verschieben. Dieser Zwang gehört nun der Vergangenheit an. Dies ist eine benutzerfreundliche Verbesserung, da dieses neue Verhalten dem von macOS oder Windows verwendeten Verhalten zur Verwaltung von Dateien und Ordnern sehr nahe kommt. Die Benutzer werden nicht mehr verwirrt sein, und diese Aktion wird ganz natürlich sein!

Was wäre wenn…

Wenn Benutzer bestehender Anwendungen daran gewöhnt sind, beim Ziehen die Alt-Taste zu drücken, gibt es keinen Grund zur Sorge. Der Drag & Drop wird genau so funktionieren. Die Alt-Taste wird ignoriert, es sei denn, Sie programmieren etwas, um sie für einen anderen Zweck zu berücksichtigen (z.B.: wenn die Alt-Taste gedrückt ist, wird kopiert statt nur verschoben).

Erste Schlussfolgerung

Das neue Verhalten ist benutzerfreundlicher, weil es die Betriebssysteme nachahmt und die meisten Anwendungen funktionieren. Wir könnten hier aufhören, aber lassen Sie uns die Gelegenheit nutzen, um einige Prinzipien der Funktionsweise von Listboxen, ihrer Eigenschaften und der Ereignisse, die behandelt werden können, in Erinnerung zu rufen. Wenn Sie Interesse haben, machen wir weiter!

Auswahlmodi. Mehrfachauswahl. und Ereignisse

Drei mögliche Auswahlmodi

Listboxen haben drei Auswahlmodi, die durch eine Eigenschaft der Eigenschaftsliste bestimmt werden.

  • Keine
  • Einfach
  • Mehrfach

 

Zwei mögliche Mehrfachauswahlmodi.

Die Auswahl mehrerer Elemente ist mit den Tastaturtasten möglich .

  • Wenn Sie die Umschalttaste gedrückt halten, können Sie eine kontinuierliche Auswahl erstellen(z. B. von „Chloe“ bis „Mike“).
  • Durch Gedrückthalten der Strg-Taste(Cmd-Taste unter macOS) können Sie eine diskontinuierliche Auswahl erstellen(z. B. „Albert“ und „John“ und „Mike“ und „Peter“)

 

Drei Ereignisse

Beim „Drag & Drop“ können drei Ereignisse verwaltet werden.

  • On beginning drag over
  • On drag over
  • On drop

 

blank

Wichtiger Hinweis: Diese Ereignisse werden nur ausgelöst, wenn die Aktionseinstellungen für „draggable“ und „droppable“ auf „custom“ gesetzt sind.

blank

1 – Das erste Ereignis (on beginning drag over) wird ausgelöst, wenn das Ziehen in der Listbox „Quelle“ beginnt. Zu diesem Zeitpunkt muss der „nächste Schritt“ vorbereitet werden, d. h. es muss geprüft werden, was ausgewählt wurde, und es muss auf irgendeine Weise gespeichert werden. Dies kann z. B. in der Zwischenablage oder in einer Formularvariablen geschehen. Beachten Sie, dass dieses Ereignis nur einmal ausgelöst wird.

If (Form event code=On Begin Drag Over)
 $drag:=New object
 // (…) put what you need in Form.drag object
 
 // put the object in a BLOB
 VARIABLE TO BLOB($drag; $blob)
 // and send the object to the PasteBoard with any signature (xxxx)
 APPEND DATA TO PASTEBOARD("xxxx"; $blob)
End if

2 – Das zweite Ereignis (on drag over) wird ausgelöst, wenn der Mauszeiger über eine Listboxzelle bewegt wird, aber nur, wenn zuvor ein Ziehen über die Listbox stattgefunden hat oder wenn etwas anderes auf der Listbox abgelegt werden kann.

Es ist nicht zwingend erforderlich, dieses Ereignis zu berücksichtigen, aber es ist vorteilhaft, weil es erlaubt, ein mögliches „Drop“, das später auftreten könnte, abzulehnen.

Wie man das macht? Sie müssen sich nur den Inhalt dessen ansehen, was wahrscheinlich fallen gelassen wird. Wenn Sie mit dem, was fallen gelassen werden kann, einverstanden sind, geben Sie 0 (Null) in $0 zurück. Andernfalls geben Sie -1 (minus eins) zurück, dann wird das Fallenlassen abgelehnt (und kein „On-Drop“-Ereignis wird erzeugt)

If (Form event code=On Drag Over)
 If (Pasteboard data size("xxxx")<=0)
  $0:=-1 //reject anything that does NOT contains what is expected
 Else
  $0:=0
 End if
End if

3 – Die dritte Funktion (On the drop) wird, wie der Name schon sagt, in dem Moment generiert, in dem ein „Drop“ in der „Ziel“-Listbox (die mit der Quelle identisch sein kann) tatsächlich durchgeführt wird.

Von da an können Sie prüfen, an welcher Position die Ablage erfolgt ist, und je nach dem abzulegenden Inhalt die erforderlichen Operationen durchführen. Vergessen Sie nicht, dass das Ablegen nicht unbedingt die logische Folge eines Ziehens aus einer anderen Listbox (oder der Listbox selbst) ist. Es kann sich auch um ein externes Element handeln, sogar außerhalb der Anwendung, wie z. B. eine Datei oder ein Ordner aus der Systemumgebung.

if(Form event code=On Drop)
 // read pasteboard content
 GET PASTEBOARD DATA("xxxx"; $blob)
 BLOB TO VARIABLE($blob; $drag)
 // do what you need to do with the object you got
  (…)
end if

Schlussfolgerung

All diese Informationen sind in dem HDI-Beispiel enthalten, das Sie herunterladen können, um eine praktische Implementierung zu sehen.

Viel Spaß beim Programmieren!

Roland Lannuzel
- Product Owner & 4D Experte - Nach seinem Studium der Elektronik arbeitete Roland als Entwickler und Berater in der industriellen IT-Branche, wo er Lösungen für Kunden mit einer Vielzahl von Datenbanken und Technologien entwickelte. In den späten 80er Jahren verliebte er sich in 4D und setzte es bei der Entwicklung von Geschäftsanwendungen wie Buchhaltungs-, Abrechnungs- und E-Mail-Systemen ein. 1997 trat er schließlich in das Unternehmen ein und leistete einen wertvollen Beitrag, indem er Spezifikationen, Testtools und Demos entwarf, Schulungen durchführte und auf vielen Konferenzen für die 4D Community sprach. Er gestaltet die Zukunft von 4D aktiv mit, indem er neue Funktionen und Datenbankentwicklungstools definiert.