Deutsch
Forum

Drag & Drop ***BETATEST***

 
- Seite 1 -



Frank
Abbing
Hi,

hier eine erste Testversion für den breiten Betatest in Sachen Drag&Drop. Bitte testet ausgiebig!

Ihr könnt Sachen aus dem Explorer oder sonstigen externen Programmen in ein Listview ziehen. Diese Einträge wandern dann
immer an das Ende der Liste. Das funktioniert auch umgekehrt, also zum Explorer hin, wenn euer Eintrag ein gültiger Pfad ist.

Viel interessanter ist aber, Einträge verschiedener Listviews untereinander zu verschieben. Dabei wandern die gedroppten
Einträge an passender Stelle in das neue Listview. Sogar Verschiebungen innerhalb eines Listviews sind möglich, zwecks manueller Sortierung.
Und sogar Verschiebungen von vielen selektierten Einträgen gleichzeit sind ohne Probleme möglich. Hierbei bleiben Icons und Status der Checkboxen sogar erhalten, sofern das Ziel-Listview diese Features unterstützt.

Bitte benutzt diese Listview.dll noch nicht in euren Programmen! Bislang gilt D&D global für alle Listviews, was sich aber durch einen Schalter ändern wird. Diese Dll-Version ist nur für Betazwecke geeignet...

Testberichte bitte hier posten.
Viel Spass beim Ziehen...

31 kB
Hochgeladen:27.04.2005
Ladeanzahl127
Herunterladen
 
27.04.2005  
 



 
- Seite 1 -


Hallo Frank...

Ich nehme an, das liegt daran, das du da nicht InitCommonControlEx verwendet hast - besten Dank ...
 
28.04.2005  
 



 
- Seite 2 -



ByteAttack
Es wird Dich vieleicht freuen zu hören, das die Funktion auch unter:
Windows NT 4.0 SP6a und Windows NT Server SP6a ohne Probleme funktioniert.
 
Website:  [...] 
Facebook:  [...] 
29.04.2005  
 




Frank
Abbing
Sehr sogar . Danke!
 
29.04.2005  
 




Normann
Strübli
Hallo Frank,

funktioniert auch bei mir hervorragend (Win XP Home Sp2).
Allerdings habe ich da noch einen kleinen Vorschlag bezüglich der Sortierung:

Ich fände es sehr sinnvoll wenn die gedroppten Zeilen in der Listbox nicht einfach
Von links nach rechts kopiert würden, sondern entprechend der Header die Items an die richtige Spalte wandern.

Denn Name bleibt Name und Datum Bleibt Datum -logisch. Alle anderen items die nicht zugeordnet werden können
fallen weg, denn was bringt es denn sonst etwas hin und herzuschieben?
(Es sei denn man hat zwei identische Controls)

Hoffe Du kannst da was machen
 
01.05.2005  
 




Normann
Strübli
Ne Kleinigkeit noch:
Mir ist es nicht gelungen eine Zeile an das Ende des Listview zu verschieben da sie immer oberhalb der
Zeile wo sich der Cursor befindet eingefügt wird. Andersherum könnte man dann wohl keine Zeile an den
Anfang verschieben
Außerdem wäre es natürlich nützlich wenn das Listview -wenns denn länger ist- automatisch mitscrollt wenn man
sich mir der Maus an den äußeren Rand bewegt. - Aber das finde ich nicht so wichtig wie das mit der Sortierung
 
01.05.2005  
 




Frank
Abbing
Hi,

> funktioniert auch bei mir hervorragend (Win XP Home Sp2).
> Allerdings habe ich da noch einen kleinen Vorschlag bezüglich der Sortierung:
> Ich fände es sehr sinnvoll wenn die gedroppten Zeilen in der Listbox nicht einfach
> Von links nach rechts kopiert würden, sondern entprechend der Header die Items
> an die richtige Spalte wandern.
> Denn Name bleibt Name und Datum Bleibt Datum -logisch. Alle anderen items die nicht
> zugeordnet werden können
> fallen weg, denn was bringt es denn sonst etwas hin und herzuschieben?
> (Es sei denn man hat zwei identische Controls)
> Hoffe Du kannst da was machen

