Einzelnen Beitrag anzeigen

Benutzerbild von Guido R.
Guido R.

Registriert seit: 5. Jul 2007
141 Beiträge
 
Delphi 12 Athens
 
#16

AW: Combobox in Gruppen unterteilt

  Alt 25. Feb 2011, 14:22
Hi !

Soll es ungefähr so aussehen :

grpcombo.jpg

Dann versuche doch mal folgendes :

Verwende eine ComboBox und setze den Style auf "csOwnerDrawFixed". In Items der Combobox schreibst Du nun Deine Gruppen und Einträge. Gruppen werden hier mit "_" als ersten Char definiert.

_Gruppe A
Eintrag 1
Eintrag 2
Eintrag 3
_Gruppe B
Eintrag 1
Eintrag 2
Eintrag 3

Dann bearbeitest Du den OnDrawItem-Event :

Delphi-Quellcode:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
Var S:String;
begin
 with (Control as TCombobox) do
   begin
     if (Length(Items[index])>0) AND (Items[index][1]='_')
      then begin
            Canvas.Brush.color := clInfoBk;
            Canvas.Font.Style := Canvas.Font.Style+[fsBold];
            S:=Copy(Items[Index],2,Length(Items[Index]));
           end
      else begin
            Canvas.Brush.color := clWhite;
            Canvas.Font.Style := Canvas.Font.Style-[fsBold];
            S:=' '+Items[Index];
           end;
     Canvas.FillRect(Rect);
     Canvas.Font.Color := clBlack;
     Canvas.TextOut(Rect.Left,Rect.Top,S);
   end;
end;
Du kannst hier auch noch Linien malen, Grafiken einbinden etc.

Jetzt musst Du noch verhindern, dass die Gruppen selbst gewählt werden können.
Eine Möglichkeit wäre auf OnSelect zu reagieren :

Delphi-Quellcode:
procedure TForm1.ComboBox1Select(Sender: TObject);
begin
 while (ComboBox1.Items[ComboBox1.ItemIndex][1]='_') AND (ComboBox1.Items.Count>(ComboBox1.ItemIndex-1))
  do ComboBox1.ItemIndex:=ComboBox1.ItemIndex+1;
end;
Diese Vorgehensweise hat jedoch den Nachteil, dass Du bei Steuerung mittels Cursortasten die letzte Gruppe nicht mehr verlassen kannst. - Da müsstest Du Dir evtl. eine bessere Methode ausdenken, z.B. indem Du Dir die Scrollrichtung anhand des Index merkst und dann entscheidest, ob Du auf den ItemIndex ein draufzählst, oder abziehst, wenn Du auf eine Gruppe triffst.

Hoffe das hilft !

Gruß
Guido R.
  Mit Zitat antworten Zitat