TSuggestEdit

Rund um die LCL und andere Komponenten
Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

TSuggestEdit

Beitrag von Michl »

Angeregt durch einen Nutzer hier, der mich bat die Komponente, die ich hier erwähnte, zu veröffentlichen, mach ich dies doch einfach mal. Vielleicht kann es ja jemand gebrauchen?!

TSuggestEdit ist eine Edit-Komponente, vergleichbar mit einer TCombobox. Sie füllt sich entsprechend der eingegebenen Zeichen mit Vorschlägen des gesuchten Eintrages. Ziel für mich war es, eine Eingabekomponente ähnlich dem Eingabefeld eines Browsers zu haben, wo Vorschläge bereitgestellt werden, jedoch neue Eingaben nicht verweigert werden und letztlich zügig öfter wiederkehrende Einträge eingegeben werden können.

Ursprünglich hatte ich versucht eine TCombobox zu modifizieren, bin aber später davon abgerückt, da diese zu unterschiedlich auf den jeweiligen Systemen funktionieren. Ich nutze also ein TEdit und öffne ein Fenster unterhalb (oberhalb) des TEdits.
Da die Komponente eigentlich in einer eigenen Komponentensammlung ist, habe ich alle Abhängigkeiten nun entfernt und ein eigenes Package "Suggestedit_Package" dafür erstellt und diese Komponente ausgegliedert. Sie wird im Komponententap "Misc" eingefügt.

Anbei ist das Zip "SuggestEditPckg.zip" welches das Package und ein minimales Beispiel im Ordner "example" enthält. Dieses kann man wie folgt nutzen:
- downloaden, in ein Verzeichnis, in dem Schreibrechte für Lazarus vorhanden sind, legen und entpacken
- Lazarus öffnen und mit MainMenu -> Package -> Package-Datei (.lpk) öffnen -> die Datei "suggestedit_package.lpk" aus dem o.g. Verzeichnis wählen und öffnen
- im Packageeditor auf Button "Kompilieren" klicken und "Verwenden -> Installieren". Dann Lazarus neu bauen
- nachdem Lazarus kompiliert und neu gestartet wurde, sollte neu die Komponente im Reiter "Misc" auftauchen
- als Test, kann man einfach das Beispiel im Ordner "example" im o.g. Verzeichnis laden und ausprobieren

Verwendung:
- Komponente auf das Formular ablegen
- SortingOrder im Objectinspektor auf "soLastUsed" stellen (damit werden zuletzt genutzte Einträge oben gelistet)
- Vorschläge, die im Suggestedit gezeigt werden sollen, nach dem Erzeugen der Komponente füllen (Suggestedit.Items ist vom Typ TStringList, daher wären Suggestedit.Items.Assign oder Suggestedit.Items.LoadFromFile gültige Methoden z.B. im OnCreate vom Formular)
- bei Beendigung der App (z.B. im OnDestroy) die Vorschläge für den nächsten Programmstart speichern (z.B. Suggestedit.Items.SaveToFile)
- da das SuggestEdit die Einträge selber in einer TStringList hält, ist bei einfachsten Anwendungen kein weiterer Code notwendig (zufügen von Einträgen erfolgt automatisch, es wird OnNewItem gefeuert, bei einer Nutzung mit einer Datenbank kann dieser Eintrag dort eingetragen oder auch, mit Valid := False, verweigert werden)
- löschen von Einträgen kann man im aufgeklappten Fenster mit <Strg> + <Entf> vornehmen (es wird OnDeleteItem gefeuert, bei einer Nutzung mit einer Datenbank kann dieser Eintrag dort ebenfalls gelöscht oder auch, mit Valid := False, verweigert werden)
- um eine Eingabe zu beschleunigen ist es günstig im OnKeyDown auf "Enter" zu prüfen und das nächste Control zu wählen (ist so im Beispiel gemacht)

Limits:
- eine große Wahlliste macht das SuggestEdit sicher langsam (ungetestet)
- beim Verschieben des Formulars bleibt das Wahlfenster unter GTK2 und QT sichtbar, bis die Endposition erreicht ist

Getestet habe ich 32 und 64bit Lazarus 1.6.2, 1.6.4, Trunk unter Windows 7, 10, Linux Mint GTK2 und QT4.
Das Package habe ich unter modifiedLGPL Lizenz gestellt, gleich der LCL.

