TCombobox "schnellsuche"

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1352
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

TCombobox "schnellsuche"

Beitrag von corpsman »

Servus zusammen,

ich baue immer wieder in meine Programme eine TCombobox ein, Manchmal Editierbar, manchmal nur als csDropDownList, aber fast immer Alphabetisch sortiert.

Nun habe ich das Problem, dass ich sehr häufig extrem viele Einträge in diesen Listen habe. Unter Windows kann man "wenigstens" durch aufklappen der Liste und dann drücken eines Buchstabens an den ersten Eintrag der mit diesem Buchstaben beginnt hin springen. Unter Linunx (Linux Mint Mate) geht es gar nicht.

Die Frage ist nun, kennt ihr einen Weg eine Vergleichbare Komponente bei der man eine Art "Schnellsuche" hat zu basteln oder gibt es dass schon für Lazarus?

Für Delphi gibts da wohl die TSmartCombobox, die ziehe ich mir nun mal rein, aber so wie das aussieht wird die nicht Windows und Linux Tauglich sein ...
Dateianhänge
Test.zip
(1.86 KiB) 17-mal heruntergeladen
--
Just try it

Benutzeravatar
Winni
Beiträge: 1320
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TCombobox "schnellsuche"

Beitrag von Winni »

Hi!

Ich hab früher mal ne schlichte Lösung mit KeyPress gebaut.

* Die Items müssen sortiert sein
* Bei Tastendruck springt er zum Item mit dem passenden Anfangsbuchstaben
* Falls kein passender Anfangsbuchstabe vorhanden springt er zum ersten Eintrag nach dem Abfangsbuchstaben
* Falls garnix passt springt er zum letzten Eintrag.

Code: Alles auswählen

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: char);
var i: integer;
    search, item : string;
begin
search := key;
key := #0;
 for i := 0 to ComboBox1.Items.count - 1 do
     begin
     item := copy (ComboBox1.Items[i],1,1);
     if UTF8UpperString(search) <= UTF8UpperString(item) then
        begin
        ComboBox1.ItemIndex:= i;
        exit;
        end;
     end; //i
    //kein Treffer
  ComboBox1.ItemIndex:= comboBox1.Items.count-1;
end;

Quick hack der bestimmt verbessert werden kann.

Winni

Benutzeravatar
theo
Beiträge: 9185
Registriert: Mo 11. Sep 2006, 19:01

Re: TCombobox "schnellsuche"

Beitrag von theo »

Sonst gibt's hier auch noch Vorschläge:
https://forum.lazarus.freepascal.org/in ... ic=44801.0

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1352
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TCombobox "schnellsuche"

Beitrag von corpsman »

oh oh ich sehe schon das scheint gar nicht so einfach zu sein.
Das von Winni funktioniert zumindest mal auf Linux, die "Lösung" aus dem internationalen Forum hat erst mal nicht funktioniert, der Step davor läuft immerhin, aber da klappt das autodropdown nicht, da muss ich also auch noch mal nachsehen woran das liegt. Zumindest ein Startpunkt. Danke, ...
--
Just try it

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1095
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TCombobox "schnellsuche"

Beitrag von fliegermichl »

Ich habe mir eine eigene Combobox gebastelt.
In der müssen die Einträge auch nicht sortiert sein.

Die Komponente habe ich in ein eigenes kleines Package gepackt.
Dateianhänge
mycombobox.zip
Komponente TMyCombobox
(1.49 KiB) 23-mal heruntergeladen

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1352
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TCombobox "schnellsuche"

Beitrag von corpsman »

@fliegermichl
Echt cool wie du das mit der Komponente gemacht hast, wollte sowas auch schon immer mal Probieren ;)

Habe auf deiner Basis mal meine "eigene" Komponente draus gebastelt.
Änderungen zu dir:
- Ein Icon für die Komponentenpalette (warum mus man da 3 mal das Icon angeben, hab nur die 24x24 Variante rein gemacht, reicht anscheinend auch)
- Anderer "Match" Algorithmus der irgendwie besser meinen Bedürfnissen entspricht.
- AutoDropdown=true

Unter Windows, ist das damit das was meinen Wünschen am Ehesten entspricht
Unter Linux muss ich es noch testen ;)
Dateianhänge
searchcombobox.zip
(2.29 KiB) 23-mal heruntergeladen
--
Just try it

Antworten