[erledigt] PureLVSort - Important note ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[erledigt] PureLVSort - Important note ?

Beitrag von scholly »

moin, moin...

In der PureLVSort-Doku steht eine Warnung:
Important note : PureLVSORT uses the Windows #LVM_SORTITEMS message to sort the listicongadget, and this implies using LV_ITEM\lParam (so the sorting is not compatible with Set/GetGadgetItemData(), or the other way round : the Purebasic listicongadget is not 100% Windows API compatible : it's not a simple SysListView32).
Was bedeutet das konkret ?

Hintergrund meiner Frage:

Ich will den Inhalt (oder Teile) einer SQLite-DB in ein LIG einlesen, mit PLVS sortieren, mir dann einzelne Datensätze in einer separaten Maske anzeigen lassen, gegebenenfalls einzelne Datenfelder ändern und dann die geänderten Datensätze zurückschreiben.

Vielleicht mach ich jetzt einen Gedankenfehler, weil meine letzte Videoverwaltung nur mit .csv unter 3.94 gearbeitet hat, aber ich wollte so vorgehen:
- Datensatz Feld für Feld per GetGadgetItemData() aus dem LIG in meine Maske übertragen
- Änderungen vornehmen
- geänderte Felder aus der Maske per SetGadgetItemData() in das LIG übertragen und per UPDATE in die DB

1. ist das die richtige Vorgehensweise ?
2. spukt mit o.g. "Important note" in die Suppe ?

tia...
scholly
Zuletzt geändert von scholly am 17.05.2008 16:56, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag von gnozal »

It means that sorting with PureLVSORT messes up the purebasic gadget item data.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

nur zur info:
SQL lässt es zu Daten direkt sortiert zu lesen.......

Order by
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Was bedeutet das konkret ?
Das hat gnozal wegen mir hinzugefügt.
Ich habe estgestellt, dass man Items keine Daten mit SetGadgetItemData zuweisen kann, wenn die Items vertauscht werden: PureLVSORT bietet ja die Möglichkeit, dass Items sortiert werden können, durch einen Klick auf die Spaltenüberschrift. Werden die Items sortiert und damit vertauscht, bleiben zugewiesene Daten mit SetGadgetItemData aber an ihren alten Plätzen, sie wandern nicht mit.
gnozal hat erklärt, dass er viel mit API arbeitet und die API nicht mit dem PureBasic Befehl SetGadgetItemData() kompatibel ist.

Das ist damit gemeint.

Um dieses Problem zu umgehen hat gnozal vorgeschlagen, eine unsichtbare, 0 Pixel breite Spalte zu erstellen, die sich auch nicht vergrößern lässt. So kann man Daten speichern, ohne, dass der Benutzer es sieht.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

@gnozal
How is what messed up ? It's dufficult for me to comprehend this statement, as I have working code for changing the complete contents of a line.

@Rings
Das ist mir klar, nützt aber nix, wenn ich den Datenbestand nach dem einlesen mehrfach sortieren will, um ihn zu bearbeiten...
AND51 hat geschrieben:Ich habe estgestellt, dass man Items keine Daten mit SetGadgetItemData zuweisen kann, wenn die Items vertauscht werden:
PureLVSORT bietet ja die Möglichkeit, dass Items sortiert werden können, durch einen Klick auf die Spaltenüberschrift. Werden die Items sortiert und damit vertauscht, bleiben zugewiesene Daten mit SetGadgetItemData aber an ihren alten Plätzen, sie wandern nicht mit.
gnozal hat erklärt, dass er viel mit API arbeitet und die API nicht mit dem PureBasic Befehl SetGadgetItemData() kompatibel ist.
Hab ich das richtig verstanden ?
Wenn ich für eine einzelne Zelle feststellen will, ob sie selektiert oder ihre Checkbox gechecked ist, bekomme ich nicht die richtigen Werte.
Wenn ich aber (auch nach mehrmaligem Sortieren) eine Zeile (Datensatz) komplett selektiere, die Werte in eine Maske übertrage, etwas ändere und dann die Zeile komplett zurückschreibe, betrifft mich das Problem nicht.

bis denne...
scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@AND51: Danke für die Info! Wusste ich noch nicht.

@scholly: normalerweise macht man eine Teilabfrage der Datenbank, um
nur die Daten zu ermitteln, die in das ListIconGadget eingefügt werden.
Um herauszufinden, welche Daten in welcher Zeile des ListIconGadgets
stehen, muss jede Zeile mit einer eindeutigen Kennzeichnung (nachfolgend
ID genannt) versehen werden. Praktischerweise kann man hierfür einen
Autowert aus der Tabelle der Datenbank verwendet werden, die mit
SetGadgetItemData() jeder Zeile des ListIconGadgets hinzugefügt wird.
Somit kannst Du mit GetGadgetItemData() jederzeit einen Bezug zu den
Daten Deiner Datenbank herstellen.

Selektierst Du eine Zeile des ListIconGadgets, so kannst Du mit einer
Abfrage der Datenbank unter Berücksichtigung der ID die richtigen Daten
laden, in Deiner Maske bearbeiten und wieder abspeichern.

Sollten beim Sortieren des ListIconGadgets mit PureLVSORT die
IDs nicht mit sortiert werden, dann kannst Du auch keinen eindeutigen
Bezug zu den Daten in der Datenbank mehr herstellen.

Bleibt also nur die Möglichkeit, die ID in eine Spalte des ListIconGadgets
einzutragen. Üblicherweise zeigt man die Spalte nicht an und setzt deren
Breite somit auf 0 und macht sie 'unresizeable'.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag von gnozal »

scholly hat geschrieben:@gnozal
How is what messed up ? It's dufficult for me to comprehend this statement, as I have working code for changing the complete contents of a line.
To sort the listicon, I use a windows API feature, the LVM_SORTITEMS message. In order to use this feature, I have to work with the LV_ITEM\lParam structure member. Unfortunately, Purebasic V4 also uses lParam to store the gadget item data.

Code: Alles auswählen

The LVM_SORTITEMS message uses an application-defined comparison function to sort the items of a list view control. The index of each item changes to reflect the new sequence. You can send this message explicitly or by using the ListView_SortItems macro.

LVM_SORTITEMS  
wParam = (WPARAM) (LPARAM) lParamSort;  
lParam = (LPARAM) (PFNLVCOMPARE) pfnCompare; 
 

Parameters

lParamSort

Application-defined value that is passed to the comparison function.

pfnCompare

Pointer to the application-defined comparison function. The comparison function is called during the sort operation each time the relative order of two list items needs to be compared. 

 

Return Values

Returns TRUE if successful or FALSE otherwise.

Remarks

The comparison function has the following form:

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,  
	LPARAM lParamSort);  
 

The lParam1 parameter is the 32-bit value associated with the first item being compared; and the lParam2 parameter is the value associated with the second item. These are the values that were specified in the lParam member of the items' LV_ITEM structure when they were inserted into the list. The lParamSort parameter is the same value passed to the LVM_SORTITEMS message.
The comparison function must return a negative value if the first item should precede the second, a positive value if the first item should follow the second, or zero if the two items are equivalent.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

@ Kiffi 1:
Bitte, kein Problem!

@ Kiffi 2 und scholly:
Das ist (leider) richtig.
Ich hatte mal ne LinkedList, die enthielt Pointer zu Images. Jeder Zeile im ListIconGadget() sollte per SetGadgetItemData() auch der Pointer zu dem jeweiligen Bild zugeordnet werden.
Gleichzeitig wollte ich dem Benutzer aber ermöglichen, dass er die Liste mit Bildern nach Dateinamen, Auflösung und Größe sortieren kann.
Da bin ich dann auf das Problem gestoßen, dass er nach einem dieser Sortiervorgänge immer das falsche Bild angezeigt hat.

Wie gesagt, ist die Lösung für dieses Problem, einfach aber eben nicht so komfortabel wie die Set/GetGadgetItemData()-Methode:
Man fügt einfach eine Spalte mehr hinzu, als man braucht, gibt ihr die Breite null (0 Pixel) und bestimmt mit Hilfe der PureLVSORT-Lib, dass der Benutzer diese Spalte nicht in der Größe verändern kann, bzw. dass die Spalte unsichtbar ist (#PureLVSORT_ColumnType_Hidden glaube ich).

Hinweis: Diese zusätzliche Spalte, in der man nach belieben Informationen speichern kann, sollte aber nicht die letzte Spalte sein! Denn sonst kann der Benutzer die vorletzte Spalte, die für ihn die letzte (sichtbare) Spalte ist, nicht nach rechts vergrößern, weil das Gadget denkt, dass die letzte (unsichtbare Data-)Spalte vergrößert werden soll und das verbietet man ja vorher extra.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Aaaaalso:

1. Die Kombination Get/SetGadgetItemData() macht Probleme.
2. Die Kombination Get/SetGadgetItemText() ist davon nicht betroffen.

Sind diese Aussagen beide richtig ?

@Kiffi
Praktischerweise kann man hierfür einen Autowert aus der Tabelle der Datenbank verwendet werden, die mit SetGadgetItemData() jeder Zeile des ListIconGadgets hinzugefügt wird.
3. Ist der Autowert etwas, das ich per SetGadgetItemText() in eine Text-Zelle schreiben kann ?
4. Wenn ja, wie generiere ich den in meiner SQLite-DB ?

bis denne...
scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

scholly hat geschrieben:Sind diese Aussagen beide richtig ?
yup.
scholly hat geschrieben:3. Ist der Autowert etwas, das ich per SetGadgetItemText() in eine Text-Zelle schreiben kann ?
yup.
scholly hat geschrieben:4. Wenn ja, wie generiere ich den in meiner SQLite-DB ?
bei Generieren der Tabelle mit den Schlüsselwörtern INTEGER PRIMARY KEY. So sähe das dann aus:

Code: Alles auswählen

CREATE TABLE TestTable(ID INTEGER PRIMARY KEY, Feld1, Feld2, ...)
Wenn Du dann testweise mal ein paar Daten in die Tabelle einfügst...

Code: Alles auswählen

Insert Into TestTable (Feld1, Feld2, ...) Values ('Value1-1', 'Value2-1', ...)
Insert Into TestTable (Feld1, Feld2, ...) Values ('Value1-2', 'Value2-2', ...)
Insert Into TestTable (Feld1, Feld2, ...) Values ('Value1-3', 'Value2-3', ...)
... wirst Du sehen, dass das Feld ID automatisch mit einem fortlaufenden
Autowert befüllt wird. Diesen kannst Du als eindeutigen Kenner für Deine
Datensätze verwenden.

Grüße ... Kiffi
a²+b²=mc²
Antworten