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
TSuggestEdit
TSuggestEdit
- Dateianhänge
-
- SuggestEditPckg.zip
- (24.6 KiB) 71-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: TSuggestEdit
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
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
Re: TSuggestEdit
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!!
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;
Re: TSuggestEdit
Hallo Michl,
prima, es funktioniert - unter Debian Jessie (stable) x86_64, mit 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 )
prima, es funktioniert - unter Debian Jessie (stable) x86_64, mit 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 )
Re: TSuggestEdit
Super, freut mich, danke für die Info!
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: TSuggestEdit
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;