Drag & Drop zur Laufzeit

Alle einfachen Grafikobjekte und einige komplexe Grafikobjekte können auf Drag & Drop reagieren.

Dazu muss der Benutzer dem Grafikobjekt mitteilen, ob dieses eine Drag-Operation starten soll, oder ob dieses ein Drop-Objekt akzeptieren soll. Um zu definieren, ob ein Grafikobjekt eine Drop/Drop-Information erlaubt, verwenden Sie die Attribute "Drop erlauben" und "Drag erlauben" im Attribut-Editor oder das Read/Write-Attribut "acceptDrops" in einem CTRL-Script, um zur Laufzeit zu definieren oder abzufragen, ob dieses Objekt Drop-Ereignisse akzeptiert.

Es stehen drei Script-Ereignisse für alle primitiven Objekte zur Verfügung:

1) DragStart

DragStart (main(int keys))

Das Ereignis wird nur dann gestartet, wenn das "Drag erlauben"-Attribut auf "TRUE" gesetzt wird.

Parameter Beschreibung
keys Enthält eine Tastaturkombination, die gedruckt wurde als der Benutzer die Drag-Operation startete. Die CTRL-Konstanten sind die bereits dokumentierten KEY_SHIFT, KEY_CONTROL, KEY_ALT, KEY_META oder deren Kombinationen.

In dem Script dieses Ereignisses wird definiert, welche Informationen es für die Drag-Operation zur Verfügung stellen soll. Abhängig von den "keys", die übergeben wurden, wird entschieden, was für Drag-Operation ausgeführt werden soll. Um eine Drag-Operation zu starten, muss das Script die folgende CTRL-Funktion dragStart() aufrufen.

Anmerkung:

Grafikobjekte innerhalb einer Panel-Referenz stellen eine Ausnahme dar: Diese bieten ihre Dollar-Parameter als Default-Drag-Information, wenn sie nicht die dragStart() Funktion in einem Script verwenden. Die Dollarparameter werden im Format, z.B. $name:valueodern$name:value übergeben z.B.:

$DPE:Motor1.runs $color:green

2) DragEnter

DragEnter (main(string information, int dragType, string id, int column))
Parameter Beschreibung
information information ist der Text (im "text/plain"-Format), welcher von der Drag-Operation erhalten wurde.
dragType dragType ist eine von den Drag-Konstanten DRAG_COPY, DRAG_MOVE oder DRAG_LINK (für weitere Informationen zu den Konstanten siehe Parameterbeschreibung zur Funktion dragStart()).
id id ist der Zeilenname. Die id wird für das DragEnter-Ereignis eines Tree-Widgets verwendet. Das Ereignis DragEnter wird aufgerufen, wenn ein gezogenes Objekt über eine Baumzelle bewegt wird.
column Die Spalte, beginnend bei 0. Die Spalte wird für das DragEnter-Ereignis eines Tree-Widgets verwendet. Das Ereignis DragEnter wird aufgerufen, wenn ein gezogenes Objekt über eine Baumzelle bewegt wird.

Dieses Ereignis wird nur dann gestartet, wenn das Grafikobjekt Drops akzeptiert und nicht deaktiviert ist. Wenn die Drop-Information für das Grafikobjekt aktiviert ist, muss das Grafikobjekt die CTRL-Funktion dropAccept() aufrufen.

Anmerkung: Für das Tree-Widget wird TREE.setDropEnabled ignoriert, wenn DragEnter gesetzt ist.

3) DragDrop

DragDrop (main(string information, int dragType))

Das Ereignis wird gestartet, wenn der Benutzer die Information droppt und das Grafikobjekt das System über dropAccept() informiert, um die Drop-Information zu akzeptieren. Die übergebenen Argumente sind die gleichen wie in dem DragEnter-Ereignis.

Komplexe Grafikobjekte

Drag & Drop wurde auch für einige komplexe WinCC OA Grafikobjekte implementiert:

Tabelle

Eine Tabelle kann die Drop-Information akzeptieren, wenn das "Drop erlauben"-Attribut im Attribut-Editor auf TRUE gesetzt IST. Wenn die Information gedroppt wird, startet diese ein DragDrop-Ereignis und übergibt die folgenden Argumente:

main(string information, int dragType, int row, string column)

Die Daten aus einer Tabellenzelle können auch auf andere Objekte (z.B. Textfeld) gezogen werden. Dazu muss das "Drag erlauben"-Attribut aktiviert sein. Wenn Drag erlaubt ist, startet dies das DragStart-Ereignis mit dem folgenden Argument:

main(int keys, int row, string column)

Wenn keine spezielle Implementierung im DragStart-Ereignis vorhanden ist, wird per Default der Inhalt der ausgewählten Zellen im folgenden Format geschrieben:

R1C1\tR1C2\tR1C3\n
R2C1\tR2C2\tR2C3

usw. Die Zelleninhalte in einer Zeile werden mittels eines Tabulatorzeichens (\t) und die Zeilen werden mittels eines Zeilenvorschubzeichens (\n) getrennt.

Anmerkung: Beachten Sie, dass die Tabelle auf den Markierungsmodus mode != TABLE_SELECT_NOTHING (siehe selectByClick) gesetzt werden muss, um eine Drag-Operation durchführen zu können.
VORSICHT: Per Default können die ausgewählten Zellen einer Tabelle direkt z.B. auf ein Textfeld gedroppt werden. Voraussetzung dafür ist, dass das Ereignis DragStart nicht modifiziert wurde. Wird nun eine Code-Zeile eingetragen und wieder gelöscht, so können die Zellen nicht mehr gedroppt werden. Damit aber das Verhalten per Default wieder funktioniert, muss das ganze Script inklusive main{} gelöscht werden.

Ein DragEnter-Script existiert für die Tabelle nicht und es ist nicht notwendig dropAccept() aufzurufen. Wenn "acceptDrops" TRUE ist, werden alle Drops erlaubt.

Auswahlliste

Eine Auswahlliste kann Drop-Informationen akzeptieren, wenn das Attribut "acceptDrops" im Attribut-Editor auf TRUE gesetzt ist. Wenn die Information darauf fallen gelassen wird, wird das DragDrop-Ereignis mit den folgenden Argumenten gestartet:

main(string information, int dragType, int row, string column) 

Die Daten aus einer Auswahllistenzeile können auch auf andere Objekte (z.B. Textfeld) gezogen werden. Dies muss durch Setzen des Attributs "Draggable" im Attribut-Editor aktiviert werden. Wenn das Ziehen erlaubt ist, wird das Ereignis DragStart mit dem folgenden Argumenten gestartet:

main(int keys, int row) 

Wenn es keine spezielle Implementierung innerhalb des DragStart-Ereignisses gibt, wird die Auswahlliste standardmäßig den Inhalt der ausgewählten Zeilen im folgenden Format bereitstellen:

Row1\n 
Row2\n 

Und so weiter. Dies bedeutet, dass die Zeilen durch einen Zeilenumbruch (\n) getrennt sind.

VORSICHT: Per Default können die ausgewählten Zellen einer Tabelle direkt z.B. auf ein Textfeld gedroppt werden. Voraussetzung dafür ist, dass das Ereignis DragStart nicht modifiziert wurde. Wird nun eine Code-Zeile eingetragen und wieder gelöscht, so können die Zellen nicht mehr gedroppt werden. Damit aber das Verhalten per Default wieder funktioniert, muss das ganze Script inklusive main{} gelöscht werden.

Ein DragEnter-Script existiert für die Tabelle nicht und es ist nicht notwendig dropAccept() aufzurufen. Wenn "acceptDrops" TRUE ist, werden alle Drops erlaubt.

Baumansicht

Eine Baumansicht kann die Drop-Information akzeptieren, wenn das "Drop erlauben"-Attribut im Attribut-Editor auf TRUE gesetzt IST. Wenn die Information gedroppt wird, startet diese ein DragDrop-Ereignis und übergibt die folgenden Argumente:

main(string information, int dragType, string id)
Parameter Beschreibung
id Die ID, bei der der Drop auftritt oder "", wenn die Elemente innerhalb von der Baumansicht entscheiden können, ob sie Drag und/oder Drop akzeptieren. Es werden die folgenden Baumansicht-Methoden verwendet:
tree.setDragEnabled(string id, bool enable);
tree.setDropEnabled(string id, bool enable);

Sie können den aktuellen Status auch wie folgt abfragen:

bool tree.dragEnabled(string id);
bool tree.dropEnabled(string id);

Wenn Drag aktiviert ist, startet das DragStart-Ereignis und übergibt die folgenden Argumente:

main(int keys, string id)

Die Information, die über dragStart() gezogen wird, muss verfügbar sein. Wenn kein Script in diesem Ereignis implementiert wurde, schreibt das Element den Inhalt von allen Spalten als Text im Format C1\tC2\tC3. D.h. der Zelleninhalt für ein Element wird mittels eines Tabulatorzeichens getrennt. Ist ein DragEnter-Script nicht verfügbar, so ist es nicht notwendig, dropAccept() aufzurufen.

ID ändern

Ohne Bezug auf Drag & Drop kann eine bereits definierte ID auf eine neue geändert. Verwenden Sie dazu die folgende Methode:

tree.changeId(alteID, neueID);

Dabei muss die alte ID existieren, die neue ID darf zu diesem Zeitpunkt noch nicht existieren.

Trend

Ein Trend akzeptiert eine Drop-Information, wenn das Attribut "Drop erlauben" auf TRUE gesetzt ist. Es kann keine Drag-Operation starten.

Es kann z.B. ein Objekt (vom Objekt-Katalog) auf die Trend-Schaltfläche zur Laufzeit (z.B. in der Demo-Applikation) gezogen werden.

Wird ein Symbol auf die Trend-Schaltfläche mit Drag & Drop gezogen, wird ein DRAG_COPY durchgeführt und der Trend-Puffer (bestehende Funktionalität) erweitert. Wird zusätzlich STRG beim Drag & Drop gedrückt, wird ein DRAG_MOVE durchgeführt. D.h. vorher wird der Puffer geleert und dann das Symbol hinzugefügt.

Abbildung 1. DemoApplikation und Trendpuffer

Wenn die Drop-Information den Trend-Bereich erreicht, wird das DragEnter-Ereignis gestartet und folgende Argumente übergeben:

main(string information,int dragType, int area)
Parameter Beschreibung
area "area" ist die Trend-Bereichsnummer. Wenn kein Script innerhalb vom DragEnter implementiert ist, wird die ganze Drop Information automatisch akzeptiert.

Auf Drop wird ein DragDrop-Ereignis gestartet und folgende Argumente übergeben:

main(string information, int dragType, int area)

Es entspricht dem DragEnter-Ereignis.

Textfeld (eine Reihe), TextEdit (mehrzeiliger Text)

Beide können Drops akzeptieren. Wenn das Attribut "Drop erlauben" auf TRUE gesetzt ist, wird das DragDrop-Ereignis gestartet. Die Argumente sind die gleichen wie bei einfachen Grafikobjekten. Ein Drag von diesen Widgets ist immer erlaubt.

DPE-Monitor

Es kann ein Datenpunkt auf die DPE-Tabelle gedroppt werden. Wenn der Datenpunkt bereits vorhanden ist, wird die Meldung "Dieses DPE ist bereits Bestandteil der Konfiguration" angezeigt.

Zoom Navigator

Innerhalb des Zoom Navigators gibt es einen Bereich, der das Panel darstellt. Überall auf diesem Bereich kann gedroppt werden. Starten eines Drags ist nur außerhalb des Viewport-Bereichs (als rotes Rechteck dargestellt) möglich, nachdem der Viewport selbst bewegt werden kann, um den sichtbaren Bereich zu ändern.

Dateipfade und Drag & Drop

Es kann eine Datei aus dem Windows-Explorer in ein TextEdit oder Textfeld gezogen werden. In dem Textfeld erscheint dann der Pfad zu der Datei.

Das Textfeld oder TextEdit muss für Drag & Drop parametriert werden, damit diese auch Werte aufnehmen kann.

Abbildung 2. Dateipfad in einem TextEdit