Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Combobox in Gruppen unterteilt (https://www.delphipraxis.net/158628-combobox-gruppen-unterteilt.html)

Jack and the Juice 24. Feb 2011 12:32

Combobox in Gruppen unterteilt
 
Hallo,

vielleicht stehe ich auch grade nur komplett auf'm Schlauch, aber eventuell kann mir ja jemand von Euch weiterhelfen.
Ich würde in einer Combobox gerne zwei unterschiedliche Gruppen haben, die jeweils eingie Items enthalten. Es soll also quasi so eine Art Gliederung entstehen, wobei die Überschriften nicht anwählbar sind.

Ich werf jetzt mal einfach den Begriff Comboboxex in den Raum, und hoffe, dass mir da jemand behilflich sein kann.

Vielen Dank schonmal,
Jackandthejuice

David Martens 24. Feb 2011 12:46

AW: Combobox in Gruppen unterteilt
 
Meinst du eine zweispaltige Combobox?

DeddyH 24. Feb 2011 12:50

AW: Combobox in Gruppen unterteilt
 
Wohl eher eine gruppierte, wenn ich das richtig verstanden habe.

Jack and the Juice 24. Feb 2011 12:56

AW: Combobox in Gruppen unterteilt
 
Ja genau, eine gruppierte meinte ich. Zweispaltig würde mir in dem Zusammenhang nicht viel nützen.
Wäre nett, wenn beispielsweise bei dem Item nach der Zwischenüberschrift eine kleine Rückung wäre. Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt. :)

Nersgatt 24. Feb 2011 12:59

AW: Combobox in Gruppen unterteilt
 
mit den (nahezu allmächtigen) Komponenten von DevExpress sollte das möglich sein. Auf jeden Fall kann man damit eine Combobox erstellen, wo in dem DropDown-Fenster ein Grid ist, das das selbe kann, wie das TcxGrid. Und das TcxGrid kann u.A. auch Gruppieren (und noch viel mehr).
http://devexpress.com/Products/VCL/ExQuantumGrid/

Nersgatt 24. Feb 2011 13:02

AW: Combobox in Gruppen unterteilt
 
Als Ergänzung: Wenn Du es mit der Standardcombobox machen willst, dann musst Du die Items selbst zeichnen.
Hier gibts ein Beispiel an dem Du Dich orientieren kannst:
http://www.swissdelphicenter.ch/de/showcode.php?id=737

gb0 24. Feb 2011 13:03

AW: Combobox in Gruppen unterteilt
 
Danke für die erste Klärung.
Mich wundert außerdem
Zitat:

eine Art Gliederung [...], wobei die Überschriften nicht anwählbar sind.
Es ist doch das Wesen einer ComboBox, dass ich etwas aus einer bestimmten Anzahl von Möglichkeiten aus- bzw anwählen kann. Sonst täte es eine ListBox (sogar Label) auch, bzw die Kombination von ComboBox für die Grobauswahl + Listbox für die darunter liegende Ebene...

Günther

Jack and the Juice 24. Feb 2011 13:10

AW: Combobox in Gruppen unterteilt
 
OK, vielleicht habe ich mich nicht ganz deutlich ausgedrückt, also noch einmal zur Erklärung.

Ich habe eine Combobox, die wie folgt aufgebaut sein soll

Gruppe A
Eintrag 1
Eintrag 2
Eintrag 3
Gruppe B
Eintrag 1
Eintrag 2
Eintrag 3

Dabei sollen die Einträge selbstverständlich anwählbar sein, sonst wäre die Combobox ja tatsächlich überflüssig. Die Gruppen allerdings sollen nur zur besseren Übersicht dienen.

Vielen Dank schonmal für die Hilfe!

Nersgatt 24. Feb 2011 13:25

AW: Combobox in Gruppen unterteilt
 
Sieht für mich aus wie ein TEdit + TButton + TTreeView
Beim Buttonclick blendest Du das Treeview ein. Und bei Klick auf ein Item in Treeview wieder aus und aktualisierst das TEdit entsprechend.

Wenn Du das an mehreren Stellen benötigst, macht Dir auf der Basis eine eigene Komponente.

DeddyH 24. Feb 2011 13:34

AW: Combobox in Gruppen unterteilt
 
Ich bin mir ziemlich sicher, dass ich etwas in der Art vor kurzem noch gesehen habe, leider finde ich es nicht wieder.

himitsu 24. Feb 2011 13:36

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.

DeddyH 24. Feb 2011 13:40

AW: Combobox in Gruppen unterteilt
 
Das hier ist es zwar noch nicht, könnte aber als Grundlage dienen: http://delphi.about.com/od/vclusing/...incombobox.htm

gb0 24. Feb 2011 14:33

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:
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;
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.

Günther

Jack and the Juice 25. Feb 2011 10:28

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

freak4fun 25. Feb 2011 13:18

AW: Combobox in Gruppen unterteilt
 
Du meinst sowas, richtig?

Guido R. 25. Feb 2011 13:22

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:
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.

Jack and the Juice 25. Feb 2011 13:23

AW: Combobox in Gruppen unterteilt
 
Ganz genau, wie dort beschrieben:
Zitat:

Die meisten aktuellen Browser beschränken sich bei der Darstellung jedoch auf eine visuelle Unterscheidung der Untergruppen (als Beispiel ein Screenshot aus Opera 8.5):
So in der Art wäre das schön.

Jack and the Juice 25. Feb 2011 13:31

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!

markus5766h 25. Feb 2011 15:16

AW: Combobox in Gruppen unterteilt
 
Hallo, so kannst Du rauf- und runter Scrollen :
Code:
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;
... sorry, funktioniert auch nur bis zum Gruppen-Eintrag

Guido R. 25. Feb 2011 16:53

AW: Combobox in Gruppen unterteilt
 
So sollte es klappen :

Erstelle eine Variable "oldindex" vom Typ Integer und initialisiere sie mit -1;

Delphi-Quellcode:
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;
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
Code:
(Sender AS tComboBox). statt ComboBox1.
anspricht.

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 23:31 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