Anbei ein Snapshot von Windows 7 mit klassischem Theme und Linux Mint 17.3 KDE mit QT4.

Viel Freude damit! Bin für Feedbacks, Anregungen und gefundene Bugs dankbar!

Michl
Dateianhänge
SuggestEdit02.png
SuggestEdit01.png
SuggestEditPckg.zip
(24.6 KiB) 71-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: TSuggestEdit

Beitrag von theo »

Eigentlich eine gute Sache.
Funktioniert bei mir unter Qt aber nicht unter GTK2.

Wenn ich einen Buchstaben eingebe in der Demo, kommt direkt der ganze Name in das Edit, keine Liste.
Mit Backspace erscheint dann ein Listenfenster, welches aber keinen Inhalt hat (Siehe Bild)
Liegt vllt. am GTK2 Interface, wollte es nur gesagt haben.

Lazarus 1.9.0 r54805M FPC 3.0.2 x86_64-linux-gtk2
OpenSUSE Leap 42.2
gtk2-devel: 2.24.31-12.1
GTK2 Design: Breeze
Dateianhänge
sug.png

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TSuggestEdit

Beitrag von Michl »

Hatte es unter Linux Mint mit GTK2 getestet, da ging es (zumindest Lazarus und FPC sind identsich). Ich lerne daraus, daß GTK2 scheinbar nicht überall gleich funktioniert?!

Werde mal versuchen das System in der VM zu installieren und zu testen.

Auf jeden Fall vielen Dank fürs Testen und Feedback!!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

Re: TSuggestEdit

Beitrag von sierdolg »

Hallo Michl,

prima, es funktioniert - unter Debian Jessie (stable) x86_64, mit
4.5.0-0.bpo.1-amd64 #1 SMP Debian 4.5.1-1~bpo8+1 (2016-04-20) x86_64 GNU/Linux<br />Lazarus 1.90 54798M &amp; FPC_3.1.1, gtk2, Design:Adwaita
4.5.0-0.bpo.1-amd64 #1 SMP Debian 4.5.1-1~bpo8+1 (2016-04-20) x86_64 GNU/Linux
Lazarus 1.90 54798M & FPC_3.1.1, gtk2, Design:Adwaita
Lazarus 1.90 54798M & FPC_3.1.1, gtk2, Design:Adwaita.

Edit: Nach einer Reinstallation des aktuellen Lazarus (vielleicht war das vorhin "Qt,Qt5: fixed regression from r54696. issue #31697") tut es genauso auch mit qt5! Anbei daher zwei Bilder für die Sammlung :o)
Dateianhänge
4.5.0-0.bpo.1-amd64 #1 SMP Debian 4.5.1-1~bpo8+1 (2016-04-20) x86_64 GNU/Linux<br />Lazarus 1.90 54809M &amp; FPC_3.1.1, qt5
4.5.0-0.bpo.1-amd64 #1 SMP Debian 4.5.1-1~bpo8+1 (2016-04-20) x86_64 GNU/Linux
Lazarus 1.90 54809M & FPC_3.1.1, qt5

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TSuggestEdit

Beitrag von Michl »

Super, freut mich, danke für die Info!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TSuggestEdit

Beitrag von Michl »

Ich müßte nach momentanem Stand der Erkenntnis eine DB(!!!)LookupComboBox (oder ähnliches, jedenfalls ein DB-Control, kein freies) um eine Substring-Filterfunktion erweitern. Substring deshalb, weil ich außer "Schmidt" und "Schneider" auch noch "Busch" und "Fischer" finden möchte, wenn ich in den Editor "sch" getippt habe (in den allermeisten Fällen ist das praktisch, vor allem, wenn man sich gar nicht an den genauen ganzen Namen erinnert).

Ja, diese Info hat oben gefehlt. Dies ist eigentlich mit TSuggestEdit möglich, dazu einfach die coAnywhere in den Compareoptions setzen (hatte ich damals mit eingebaut). Allerdings habe ich diese nirgends in einem eigenen Projekt eingesetzt und somit auch nicht ausgiebig getestet. Feedbacks/Bugmeldungen darüber sind trozdem willkommen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten