| |
|
|
- 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... |
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
| Hallo Frank...
Ich nehme an, das liegt daran, das du da nicht InitCommonControlEx verwendet hast - besten Dank ... |
|
|
| |
|
|
| |
|
- 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. |
|
|
| |
|
|
|
Frank Abbing | Sehr sogar . Danke! |
|
|
| |
|
|
|
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
|
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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! |
|
|
| |
|
|
|
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... |
|
|
| |
|
|
|
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] |
|
|
| |
|
|
|
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! |
|
|
| |
|
|
|
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? |
|
|
| |
|
|
|
| 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 |
|
|
| |
|
|
|
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... |
|
|
| |
|
|