Naja, es bringt ja insofern etwas, das aus einem Listview, das ALLE Daten anbietet, nur bestimmte Zeilen in das Ziellistview gepackt werden können... Potential sehe ich da genug.
Deine Variante ist natürlich reizvoll und natürlich habe ich darüber auch schon überlegt. Der Aufwand wäre absolut imens, besonders die MOVE-Variante, bei der die Quelleinträge gelöscht werden müssen. Und das dann ja nicht zeilenweise, sondern nur innerhalb einer Spalte.
Zu überlegen wäre hier eventuell eine Tauschvariante, bei der die beiden Einträge nur vertauscht werden...

> Ne Kleinigkeit noch:
> Mir ist es nicht gelungen eine Zeile an das Ende des Listview zu verschieben da
> sie immer oberhalb der
> Zeile wo sich der Cursor befindet eingefügt wird. Andersherum könnte man dann wohl
> keine Zeile an den
> Anfang verschieben

Du hast es ja schon gesagt. Entweder oder. Wenn du den Eintrag ganz ans Ende setzen willst, müsstest du eben deinen Eintag an vorletzter Stelle setzen und dann den letzten Eintrag nochmal verschieben...

> Außerdem wäre es natürlich nützlich wenn das Listview -wenns denn länger ist- automatisch
> mitscrollt wenn man
> sich mir der Maus an den äußeren Rand bewegt. - Aber das finde ich nicht so wichtig
> wie das mit der Sortierung

Das sehe ich mir mal an. Auf jeden Fall schonmal danke für die Vorschläge!
 
01.05.2005  
 




Frank
Abbing
Hi,

> Außerdem wäre es natürlich nützlich wenn das Listview -wenns denn länger ist- automatisch
> mitscrollt wenn man
> sich mir der Maus an den äußeren Rand bewegt.

Das scheint nicht machbar zu sein. Jedenfalls sehe ich momentan dazu keine Möglichkeit.

> Ich fände es sehr sinnvoll wenn die gedroppten Zeilen in der Listbox nicht einfach
>
> Von links nach rechts kopiert würden, sondern entprechend der Header die Items
> an die richtige Spalte wandern.
>
> Denn Name bleibt Name und Datum Bleibt Datum -logisch. Alle anderen items die nicht
> zugeordnet werden können
> fallen weg, denn was bringt es denn sonst etwas hin und herzuschieben?

Das spaltenweise Drag&Drop ist fertig! Wie schon angekündigt werden die beiden Einträge getauscht. Um in diesen Modus zu gelangen, wird das Setzen eines einfachen Flags genügen:

Flag 16 ist ein echtes Schmankerl! Hier reagiert das Drag&Drop vollständig anders. Es werden keine Zeilen hin und her
geschoben, sondern nur einzelne Itemtexte einer Spalte. Hierbei werden die beiden betroffenen Texte vertauscht.
Wird der Text in den ungültigen Randbereich eines Listviews gezogen, dann wird er gelöscht.
Um im Flag-16-Modus Einträge in ein anderes (Dll-erzeugtes) Listview zu verschieben, muss das Flag bei beiden Listviews gesetzt sein.

Ich hoffe, das geht schon etwas in deine Richtung...
 
05.05.2005  
 




Frank
Abbing
Hi,

> Ich fände es sehr sinnvoll wenn die gedroppten Zeilen in der Listbox nicht einfach
>
> Von links nach rechts kopiert würden, sondern entprechend der Header die Items
> an die richtige Spalte wandern.
>
> Denn Name bleibt Name und Datum Bleibt Datum -logisch. Alle anderen items die nicht
> zugeordnet werden können
> fallen weg, denn was bringt es denn sonst etwas hin und herzuschieben?

Ich habe noch ein Zusatz-Flag eingeführt. Damit reagiert das Drag&Drop wie von dir gewünscht.

Demnächst gibts wieder einiges zu testen...

Hier schonmal der neue Auszug aus der Anleitung:

[box:d36b47d9cd]EnableDragDrop(H,F)

