Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Combobox mit suche (https://www.delphipraxis.net/109157-combobox-mit-suche.html)

Tyrael Y. 25. Feb 2008 14:54


Combobox mit suche
 
Hallo zusammen,

ich möchte gerne im Textfeld einer Combobox etwas eintippen und möchte erreichen,
daß die Liste der Einträge, die in der "Listbox" angezeigt werden, immer kleiner wird.

Delphi-Quellcode:
  procedure SelectByText(AComboBox: TComboBox);
  var i: Integer;
  begin
    for i := 0 to AComboBox.Items.Count - 1 do
    begin
      if Pos(AComboBox.SelText, AComboBox.Items[i]) > 0 then
      begin
        //hier müsste ich jetzt sagen, daß nur diese in der Liste angezeigt werden
      end;
    end;
  end;

Alle Einträge, die diesen eingegebenen Teilstring beinhalten sollen noch in der Auswahl sichtbar sein.
Gibt es da vielleicht eine Message für die Listbox über die ich nur passenden Einträge in der Listbox anzeigen kann?

Tyrael Y. 26. Feb 2008 08:11

Re: Combobox mit suche
 
Eine Lösung dafür wäre wohl, ich leite von TComboBox ab und implementiere eine zweite Referenzliste. Diese zweite Referenziste hölt die Daten in "Rohform".
Tippt der Benutzer etwas in den Editbereich, entferne ich alle Eintrgäge aus der Combobox und suche alle ähnlichen Einträge aus der Referenzliste. Diese weise ich dann der Combobox zu.

Das wäre eine Möglichkeit.

Noch jemand eine andere Idee?

taaktaak 26. Feb 2008 08:29

Re: Combobox mit suche
 
Moin, Moin,
hatte spontan die gleiche Idee, als ich den ersten Beitrag gelesen habe. Eine andere Möglichkeit sehe ich nach kurzem Überlegen nicht.

// Kann es Probleme mit AutoComplete und AutoDropDown geben? Gib doch bitte mal 'ne Info, wenn du es gelöst hast.

Tyrael Y. 26. Feb 2008 08:42

Re: Combobox mit suche
 
AutoComplete oder AutoDropDown sollte kein Problem sein.
Das einzig aufwendige ist jetzt, daß ich alle möglichen Methdoden überschreiben muss.
Diese dürfen nicht mehr neue Einträge in die Originalliste einfügen, löschen, ersetzen, tauschen usw. sondern nur noch auf meiner Liste.

Ich überlege gerade, ob ich es richtig sauber machen sollte und all dies beachten sollte oder es mir super einfach mache und diese Funktionalitäten gar nicht erst unterstütze, da es für meine Controls nicht unbedingt notwendig wäre, im Moment jedenfalls.


Ich mach erst mal paar andere Aufgaben und denke darüber später nochmal nach.

v2afrank 26. Feb 2008 09:05

Re: Combobox mit suche
 
Schau Dir doch mal TComboBoxIEStyle an

Tyrael Y. 26. Feb 2008 10:26

Re: Combobox mit suche
 
Direkt konnte ich mit dieser Komponente nix anfangen.

Ich habe es leicht modifiziert und jetzt reagiert ist so, wie ich es wollte.
Bisschen umständlich ist die Handhabung, da man die zweite Liste von Hand füllen muss. Für jedes Item, das man einfügt muss man beachten, das der angezeigte string auch in die zweite Liste eingefügt werden muss. Dies findet nicht automatsich statt.

Hier mal die modifizierte Stelle, das auskommentierte ist der Originalcode

Delphi-Quellcode:
    //if InputLength > 0 then
    //begin
      // Add the items that should be in the dropdownlist to a temporary
      // stringlist, this way you know whether there actually are items
      // to appear in the dropdownlist before manipulating the combobox.
      TempList := TStringList.Create;
      try
        // FDropDownListCandidates is the list that contains all potential items
        // for the dropdownlist.
        for i := 0 to FDropDownListCandidates.Count - 1 do
        begin
          // Add the FDropDownListCandidates to the TempList that are
          // same as strInput:

          //if UpperCase(Copy(FDropDownListCandidates[i], 1, InputLength)) =
          //  UpperCase(strInput) then
          if strInput = #0 then
          begin
            TempList.Add(FDropDownListCandidates[i]);
          end
          else
          if Pos(UpperCase(Trim(strInput)), UpperCase(FDropDownListCandidates[i])) > 0 then
          begin
            TempList.Add(FDropDownListCandidates[i]);
          end;
        end;
        if TempList.Count > 0 then
        begin
          // There are items to be displayed in the dropdownlist.
          // First add dummy items before making DroppedDown = True
          // because the DropDownCount can not be increased once it is
          // dropped down:
          for i := 1 to DropDownCount do
          begin
            Items.Add('');
          end;
          DroppedDown := True;
          // Remove dummy items:
          Items.Clear;
          // Copy TempList to Items:
          Items := TempList;
        end
        else // Templist.Count = 0, don't show the DropDownList:
          DroppedDown := False;
      finally
        TempList.Free;
      end;
    //end;
    //else // Length(strInput) = 0, no input, don't show the DropDownList:
    //  DroppedDown := False;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 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