![]() |
selbstlernende ComboBox
Hallo Leute,
jetzt ist es soweit, ich brauch mal einen Tip. Mein Ziel ist eine ComboBox welche fehlende Einträge automatisch ergänzt und sich diese auch merkt. Was habe ich: - eine Form mit einer ComboBox - bei Anwendungsstart wird die Itemliste aus einer Textdatei befüllt und der Itemindex steht auf -1 ComboBox1.Items.LoadFromFileFile('Cbox1Items.txt); //funktioniert - vor dem Beenden der Anwendung schreibe ich die Liste natürlich wieder in die Datei ComboBox1.Items.SaveToFile('CBoxItems.txt'); //funktioniert - jetzt das Problem: Um die Items zu ergänzen erfolgt vor dem Schreiben der Items in die Textdatei folgendes: if ComboBox1.ItemIndex = -1 then ComboBox1.Items.Add(ComboBox1.Text); Das funktioniert einwandfrei, solange man in das Textfeld der ComboBox etwas schreibt, das in der Itemliste nicht vorhanden ist (Itemindex=-1) oder man den Eintrag aus der Itemliste "pickt" (Itemindex<>-1) Schreibt man einen vorhanden Eintrag in das Feld, wird er trotz schon Vorhandensein in die Itemliste übernommen und ist natürlich mehrfach vorhanden. Es liegt wohl daran, dass der Itemindex auf -1 stehen bleibt, da nichts aus der Liste geholt wurde. Um das zu bereinigen habe ich folgendes getan: (nach Eintrag suchen und Itemindex setzen) ComboBox1.ItemIndex:=ComboBox1.Items.IndexOf(Combo Box1.Text); if ComboBox1.ItemIndex = -1 then ComboBox1.Items.Add(ComboBox1.Text); Aber leider funktioniert das auch nicht. Wo liegt der Fehler? Vielleicht noch zur Ergänzung: Falls ComboBox1.Text='' ist, wird das Programm sofort beendet (also ohne Items.Add und SaveToFile), da sich ja keine Änderungen ergeben haben. Ach ja: Es ist Delphi XE3 |
AW: selbstlernende ComboBox
Ich weiß zwar nicht, was das mit Lernen zu tun hat, aber ich würde das etwa so machen:
Delphi-Quellcode:
Oder als eigene Routine:
if ComboBox1.Items.IndexOf(ComboBox1.Text) < 0 then
ComboBox1.Items.Add(ComboBox1.Text);
Delphi-Quellcode:
Aufruf dann:
procedure AddIfNecessary(const Item: string; List: TStrings);
begin Assert(Assigned(List), 'Keine TStrings-Instanz übergeben'); if List.IndexOf(Item) < 0 then List.Add(Item); end;
Delphi-Quellcode:
AddIfNecessary(ComboBox1.Text, ComboBox1.Items);
|
AW: selbstlernende ComboBox
Der einfachste Weg wird wohl etwas in dieser Art sein
Delphi-Quellcode:
ungetestet und nur so hingetippt.
if pos(combobox.Text,Combobox.items.Text)<0 then
Combobox.Items.Add(Combobox.Text); Gruß K-H Manno, schon wieder einer schneller *schmoll* |
AW: selbstlernende ComboBox
Probier es mal so:
Delphi-Quellcode:
if ComboBox1.Items.IndexOf(ComboBox1.Text) = -1 then
ComboBox1.items.Add(ComboBox1.Text) |
AW: selbstlernende ComboBox
Würde es dann nicht Sinn machen anschließend noch den ItemIndex auf das neu hinzugekommene Element zu setzen?
|
AW: selbstlernende ComboBox
So wie ich es verstanden habe, soll der Text beim Beenden der Anwendung ggf. hinzugefügt und die Liste anschließend abgespeichert werden. Ob man den ItemIndex noch setzen will, bevor man das Programm sowieso schließt, muss jeder für sich entscheiden.
|
AW: selbstlernende ComboBox
Ich prüfe bei solchen Dingen immer mit UpperCase bzw. AnsiUpperCase um die Groß- Kleinschreibung zu ignorieren... Das verhindert ungewollte doppelte Einträge wie "Test1" und "test1".
Je nach Verwendungszweck eine Überlegung wert und nur als Tip. |
AW: selbstlernende ComboBox
Zitat:
1. blablaTESTblabla 2. TEST Würde 2. bei deinem Vorschlag eingefügt werden? |
AW: selbstlernende ComboBox
Immer wenn du eine Eingabe akzeptieren möchtest ruft du folgende Prozedur auf:
Delphi-Quellcode:
Der zuletzt eingegebene Text wandert automatisch an die Poleposition und selten verwendete Texte werden vergessen wenn die Listengröße maxitems überschritten wird.
procedure ComboboxRollingHistory(cbo:TCustomComboBox; maxitems:Integer=20);
var s : string; i : Integer; begin s := TComboBox(cbo).Text; if s='' then Exit; i := cbo.Items.IndexOf(s); if i >= 0 then begin cbo.Items.Move(i, 0); cbo.ItemIndex := 0; end else begin cbo.Items.Insert(0, s); if maxitems >= 0 then while cbo.Items.Count > maxitems do cbo.Items.Delete(cbo.Items.Count-1); end; end; Für das Laden und Speichern musst du dich gesondert kümmern (im OnCreate-Event des Formulars laden und in OnDestroy speichern). |
AW: selbstlernende ComboBox
Hallo Leute,
vielen Dank für die Unterstützung. Ich werde am WE mal was zusammenbauen. Besonders die Idee von sx2008 gefällt mir. Damit wird die Liste nicht so ewig lang. Melde mich dann nochmal. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 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