Erlaubt in einem Listview Drag & Drop Aktionen (oder auch nicht). Also das Verschieben von Items mittels der Maus.

H : Long - Handle eines mit CreateListview() erstellten Listview Controls
F : Long - Flag

Eine der mächtigsten Funktionen der Listview.dll!
Mit EnableDragDrop() können Verschiebungen von Texten per Maus eingeschaltet (oder wieder abgeschaltet) werden, und zwar für jedes einzelne Listview.
H ist das Listview, dem D&D zugeschaltet (bzw. weggeschaltet) werden soll. Ob und wie ein Listview Drag&Drop unterstützen soll, bestimmt das Flag F:

0 = H soll kein Drag&Drop unterstützen
1 = Drag & Drop für H einschalten
2 = H unterstützt nur Drag&Drop in/von Listviews, die mittels der Listview.dll erstellt wurden (no extern)
4 = H unterstützt nur Drag&Drop innerhalb sich selber (Drag&Drop-Sortierung)
8 = Bei Verschiebungen aus H wird die Quellzeile aus dem Listview entfernt (Move)
16 = Subitem-Modus. Es werden keine Zeilen verschoben, sondern einzelne Itemtexte vertauscht
32 = Nur zusammen mit Flag 16. Schaltet im Subitem-Modus den Move-Modus an

Alle Flags gelten lokal, sie können also für jedes Listview unterschiedlich eingestellt werden.

Anmerkungen:
Wird ein Eintrag von einem Listview in ein anderes Listview geschoben, und beide Controls wurden von der Listview.dll erzeugt, dann wandert die neue Textzeile oberhalb der Zeile, auf die es gezogen wurde.
Wurde aus einem externen Control (z.B. Windows-Explorer) in ein Listview.dll-Listview gezogen, dann wandert die neue Zeile immer an das Ende der Liste.
Mit Flag 2 bin ich noch sehr unzufrieden, weil Windows hier anscheinend Fehler beim Abbrechen eines gültigen Drag&Drop Vorganges macht. Wird bei gesetztem Flag 2 trotzdem ein Eintrag in ein externes Control verschoben, kann es passieren, dass das externe Programm eine OLE-Meldung ausgibt. Gedroppt wird aber trotzdem nichts. Anders herum ändert sich beim Ziehen von einem externen Control zu einem Dll-Listview der Mauscursor zu einem Kreuz-Symbol. Aber auch hier wird ordnungsgemäss nicht gedroppt.
Flag 16 ist ein echtes Schmankerl! Hier reagiert das Drag&Drop vollständig anders. Es werden keine Zeilen hin und her geschoben, sondern nur einzelne Itemtexte einer Spalte. Hierbei werden die beiden betroffenen Texte vertauscht.
Wird der Text in den ungültigen Randbereich eines Listviews gezogen, dann wird er gelöscht.
Um im Flag-16-Modus Einträge in ein anderes (Dll-erzeugtes) Listview zu verschieben, muss das Flag bei beiden Listviews gesetzt sein.
Wird zusätzlich zum Flag 16 das Flag 32 gesetzt, dann werden die beiden Texte nicht nur vertauscht, sondern der Quelltext auch wirklich aus der Spalte entfernt und der Zieltext zusätzlich in die neue Spalte eingefügt. Das entspricht natürlich nicht dem üblichen Abhängigkeits-Verhältniss von Spalten und Zeilen eines Listviews, mag aber in bestimmten Programmen durchaus sinnvoll sein. Im Modus 32 werden evt. vorhandene Icons und Checkboxen nicht mitverschoben, da sich diese nicht zwangläufig nur auf eine Spalte beziehen, sondern auf die gesamte Zeile! Vermeiden sie diese darum im 32er Modus.
Wird der Text im 32er Modus in einen nicht gültigen Bereich des Listviews verschoben, wird die Drag&Drop Aktion nicht durchgeführt.
Ist Flag 16 gesetzt, können nicht mehrere selektierte Texte gleichzeitig verschoben werden. Es wird in diesem Fall nur der Eintrag unter dem Mauscursor verschoben. [/box:d36b47d9cd]
 
06.05.2005  
 




Normann
Strübli
Hallo Frank,

das sieht ja echt nicht schlecht aus! War bestimmt ne menge Arbeit...
(hab auch noch keinen Fehler gefunden)

Allerdings nochmal eine Sache: (nicht schlagen!)
> Ich habe noch ein Zusatz-Flag eingeführt. Damit reagiert das Drag&Drop wie von dir gewünscht.
Ich bin mir jetzt nicht ganz sicher ob Du mich da richtig verstanden hast.
Mein Vorschlag war es nicht ein einzelnes Item zu verschieben / zu kopieren (was natürlich auch ne super Sache ist!) sondern schon die ganze Zeile. Allerdings sollte beim Droppen nur Die
Items entsprechend in die Zeile eingefügt werden die der gleichen Spaltenüberschrift entsprechen aus der Sie gedraggt wurden.

Beispiel:
Also ich habe da ein Listview mit den Spalten:
Name | Farbe | Baujahr |Preis

Aus diesem ziehe ich eine Zeile in folgendes:

Farbe | Name | Baujahr

Nun wäre es wünschenswert wenn das Item der Spalte Name auch in dem neuen Listview in der
Spalte Name landet. Für den Preis ist keine Spalte vorhanden, und so sollte auch keine
neue erstellt werden sondern der Preis fällt halt weg.

Tut mir Leid falls ich mich da beim letzten mal ein wenig unverständlich ausgedruckt habe.
Ich hoffe das ist so auch zu realisiern. Mit Drag&Drop hab ich ansonsten leider noch nicht
viel gemacht.
Ob das also funktioniert? -Nein? Meine Antwort: Müßte aber.
(Vorrausgesetzt das Motivationsniveau ist noch hoch genug)
Frank - Du schaffst das!
 
07.05.2005  
 




Frank
Abbing
Hi,

> Nun wäre es wünschenswert wenn das Item der Spalte Name auch in dem neuen Listview
> in der
> Spalte Name landet. Für den Preis ist keine Spalte vorhanden, und so sollte auch
> keine
> neue erstellt werden sondern der Preis fällt halt weg.

Eine Art intelligentes Drag&Drop? Naja, man kann es auch übertreiben
Nett, dass du versuchst mich so zu motivieren, aber ist es nicht eher Sache des Programmierers darauf zu achten, das die verschiedenen Tabellen untereinander kompatibel sind, wenn sie kombinierbar sein sollen?
 
07.05.2005  
 



Hi,

> Eine Art intelligentes Drag&Drop? Naja, man kann es auch übertreiben

Nööö wieso?

>...aber ist es nicht eher Sache des Programmierers darauf zu achten, das die verschiedenen Tabellen untereinander
> kompatibel sind, wenn sie kombinierbar sein sollen?

Kompatibel = total identisch? (ok, is übertrieben)
In meinem aktuellen Programm *geheimhalt* gibt es sozuzsagen eine Hauptliste in der Alle informationen stehen.
Jetzt gibt es weitere Listen -oder besser Listviews- in die man die ausgewählten Einträge kopieren kann, allerdings
fehlen in diesen Listen einige Spalten (wg. der Übersicht und weil sie dort weniger interessant sind.)
Bis jetzt gibt es einen Button mit dem das ganze funzt. - In diesem Fall sorge ich natürlich selbst dafür
das alles auch da landet wos hingehört.
Als Du dich aber entschlossen hast *freu* D&D zu integrieren sah ich eine Chance das ganze natürlich komfortabler zu
gestalten. Du hast also Recht in Bezug darauf das der Programmierer selbst dafür zu sorgen hat das alles dort
landet wos hingehört. Allerdings darf man doch davon ausgehen das Spalten die den gleichen Namen haben auch
den gleichen Inhalt meinen. Insofern -wie Du sagst- intelligent sind. Einige Deiner anderen Listview-funktionen
sind doch auch irgendwo schlau.

