AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi ListView Elemente Gruppieren: Terminierung der IDs?!

ListView Elemente Gruppieren: Terminierung der IDs?!

Ein Thema von MCXSC · begonnen am 2. Mär 2005 · letzter Beitrag vom 2. Mär 2005
Antwort Antwort
MCXSC
(Gast)

n/a Beiträge
 
#1

ListView Elemente Gruppieren: Terminierung der IDs?!

  Alt 2. Mär 2005, 21:35
Hi!

Erst einmal eine Information vorab: Ich beziehe mich hier auf das Thema "Gruppenzwang! (Gruppierung)" aus dem folgenden Thread: http://www.delphipraxis.net/internal...ew+gruppierung.

Und zwar müssen die IDs der Gruppen immer unterschiedlich sein. Ansonsten werden die Gruppennamen verwendet, die zum Start die ID hatten...

Delphi-Quellcode:
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;
Ich meine dabei, folgenden Abschnitt:

Delphi-Quellcode:
  // wie lautet die ID?
  lv60.iGroupId := 1;
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)???

Ich hoffe jemand versteht, was ich meine...?

MCXSC
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: ListView Elemente Gruppieren: Terminierung der IDs?!

  Alt 2. Mär 2005, 21:44
Nicht so richtig, und ich sollte es wohl verstehen, denn du beziehst dich auf meinen Beitrag.
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! 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.
  Mit Zitat antworten Zitat
MCXSC
(Gast)

n/a Beiträge
 
#3

Re: ListView Elemente Gruppieren: Terminierung der IDs?!

  Alt 2. Mär 2005, 21:57
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:
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));
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;")).

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
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4

Re: ListView Elemente Gruppieren: Terminierung der IDs?!

  Alt 2. Mär 2005, 22:05
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 Win32-API-Tutorials müsste es vollständiger drin stehen. Speziell der Befehl "ListView_RemoveAllGroups" sollte erwähnt werden.

Wie auch immer, im angesprochenen MovieOrganizer von Chakotay habe ich eine einzige Prozedur, die für die Gruppierung sorgt:
Delphi-Quellcode:
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;
Und so wird sie bspw. im "OnColumnClick"-Ereignis der List-View aufgerufen:
Delphi-Quellcode:
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;
Je nach angeklickter Spalte erstellt sie dabei neue Gruppen. Mehr ist nicht nötig.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz