![]() |
ComboBox Einträge editieren
Hallo,
ich arbeite zurzeit mit einer ComboBox in der Einträge vorhanden sind und weitere im Programm hinzugefügt werden sollen, desweiteren sollen Einträge auch wieder gelöscht werden. Dafür wird das Event KeyDown benutzt. Ein wenig Quelltext:
Delphi-Quellcode:
Bevor ich jetzt weiter mache ist meine Frage, gibt’s dafür eigentlich eine fertige Lösung die ich noch nicht gefunden habe, oder muss man es eben alles von Hand machen?
procedure TfrmMainDB_Eigenschaften.cBoxServernameKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState); var i: integer; begin if Key = VK_RETURN then begin if cBoxServername.ItemIndex= -1 then // Kein Eintrag vorhanden // ohne Prüfung eintragen begin cBoxServername.Items.Add(cBoxServername.Text); end else begin for I := 0 to cBoxServername.Items.Count - 1 do begin // Doppelte und leere Einträge verhindern if not (cBoxServername.Items[i] = cBoxServername.Text) and not (Trim(cBoxServername.Text)= '') then begin if cBoxServername.Items.IndexOf(cBoxServername.Text) < 0 then begin cBoxServername.Items.Add(cBoxServername.Text); end; end; end; end; Key:= 0; end; if Key = VK_DELETE then begin for I := 0 to cBoxServername.Items.Count - 1 do begin if cBoxServername.Items[i] = cBoxServername.Text then begin cBoxServername.DeleteSelected; // Angezeiter Eintrage löschen cBoxServername.ItemIndex := 0; // Auf den ersten Eintrag einstellen // soweit vorhanden. key:= 0; break; end; end; end; if Key = VK_BACK then begin key:= 0; end; end; Bis bald Chemiker |
AW: ComboBox Einträge editieren
Sollte nicht in beiden Fällen eine Prüfung mit IndexOf ausreichen? Irgendwie sieht mir das so zu kompliziert aus.
[edit] Ich dachte mir das in etwa so:
Delphi-Quellcode:
[/edit]
procedure TForm1.cBoxServernameKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var idx: integer; begin idx := cBoxServername.Items.IndexOf(cBoxServername.Text); case Key of VK_RETURN: begin Key := 0; if idx = -1 then cBoxServername.Items.Add(cBoxServername.Text); end; VK_DELETE: begin if idx > -1 then begin cBoxServername.Items.Delete(idx); if cBoxServername.Items.Count > 0 then cBoxServername.ItemIndex := 0; end; Key := 0; end; end; end; [edit2] Den Signalton bekommst Du übrigens im OnKeyDown nicht weg, das musst Du schon im OnKeyPress machen. [/edit2] |
AW: ComboBox Einträge editieren
Hallo DaddyH,
hatte den Quellcode erst grade gesehen. Hatte heute Morgen das Event nach Deiner Empfehlung von gestern noch mal Überarbeitet. Abweichend zu Deiner Lösung werden keine Leerzeichen in die String-Liste übernommen und man kann auch den letzten Eintrag löschen. Habe zusätzlich AutoComplete auf FLASE gesetzt, damit können die vorhanden Einträge besser bearbeitet werden.
Delphi-Quellcode:
Vielen Dank für Deine Hilfe.
procedure TfrmMainDB_Eigenschaften.cBoxServernameKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState); begin if Key = VK_RETURN then begin // Leer Zeichen nicht in die Liste übernehmen. if ((cBoxServername.Items.IndexOf(cBoxServername.Text) = -1) and (not (Trim(cBoxServername.Text) = ''))) then begin cBoxServername.Items.Add(cBoxServername.Text); end; end; if Key = VK_DELETE then begin if cBoxServername.Items.IndexOf(cBoxServername.Text) > -1 then begin cBoxServername.Items.Delete(cBoxServername.Items.IndexOf(cBoxServername.Text)); if cBoxServername.Items.Count > -1 then begin cBoxServername.ItemIndex := 0; // Auf den ersten Eintrag einstellen // soweit vorhanden. end; end; end; Key:= 0; end; Bis bald Chemiker |
AW: ComboBox Einträge editieren
Den letzten Eintrag kannst Du bei mir auch löschen, nur kannst Du den ItemIndex nicht setzen, wenn gar keine Items vorhanden sind ;)
|
AW: ComboBox Einträge editieren
Ich würde auch nicht öfters IndexOf() aufrufen ;) Ich meine O(2n) liegt zwar auch in O(n), aber es halbiert i.A. die Laufzeit ;)
MfG Fabian |
AW: ComboBox Einträge editieren
Hallo,
Zitat:
[Edit]
Delphi-Quellcode:
es müssen min. 2 Einträge vorhanden sein, damit die Bedingung zutrifft.
if cBoxServername.Items.Count > 0 then
[/Edit] Zitat:
Bis bald Chemiker |
AW: ComboBox Einträge editieren
Zitat:
[edit] OK, hier noch einmal eine überarbeitete Version:
Delphi-Quellcode:
[/edit]
procedure TForm1.cBoxServernameKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var idx: integer; begin //Index einmalig ermitteln idx := cBoxServername.Items.IndexOf(cBoxServername.Text); //case statt if -> IMHO übersichtlicher und schneller case Key of VK_RETURN: begin //wenn Text nicht vorhanden und //nicht nur aus Leer- bzw. Steuerzeichen bestehend -> eintragen if (idx = -1) and (trim(cBoxServername.Text) <> '') then cBoxServername.Items.Add(cBoxServername.Text); end; VK_DELETE: begin //wenn Eintrag gefunden if idx > -1 then begin //Eintrag löschen cBoxServername.Items.Delete(idx); //Erst einmal den alten Text löschen cBoxServername.Text := ''; //-> wird ggf. durch geänderten Index neu gesetzt if cBoxServername.Items.Count > 0 then cBoxServername.ItemIndex := 0; //notwendig, da Anzeige sonst nicht aktualisiert wird Key := 0; end; end; end; end; procedure TForm1.cBoxServernameKeyPress(Sender: TObject; var Key: Char); begin //"Bimmeln" unterbinden if Key = sLineBreak[1] then Key := #0; end; |
AW: ComboBox Einträge editieren
Hallo DeddyH,
Zitat:
Count = 0 erster Eintrag Count = 1 zweiter Eintrag Wenn Count > 0 // sollte Count mindestens 1 sein um die Bedienung zu erfüllen, oder? Bis bald Chemiker |
AW: ComboBox Einträge editieren
Zitat:
|
AW: ComboBox Einträge editieren
Zitat:
Zum besseren Verständnis:
Delphi-Quellcode:
//Kein Eintrag in der Liste combobox1.Items.Clear; showmessage(inttostr(combobox1.Items.Count)); //4 Einträge zur Liste hinzufügen for i:= 0 to 3 do combobox1.items.add('test-'+inttostr(i)); showmessage(inttostr(combobox1.Items.Count)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 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 by Thomas Breitkreuz