Mein Vorschlag :
Wenn man als Programmierer erfahren kann wann wo was von wo gedroppt wird und man das Einfügen selbst erledigt,
sozusagen einfach gesagt per Nachricht informiert wird, dann könnte das doch was werden oder?
Zumindest wenn man weiß das was gedroppt wurde und von wo, dann könnte man die markierten Zeilen des
Quell-Listviews auslesen und per Hand in das neue einfügen.
Das ist doch bestimmt nicht zu schwer zu machen -oder?

Und dann noch ein kleiner Fehler der mir aufgefallen ist:
In deinem Beispiel hab ich mal den Flag auf 1 gesetzt.
Markiere ich nun mehrere Zeilen und ziehe sie in eines der anderen Controls wird nur der erste Eintrag (der
Inhalt der ersten Zeile) eingefügt, dafür aber entprechend der Anzahl an markierten Zeilen doppelt.

Gruß
Normann
 
07.05.2005  
 




Frank
Abbing
Hi.

> Nööö wieso?

Ich muss etwas sparsein umgehen mit meinen Flags. Um das ganze Listview-global machen zu können, stehen mir 32 User-Bits zur Verfügung (GWL_USERDATA). Davon habe ich für EnableEdits() bereits 8 reserviert (davon schon 6 verpulvert) und Enable DragDrop() benutzt jetzt schon 6. Hier hatte ich vor, max. 16 Bits zu reservieren. Bleiben für zukünftige Funktionen noch 8 Bits.

> Kompatibel = total identisch? (ok, is übertrieben)
> In meinem aktuellen Programm *geheimhalt*
> gibt es sozuzsagen eine Hauptliste in der
> Alle informationen stehen.
> Jetzt gibt es weitere Listen -oder besser
> Listviews- in die man die ausgewählten Einträge
> kopieren kann, allerdings
> fehlen in diesen Listen einige Spalten (wg.
> der Übersicht und weil sie dort weniger
> interessant sind.)
> Bis jetzt gibt es einen Button mit dem das
> ganze funzt. - In diesem Fall sorge ich
> natürlich selbst dafür
> das alles auch da landet wos hingehört.
> Als Du dich aber entschlossen hast *freu*
> D&D zu integrieren sah ich eine Chance das
> ganze natürlich komfortabler zu
> gestalten. Du hast also Recht in Bezug darauf
> das der Programmierer selbst dafür zu sorgen
> hat das alles dort
> landet wos hingehört. Allerdings darf man
> doch davon ausgehen das Spalten die den
> gleichen Namen haben auch
> den gleichen Inhalt meinen. Insofern -wie
> Du sagst- intelligent sind. Einige Deiner
> anderen Listview-funktionen
> sind doch auch irgendwo schlau.
> Mein Vorschlag :
> Wenn man als Programmierer erfahren kann
> wann wo was von wo gedroppt wird und man
> das Einfügen selbst erledigt,
> sozusagen einfach gesagt per Nachricht
> informiert wird, dann könnte das doch was
> werden oder?

Ja.

> Zumindest wenn man weiß das was gedroppt
> wurde und von wo, dann könnte man die markierten
> Zeilen des
> Quell-Listviews auslesen und per Hand
> in das neue einfügen.
> Das ist doch bestimmt nicht zu schwer zu
> machen -oder?

Ich habe so eine Message auch noch geplant, ala GetControlParas(). Nur kann ich ja nicht alles gleichzeitig machen

> Und dann noch ein kleiner Fehler der mir
> aufgefallen ist:
> In deinem Beispiel hab ich mal den Flag
> auf 1 gesetzt.
> Markiere ich nun mehrere Zeilen und ziehe
> sie in eines der anderen Controls wird nur
> der erste Eintrag (der
> Inhalt der ersten Zeile) eingefügt, dafür
> aber entprechend der Anzahl an markierten
> Zeilen doppelt.

Ahhhrrrgg!!! Das funktionierte schon richtig! Hab wohl irgendwo wieder einen Fehler eingebaut. Da werd ich morgen mal nach suchen müssen...
 
07.05.2005  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

13.581 Betrachtungen

Unbenanntvor 0 min.
Walter11.12.2022
H.Brill29.03.2021
Georg Teles26.01.2019
ByteAttack30.10.2015
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie