![]() |
ListView Elemente Gruppieren: Terminierung der IDs?!
Hi!
Erst einmal eine Information vorab: Ich beziehe mich hier auf das Thema "Gruppenzwang! (Gruppierung)" aus dem folgenden Thread: ![]() Und zwar müssen die IDs der Gruppen immer unterschiedlich sein. Ansonsten werden die Gruppennamen verwendet, die zum Start die ID hatten...
Delphi-Quellcode:
Ich meine dabei, folgenden Abschnitt:
for i := 0 to lv1.Items.Count - 1 do begin
// Record leeren ZeroMemory(@lv60,sizeof(TLVItem60)); // Flag setzen, weil wir die Gruppen-ID ändern wollen lv60.mask := LVIF_GROUPID; // von welchem Item? lv60.iItem := i; // wie lautet die ID? lv60.iGroupId := 1; // und ab dafür SendMessage(lv1.Handle,LVM_SETITEM,0,LPARAM(@lv60)); end;
Delphi-Quellcode:
Die ID muss immer unterschiedlich sein. Aber kann man die ganze Gruppierung nicht irgendwie terminieren, sodass die ID immer wieder KOMPLETT neu geladen werden (je nach Bedarf; ohne Programmneustart)???
// wie lautet die ID?
lv60.iGroupId := 1; Ich hoffe jemand versteht, was ich meine...? MCXSC |
Re: ListView Elemente Gruppieren: Terminierung der IDs?!
Nicht so richtig, und ich sollte es wohl verstehen, denn du beziehst dich auf meinen Beitrag. :stupid:
So richtig weiß ich nicht, was du meinst. Natürlich kannst du die Gruppierung komplett aufheben und neu erstellen. Dann werden auch die IDs neu zugeordnet. Ich habe das ganze aber für VCL nicht weiter verfolgt. Halt, warte! :wall: Doch in Chakotays MovieOrganizer. Von dem gibt´s eine Version, die ich ein bisschen bearbeitet habe. Und da ändert sich die Gruppierung je nach der angeklickten Spalte. Willst du den Quellcode zur Ansicht haben? Ansonsten formulier doch deine Frage mal so, dass auch ein Kindergartenabgänger wie ich sie versteht. :zwinker: |
Re: ListView Elemente Gruppieren: Terminierung der IDs?!
Okay, dann werde ich nochmal etwas weiter ausholen:
Ich habe eine Liste mit Filmen (ich sitze auch an einer Filmverwaltung), diese will ich gruppieren ;-) Ich habe dazu verschiedene Prozeduren und Arrays erstellt (Alphabet, Genre, Format, etc.). In jeder Procedure steht folgendes (angepasst natürlich):
Delphi-Quellcode:
Das Wechseln der Gruppierung über die Proceduren funktioniert auch einwandfrei, solange bei "group.iGroupId := 1;" und "lv60.iGroupId := 1;" der rechte Wert so ist, dass alle IDs unterschiedlich sind (habe es z.B. gelöst indem ich eine Zahl hinzuaddiert habe, sodass die Ids eine Reihe ergeben (z.B.: "lv60.iGroupId := 1+20;")).
group.cbSize := sizeof(TLVGroup);
group.mask := LVGF_HEADER or LVGF_GROUPID; group.pszHeader := pwidechar(widestring('Testgruppe')); group.cchHeader := lstrlenW('Testgruppe'); group.iGroupId := 1; ListView_InsertGroup(lv1.Handle,-1,group); for i := 0 to lv1.Items.Count - 1 do begin ZeroMemory(@lv60,sizeof(TLVItem60)); lv60.mask := LVIF_GROUPID; lv60.iItem := i; lv60.iGroupId := 1; SendMessage(lv1.Handle,LVM_SETITEM,0,LPARAM(@lv60)); Sobald dies nicht der Fall ist (ich also den Code so belasse) und ich die Gruppierung wecheln will, gruppiert er zwar richtig, aber die Gruppennamen sind noch immer so, wie sie vorher waren (sogar mit den entsprechenden IDs). Wenn ich jedoch das Programm neustarte und dann die Gruppe wähle funktioniert es. Es funktioniert nur immer dann nicht, wenn ich vorher bereits eine Gruppe ausgewählt hatte. Nun will ich aber, dass automatisch die alten IDs gelöscht werden und die neuen geladen werden... Hoffe jetzt ist es für dich verständlicher?! ;-) MCXSC |
Re: ListView Elemente Gruppieren: Terminierung der IDs?!
So funktioniert das nicht. Halte mir bitte zugute, dass ich den Beitrag damals geschrieben habe, um zu zeigen, wie die Gruppierung funktioniert. Ich glaube in den
![]() Wie auch immer, im angesprochenen MovieOrganizer von Chakotay habe ich eine einzige Prozedur, die für die Gruppierung sorgt:
Delphi-Quellcode:
Und so wird sie bspw. im "OnColumnClick"-Ereignis der List-View aufgerufen:
resourcestring
ONEMEDIA = 'One medium'; TWOMEDIA = 'Two media'; MULTIMEDIA = 'Multi media'; SINGLECOPY = 'Unique copy'; MULTICOPY = 'Multi copies'; PIC1A = 'excellent picture'; PIC1 = 'very good picture'; PIC2 = 'good picture'; PIC3 = 'acceptable picture'; PIC4 = 'lousy picture'; PIC5 = 'Did you see something?'; PIC6 = 'more snow than anything else'; SND1A = 'excellent sound'; SND1 = 'very good sound'; SND2 = 'good sound'; SND3 = 'this bass is acceptable'; SND4 = 'What does he say?'; SND5 = 'Louder!'; SND6 = 'Is this a silent movie?'; AVAIL = 'available@location'; LENT = 'lent to'; NOCOMMENT = 'no comment'; OTHER = 'other titles'; procedure RebuildGroups(const hLV: HWND; iSubItem: integer; fEnableView: boolean); const MIN_GROUP_ID = 2000; var i : integer; j : integer; fFound : boolean; buf : string; wbuf : array[0..MAX_PATH]of widechar; gi : integer; group : TLVGroup; lvi : TLVItem60; begin if(not WinXP) then exit; if(ListView_GetItemCount(hLV) = 0) then exit; // remove all groups ListView_RemoveAllGroups(hLV); for i := 0 to ListView_GetItemCount(hLV) - 1 do begin // get item's caption SetLength(buf,MAX_PATH); ZeroMemory(@buf[1],MAX_PATH); ListView_GetItemText(hLV,i,iSubItem,@buf[1],MAX_PATH); // something to do? if(buf <> '') then begin fFound := false; ZeroMemory(@wbuf,sizeof(wbuf)); case iSubItem of // Type groups, & Sound format groups 1, 2: lstrcpyW(wbuf,pwidechar(widestring(buf))); // Media groups 3: begin j := StrToIntDef(buf,1); if(j = 1) then lstrcpyW(wbuf,pwidechar(widestring(ONEMEDIA))) else if(j = 2) then lstrcpyW(wbuf,pwidechar(widestring(TWOMEDIA))) else lstrcpyW(wbuf,pwidechar(widestring(MULTIMEDIA))); end; // Copy groups 4: begin j := StrToIntDef(buf,1); if(j = 1) then lstrcpyW(wbuf,pwidechar(widestring(SINGLECOPY))) else lstrcpyW(wbuf,pwidechar(widestring(MULTICOPY))); end; // Quality group (pic) 5: begin if(lstrcmp(pchar(buf),'1+') = 0) then lstrcpyW(wbuf,pwidechar(widestring(PIC1A))) else if(buf[1] = '1') then lstrcpyW(wbuf,pwidechar(widestring(PIC1))) else if(buf[1] = '2') then lstrcpyW(wbuf,pwidechar(widestring(PIC2))) else if(buf[1] = '3') then lstrcpyW(wbuf,pwidechar(widestring(PIC3))) else if(buf[1] = '4') then lstrcpyW(wbuf,pwidechar(widestring(PIC4))) else if(buf[1] = '5') then lstrcpyW(wbuf,pwidechar(widestring(PIC5))) else lstrcpyW(wbuf,pwidechar(widestring(PIC6))); end; // Quality group (sound) 6: begin if(lstrcmp(pchar(buf),'1+') = 0) then lstrcpyW(wbuf,pwidechar(widestring(SND1A))) else if(buf[1] = '1') then lstrcpyW(wbuf,pwidechar(widestring(SND1))) else if(buf[1] = '2') then lstrcpyW(wbuf,pwidechar(widestring(SND2))) else if(buf[1] = '3') then lstrcpyW(wbuf,pwidechar(widestring(SND3))) else if(buf[1] = '4') then lstrcpyW(wbuf,pwidechar(widestring(SND4))) else if(buf[1] = '5') then lstrcpyW(wbuf,pwidechar(widestring(SND5))) else lstrcpyW(wbuf,pwidechar(widestring(SND6))) end; // "Lent to" groups 7: begin if(buf[1] = #0) then lstrcpyW(wbuf,pwidechar(widestring(AVAIL))) else lstrcpyW(wbuf,pwidechar(widestring(LENT))); end; // Comment groups 8: begin if(buf[1] = #0) then lstrcpyW(wbuf,pwidechar(widestring(NOCOMMENT))) else lstrcpyW(wbuf,pwidechar(widestring(OTHER))) end; // Title groups else begin SetLength(buf,1); buf[1] := UPCASE(buf[1]); if(buf[1] in['A'..'Z']) then lstrcpyW(wbuf,pwidechar(widestring(buf))) else lstrcpyW(wbuf,pwidechar(widestring(OTHER))); end; end; // does the group's name exist? gi := 0; while(true) do begin ZeroMemory(@group,sizeof(TLVGroup)); group.cbSize := sizeof(TLVGroup); group.mask := LVGF_HEADER; // upps! if(ListView_GetGroupInfo(hLV, MIN_GROUP_ID+gi,group) = -1) then break; // yes if(lstrcmpiW(wbuf,group.pszHeader) = 0) then begin fFound := true; break; end; inc(gi); end; // name not found, create group if(not fFound) then begin ZeroMemory(@group,sizeof(TLVGroup)); group.cbSize := sizeof(TLVGroup); group.mask := LVGF_HEADER or LVGF_GROUPID; group.iGroupId := MIN_GROUP_ID + gi; group.pszHeader := wbuf; group.cchHeader := lstrlenW(wbuf); group.uAlign := LVGA_HEADER_CENTER; ListView_InsertGroup(hLV,-1,group); end; // send the item to this group ZeroMemory(@lvi,sizeof(lvi)); lvi.mask := LVIF_GROUPID; lvi.iItem := i; lvi.iGroupId := MIN_GROUP_ID + gi; SendMessage(hLV,LVM_SETITEM,0,LPARAM(@lvi)); end; end; // enable Group view? ListView_EnableGroupView(hLV,fEnableView); end;
Delphi-Quellcode:
Je nach angeklickter Spalte erstellt sie dabei neue Gruppen. Mehr ist nicht nötig.
procedure TMO18Form.MovieListColumnClick(Sender: TObject;
Column: TListColumn); begin ColumnToSort := Column.Index; (Sender as tCustomListView).AlphaSort; if(WinXP) then begin ListView_SetSelectedColumn(MovieList.Handle,ColumnToSort); RebuildGroups(MovieList.Handle,ColumnToSort,IDM_GROUPING.Checked); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz