AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ComboBox Einträge editieren

Ein Thema von Chemiker · begonnen am 10. Jul 2010 · letzter Beitrag vom 17. Jul 2010
Antwort Antwort
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#1

ComboBox Einträge editieren

  Alt 10. Jul 2010, 12:36
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:
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;
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?

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#2

AW: ComboBox Einträge editieren

  Alt 10. Jul 2010, 12:56
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:
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;
[/edit]
[edit2] Den Signalton bekommst Du übrigens im OnKeyDown nicht weg, das musst Du schon im OnKeyPress machen. [/edit2]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (10. Jul 2010 um 14:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: ComboBox Einträge editieren

  Alt 11. Jul 2010, 15:09
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:
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;
Vielen Dank für Deine Hilfe.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#4

AW: ComboBox Einträge editieren

  Alt 11. Jul 2010, 17:58
Den letzten Eintrag kannst Du bei mir auch löschen, nur kannst Du den ItemIndex nicht setzen, wenn gar keine Items vorhanden sind
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#5

AW: ComboBox Einträge editieren

  Alt 11. Jul 2010, 18:33
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: ComboBox Einträge editieren

  Alt 12. Jul 2010, 00:05
Hallo,

Zitat von DeddyH:
Den letzten Eintrag kannst Du bei mir auch löschen, nur kannst Du den ItemIndex nicht setzen, wenn gar keine Items vorhanden sind
Es gelingt mir nicht den Eintrag zu löschen.

[Edit]
if cBoxServername.Items.Count > 0 then es müssen min. 2 Einträge vorhanden sein, damit die Bedingung zutrifft.
[/Edit]


Zitat von xZise:
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
Ich glaube nicht das die Ausführungszeit bei einer manuellen Eingabe so relevant ist, zu dem wird wenn nicht Enter oder Entfernen gedrückt wird Zeit eingespart weil IndexOf erst gar nicht aufgerufen wird.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.

Geändert von Chemiker (12. Jul 2010 um 07:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: ComboBox Einträge editieren

  Alt 17. Jul 2010, 13:50
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.
Vielleicht sollte man erst mal das genaue Verhalten der Combobox klären, bevor man (wild) drauflos programmiert.

Ein Beispiel:
Der Benutzer gibt eine URL ein, um sich die Daten anzeigen zu lassen.
Wird die URL gefunden dann wird sie in die Drop-Down-Liste aufgenommen.
Das Programm steuert den Zeitpunkt der Aufnahme des eingegeben Text in die Liste durch Aufruf einer Methode.
So wird verhindert, dass ungültige URLs in die Liste aufgenommen werden.
Einträge sollen nicht doppelt aufgenommen werden.
Da nur eine begrenzte Anzahl in der Drop-Down-Liste sein soll, verdrängt der neueste Einträg den Ältesten.
Wenn die Drop-Down-Liste aufgeklappt ist, darf der Benutzer mit der DEL-Taste Einträge löschen.
Er darf Einträge in der Liste nicht direkt editieren.
Die Einträge in der Liste können entweder in der Reihenfolge ihrer Aufnahme oder alphabetisch sortiert sein.


Erst wenn es eine Beschreibung dieser Art (User story) gibt, dann kann man auch was Sinnvolles Programmieren!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:27 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