![]() |
AW: Combobox in Gruppen unterteilt
In der "StandardComboBox" befindet sich im Dropdown eine Art ListBox.
Die "StandardListBox" kann man ja gruppieren ... eventuell klappt das auch mit dieser internen "ListBox" ? Ich weiß allerdings nicht in wie weit Microsoft da unterschiede macht und ob sich in der ComboBox/ComboBoxEx eine andere ListBox befindet und ob diese dieses Feature auch unterstützt, aber wenn, dann müßte man diese ListBox manuell direkt ansprechen und deren Anzeige entsprechend umstellen. |
AW: Combobox in Gruppen unterteilt
Das hier ist es zwar noch nicht, könnte aber als Grundlage dienen:
![]() |
AW: Combobox in Gruppen unterteilt
Oder, wenn's nicht besonders anspruchsvoll sein muss, einfach (aber wirkungsvoll) indem man in der Liste wie in #8 aber mit Einzug bei 'Eintrag ...' die 'Gruppe ...' nicht anwählen lässt.
Etwa in der Art
Delphi-Quellcode:
Bei Anwahl einer 'Gruppe ..' springt die Auswahl auf den ersten Eintrag in der betreffenden Gruppe - eventuell mit Hinweis, dass eben nur ein Eintrag - aber nicht die Gruppe - ausgewählt werden kann.
procedure TForm1.ComboBox1Click(Sender: TObject);
var choice: integer; begin choice := ComboBox1.ItemIndex; if choice = 0 then choice := choice + 1; if choice = 4 then choice := choice + 1; ComboBox1.ItemIndex := choice; end; Günther |
AW: Combobox in Gruppen unterteilt
Hallo nochmal,
vielen Dank schon mal für Eure Tipps. Mir geht es halt eher um die Visualisierung. Etwas in Richtung TreeView wäre schon ganz nett. Das ganze ist allerdings nur ein kleiner Schritt in Richtung bessere Darstellung, also nicht unbedingt notwendig, geht notfalls auch mit einer konventionellen Combobox. Beste Grüße, Jackandthejuice |
AW: Combobox in Gruppen unterteilt
Du meinst
![]() |
AW: Combobox in Gruppen unterteilt
Liste der Anhänge anzeigen (Anzahl: 1)
Hi !
Soll es ungefähr so aussehen : Anhang 33448 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:
Du kannst hier auch noch Linien malen, Grafiken einbinden etc.
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; 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:
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.
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; Hoffe das hilft ! Gruß Guido R. |
AW: Combobox in Gruppen unterteilt
Ganz genau, wie dort beschrieben:
Zitat:
|
AW: Combobox in Gruppen unterteilt
Hallo Guido,
vielen Dank für deine Erklärung und das Beispiel. Das bringt mich doch ein ganzes Stück weit nach vorn. Werde das soweit mal testen und gegenebenfalls noch anpassen. Sieht auf den ersten Blick jedoch sehr gut. Also, danke nochmals und beste Grüße aus Lübeck! |
AW: Combobox in Gruppen unterteilt
Hallo, so kannst Du rauf- und runter Scrollen :
Code:
... sorry, funktioniert auch nur bis zum Gruppen-Eintrag
procedure TForm1.ComboBox1Select(Sender: TObject);
begin if (ComboBox1.ItemIndex > 1) and (ComboBox1.Items[ComboBox1.ItemIndex -1][1]='_') then ComboBox1.ItemIndex:=ComboBox1.ItemIndex -2 else if ComboBox1.ItemIndex +1 < ComboBox1.Items.Count then if (ComboBox1.Items[ComboBox1.ItemIndex +1][1]='_') then ComboBox1.ItemIndex:=ComboBox1.ItemIndex +2; end; |
AW: Combobox in Gruppen unterteilt
So sollte es klappen :
Erstelle eine Variable "oldindex" vom Typ Integer und initialisiere sie mit -1;
Delphi-Quellcode:
Alternativ kann man den Wert für "oldindex" auch im "Tag" der ComboBox ablegen. Das hätte den Vorteil, dass man die selbe Funktion für mehrere ComboBoxen nutzen kann, wenn man diese dann über den Sender
procedure TForm1.ComboBox1Select(Sender: TObject);
Var newIndex : Integer; begin newIndex := ComboBox1.ItemIndex; if ComboBox1.Items[ComboBox1.ItemIndex][1]='_' then begin if oldindex<newIndex then while (ComboBox1.Items.Count>(newIndex)) AND (ComboBox1.Items[newIndex][1]='_') // runterscrollen do newIndex:=newIndex+1 else while (newIndex>-1) AND (ComboBox1.Items[newIndex][1]='_') // raufscrollen do newIndex:=newIndex-1; if (newIndex>ComboBox1.Items.Count-1) or (newIndex<=-1) // Ausserhalb des gültigen Bereiches ? then newIndex := oldIndex; ComboBox1.ItemIndex := newIndex; end; oldindex := newIndex; end;
Code:
anspricht.
(Sender AS tComboBox). statt ComboBox1.
Ideal wäre natürlich eine eigene Klasse abzuleiten, in der man oldindex und die Grouping-Funktionen integriert... Gruß Guido R. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:50 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