Toon posts:

[delphi] ComboBox probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Bij het gebruiken van een ComboBox heb ik het volgende probleem.

Ik wil de lijst in de ComboBox gesorteerd hebben op alfabet. Dit kan m.i. op 2 manieren:

1) Items toevoegen aan de ComboBox in de goede volgorde:
code:
1
2
3
    ComboBox.Items.Append('A'); // wordt indexnr 0
    ComboBox.Items.Append('B'); // wordt indexnr 1
    ComboBox.Items.Append('C'); // wordt indexnr 2

2) Set property sorted op true:
code:
1
2
3
4
    ComboBox.Items.Append('B'); // wordt indexnr 1
    ComboBox.Items.Append('A'); // wordt indexnr 0
    ComboBox.Items.Append('C'); // wordt indexnr 2
    ComboBox.Sorted := true;

Echter:

Ik wil van te voren weten welk indexnummer een bepaald item heeft. Dat lijkt zo geen probleem, maar het probleem is dat de string kan varieren.

De items van de ComboBox kunnen nl. in verschillende talen geplaatst worden. Bijvoorbeeld:

Duits-> krijgt indexnr 0
Engels-> krijgt indexnr 1
Nederlands-> krijgt indexnr 2

Dutch-> krijgt indexnr 0
English-> krijgt indexnr 1
German-> krijgt indexnr 2

Het is echter mijn bedoeling dat 'Nederlands' en 'Dutch' dezelfde index hebben.

Volgens mij kan dat met:
code:
1
    ComboBox.Items.Insert(indexnr, string);



Maar dan werkt
code:
1
    ComboBox.Sorted := true;

niet meer.

Vraag: Hoe kan ik de inhoud van de ComboBox laten sorteren op alfabet ZONDER dat dit invloed heeft op indexnrs?

Verwijderd

Zover ik weet kan dat niet, wat je wel kunt doen is een dynamic array maken waarin je de naam en het indexnummer van de naam zet en als je het indexnummer wat bij een naam hoort zoek dan zoek je de naam in de dynamic array op. Je kunt dan gewoon de sorted propertie van de combobox op true zetten.

Een beetje voorbeeld code:

Gebruikte variabelen en types

TTaalinfo = record
taal: string;
indexnr: integer;
end;

taallijst = array of TTaalInfo;


Tijdens het vullen van de combobox doe je zoiets:

SetLength(taallijst, length(taallijst)+1);
Taallijst[Length(Taallijst)-1].naam := taal;
Taallijst[Length(Taallijst)-1].indexnr := (juiste index nr)


Voor het opzoeken doe je zoiets:

for n := 0 to length(taallijst) do
if uppercase(taallijst[n].naam) = uppercase(cbTaal.text) then
Indexnr := taallijst.indexnr;

Verwijderd

probleem is inderdaad dat je, zodra je sorteert, je index verliest ... Althans, hij re-indexeerd zichzelf ...

Je komt er dus niet onderuit om naast je combobox er nog een andere lijst op na te houden ... Zelf prefereer ik altijd de StringList ...

Verwijderd

ComboBox.Items is van het type TStrings [ok TComboBoxStrings] dus ongeveer TStringList :)

Maar gebruik de objects van de TStrings dus iets als
code:
1
2
3
4
ComboBox1.Items.AddObject('Dutch', Pointer(0));
ComboBox1.Items.AddObject('English', Pointer(1));
ComboBox1.Items.AddObject('German', Pointer(2));
ComboBox1.Sorted := True;

Typecast de integers naar pointer.

Dan staat de 'indexnr' in de Objects van de Items, dus bekijk die dan met
code:
1
ShowMessage(IntToStr(Integer(ComboBox1.Items.Objects[0])))

Typecast de pointers weer naar integer.

Code heb ik niet getest :)

Verwijderd

Op woensdag 19 december 2001 09:57 schreef delighteddennis het volgende:
Bij het gebruiken van een ComboBox heb ik het volgende probleem.

Ik wil de lijst in de ComboBox gesorteerd hebben op alfabet. Dit kan m.i. op 2 manieren:

1) Items toevoegen aan de ComboBox in de goede volgorde:
code:
1
2
3
    ComboBox.Items.Append('A'); // wordt indexnr 0
    ComboBox.Items.Append('B'); // wordt indexnr 1
    ComboBox.Items.Append('C'); // wordt indexnr 2

2) Set property sorted op true:
code:
1
2
3
4
    ComboBox.Items.Append('B'); // wordt indexnr 1
    ComboBox.Items.Append('A'); // wordt indexnr 0
    ComboBox.Items.Append('C'); // wordt indexnr 2
    ComboBox.Sorted := true;

Echter:

Ik wil van te voren weten welk indexnummer een bepaald item heeft. Dat lijkt zo geen probleem, maar het probleem is dat de string kan varieren.

