Hättet ihr vielleicht ein paar Ratschläge für mich?
Worum geht es?
Ich mus die Sprach-Codes nach ISO-639-2 (484 Codes) und die Länder Codes nach ccTLD (251 Codes) in meinem Tool verarbeiten.
Der Benutzer kann aus einer ComboBoxEx(CBE) die Einträge auswählen(Sprach/Länder-Code(SL-Codes) mit Bezeichnung ). (Für eine später Speicherung wird nur der SL-Code verwendet.)
In einem VirtualStringTree(VST) gibt es mehrere Nodes wo dann die SL-Codes getrennt gespeichert werden (also nicht direkt in den Nodes dafür gibt es Datenklassen).
Auf jedenfall, muss bei einem neu ausgwählten Node die CBE auf den entsprechenden SL-Code eintrag eingestellt werden.
Bei einer CBE gibt es irgendwie nicht die function IndexOf() und selbst wenn, macht diese Funktion aus nichts anderes als die Einträge durchgehen und prüfen ob der String übereinstimmt -> was ein bissl dauert wenn es der letzte Eintrag ist.
Abgesehen davon würde das auch so nicht recht funktionieren, da ich ja als gespeicherten Datensatz nur den SL-Code habe und nicht die volle Bezeichung.
Da würde mir IndexOf() auch nur -1 liefern.
Alernative hatte ich daran gedacht einen weiteren Datensatz zu speichern der den ItemIndex von der CBE darstellt.
Allerdings würde das nur dann funktionieren wenn man nur einen einzigen SL-Code auswählen kann.
Es ist aber möglich in der CBE mehrere SL-Codes anzuhaken und zu speichern. -> Dann würde mir einfallen, eben alle diese ItemIndexe von den angehakten Einträgen zuspeichern.
Aber wie am besten?
Ein dynamisches array?, mag ich irgendwie nicht wirklich.
Eine IntegerList (habe ich mal gesucht und gefunden)?
Das alles würde soweit aber nur funktionieren wenn das mit den SL-Codes statisch wäre, da man aber als Benutzer einfluss auf die Reihenfolge, und sogar die Anzahl der angezeigten SL-Codes hat, gestalltet es sich dann doch etwas schwierger (für mich).
Was hätte ich gerne.
Wenn ich einen neuen Node selektiere, hole ich mir die SL-Codes Daten(ger eng ita) und dann ohne viel zu rechnen einen ItemIndex(mehrere Indexe) um die CBE einzustellen. Denn es gibt ja auch gleich zwei CBE's Sprache und Länder.
Überlegt hatte ich mir die SL-Codes mit einer case-of Anweisung zu verarbeiten. Geht aber auch nicht so einfach wegen den veränderbaren SL-Code Idexen in der CBE.
Nun wollte ich jedem SL-Code ein ArrayFeld in einem IntegerArray zuweisen worin dann der aktuelle CBE-Index steht (das IntegerArray kann ich dann immer erneueren wenn der Benutzer etwas geändert hat).
Naja irgendwie habe ich das Gefühl nicht recht weiter zu wissen oder mich irgendwie verrannt zu haben.
Könntet ihr mir ein paar tipps geben wie man so etwas angeht.
hier noch ein bissl QuellCode:
Code: Alles auswählen
type
TIndexLanguages = array[0..483] of Integer;
var
LanguagesIdx: TIndexLanguages;
// Get - Sprach Array Index
GetLngArrayIdx(const aLng: String): Integer;
begin
case aLng of // Lng auswerten
'','und': Result:=0;
'aar': Result:=1;
'abk': Result:=2;
'ace': Result:=3;
'ach': Result:=4;
'ada': Result:=5;
.....
'znd': Result:=479;
'zul': Result:=480;
'zun': Result:=481;
'zxx': Result:=482;
'zza': Result:=483;
end;
// Get - Sprach ItemIndex für CoB's, CBE's
GetLngItemIndex(const aLng: String): Integer;
begin
Result:=LanguagesIdx[GetLngArrayIdx(aLng)];
end;
// CBE Index einstellen (nur als beispiel - und nur für einen Index)
procedure SetCBEIndex;
begin
CBE_Lng.ItemIndex:=GetLngItemIndex(eng);
end;
Wie steht es denn um eine solche case-of Anweisung mit sehr vielen "Einträgen", mit der Geschwindigkeit. Ich hatte beim Debuggen schon das Gefühl das es etwas dauert (nach F8 drücken) bis die nächste Zeile selketiert wird.
hubble