De items van de ComboBox kunnen nl. in verschillende talen geplaatst worden. Bijvoorbeeld:

Duits-> krijgt indexnr 0
Engels-> krijgt indexnr 1
Nederlands-> krijgt indexnr 2

Dutch-> krijgt indexnr 0
English-> krijgt indexnr 1
German-> krijgt indexnr 2

Het is echter mijn bedoeling dat 'Nederlands' en 'Dutch' dezelfde index hebben.

Volgens mij kan dat met:
code:
1
    ComboBox.Items.Insert(indexnr, string);

Maar dan werkt
code:
1
    ComboBox.Sorted := true;

niet meer.

Vraag: Hoe kan ik de inhoud van de ComboBox laten sorteren op alfabet ZONDER dat dit invloed heeft op indexnrs?
Om de items van een ComboBox eenmaal te sorteren zonder dat de sorted property op true gezet hoeft te worden het volgende:
code:
1
  TStringList(ComboBox1.Items).Sort;

Als je items bewerkt/toevoegt/verwijderd dan wordt niet opnieuw geïndexeerd.

Heb de code niet getest, compileerde wel goed.

Verwijderd

Mmm, dat gaat niet werken.

ComboBox.Items is niet van het type TStringList, en kent niet de method Sort.

Dat het compileert klopt wel, omdat je een pointer naar elke willekeurige class kan type-casten.

Verwijderd

Op donderdag 20 december 2001 13:03 schreef DiFool het volgende:
Mmm, dat gaat niet werken.

ComboBox.Items is niet van het type TStringList, en kent niet de method Sort.

Dat het compileert klopt wel, omdat je een pointer naar elke willekeurige class kan type-casten.
Ik was idd. een beetje in de war, TStringList is afgeleide van TStrings, niet andersom...

Maar goed, het volgende werkt wel (getest):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.Button1Click(Sender: TObject);
var
  SL: TStringList;
begin
  with ComboBox1.Items do
  begin
     Clear;
     Add('B');
     Add('C');
     Add('A');
  end;
  SL:=TStringList.Create;
  try
    SL.Assign(ComboBox1.Items);
    SL.Sort;
    ComboBox1.Items.Assign(SL);
  finally
    SL.Free;
  end;
end;

Verwijderd

Topicstarter
Dit lijkt inderdaad te werken. :)

Thanx

Verwijderd

Of ik begrijp het probleem verkeerd of jij, en volgens mij jij?

Volgens mij wil delighteddennis de regels in een combobox sorteren op alfabet, maar wel de positie weten van elke regel voor het sorteren.

Dit kun je doen door de waarde van ComboBox.Items.Objects[I] te gebruiken voor regel I; hier kun je een integer in zetten, dus bv de index van de regel voor het sorteren.

Verwijderd

Topicstarter
Of ik begrijp het probleem verkeerd of jij, en volgens mij jij?
:?
Volgens mij wil delighteddennis de regels in een combobox sorteren op alfabet, maar wel de positie weten van elke regel voor het sorteren.
Bijna... ik wil weten wat de (vaste) index van een ComboboxItem is. Ook als de volgorde in de Combobox wordt gewijzigd.

string X moet altijd index 0 hebben ongeacht de inhoud van X
string Y moet altijd index 0 hebben ongeacht de inhoud van Y
string Z moet altijd index 0 hebben ongeacht de inhoud van Z

Verwijderd

Sorry, ik reageerde op hvdberg [ik quote vaak niet]

Er is maar 1 index voor de strings in de combobox en dit is de plaats in de lijst. Als je de combobox sorteert veranderen de indexen van de strings; zo is het nu eenmaal.

Er is niet zoiets als een vaste index, maar je kunt een getal in Objects zetten die blijft bij een bepaalde string; zoals ik al uitgelegd heb.

Verwijderd

Op donderdag 20 december 2001 14:31 schreef DiFool het volgende:
Sorry, ik reageerde op hvdberg [ik quote vaak niet]

Er is maar 1 index voor de strings in de combobox en dit is de plaats in de lijst. Als je de combobox sorteert veranderen de indexen van de strings; zo is het nu eenmaal.

Er is niet zoiets als een vaste index, maar je kunt een getal in Objects zetten die blijft bij een bepaalde string; zoals ik al uitgelegd heb.
Dan nog moet je sorteerroutines gebruiken en nu heb ik gewoon aangegeven hoe je de strings kunt laten sorteren. Na dit sorteren ben je weer volledig vrij om toe te voegen/bewerken/verwijderen zonder dat er opnieuw automatisch gesorteerd wordt. Dat is het voordeel van de methode Sort ten opzichte van de property Sorted.

En wil je de index gebruiken? Gebruik de IndexOf methode.
Pagina: 1