Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Editbox mit Onlinesuche (https://www.delphipraxis.net/44693-editbox-mit-onlinesuche.html)

Smiley 22. Apr 2005 21:32


Editbox mit Onlinesuche
 
Ich hab wieder mal ein Problem.

Ich versuche eine sogenannte "Onlinesuche" aus einer EditBox heraus hinzubekommen.
Man gibt etwas in die Editbox ein und daraufhin soll z.B. in einer Listbox eine Liste aus einer Datenbank angezeigt werden, die mit diesen Werten beginnt. (Onlinesuche=pro eingegebenem Zeichen suchen nicht erst nach Enter)
Das ist im Prinzip noch nicht so schwer.
Über das keypress Ereignis die Taste abfragen und auswerten.

Mein erstes Problem ist:
Wenn ich mit der Rücktaste ein Zeichen lösche, dann geht das bis zum zweiten Zeichen gut, schreibe ich ein drittes Zeichen und drücke die Backspace-Taste, dann löscht er mir 2 Zeichen weg.
Irgendwo hab ich da einen Denkfehler, aber wo ?

Hier mal der Sourcecode der keypress-Routine

Delphi-Quellcode:
procedure TForm1.EdKontoKeyPress(Sender: TObject; var Key: Char);
begin
  DataKonto:=DataKonto+key;
  If key = chr(vk_delete) Then
    DataKonto:=''; // Wenn Del-Taste dann alles löschen
  If key = chr(vk_back) Then
    begin
      Delete(DataKonto,Length(DataKonto)-1,2); // Wenn Rück-Taste dann nach links löschen
      EdKonto.Text:=DataKonto;
    end;
  Form1.listbox1.Items.clear;
  Form1.QCD1.Close;
  Form1.QCD1.SQL.Clear;
  Form1.QCD1.SQL.Add('Select * From Konten Where KontoNr Like '+QuotedStr(DataKonto+'%'));
  Form1.QCD1.Open;
  While not Form1.QCD1.Eof do
    Begin
      Form1.ListBox1.Items.Add(form1.QCD1KontoNr.AsString + ' ' + form1.QCD1Beschriftung.AsString);
      Form1.QCD1.Next
    End;
end;
Mein zweites Problem ist:
Ich habe irgendwo mal gelesen, wie man sowas auch mit einem Timer macht, dass man die Suche und auflistung über ein Timerereignis

laufen lässt, damit die Eingabe zügiger abläuft. Das war ein tolles Beispiel, ich kann mich aber nicht mehr erinnern wo ich es gesehen

habe. Ich habe fast alle Bücher von Doberenz/Kowalski, möglich dass es in einem dieser Bücher drin war, ich kann es aber nicht mehr

finden. Vieleicht hat das jemand gesehen und kann mir sagen wo das war.

Fall jemand eine bessere Idee hat das Problem anzugehen, freue ich mich auch über andere Verfahrensweisen.

MathiasSimmack 22. Apr 2005 21:39

Re: Editbox mit Onlinesuche
 
Ich habe zwar zu deinem Problem erst mal keine Lösung, aber einen Rat hätte ich: Nimm den Teil, der mit der Suche in der DB zu tun hat, aus der Ereignisfunktion raus
Delphi-Quellcode:
  Form1.listbox1.Items.clear;
  Form1.QCD1.Close;
  Form1.QCD1.SQL.Clear;
  Form1.QCD1.SQL.Add('Select * From Konten Where KontoNr Like '+QuotedStr(DataKonto+'%'));
  Form1.QCD1.Open;
  While not Form1.QCD1.Eof do
    Begin
      Form1.ListBox1.Items.Add(form1.QCD1KontoNr.AsString + ' ' +
        form1.QCD1Beschriftung.AsString);
      Form1.QCD1.Next
    End;
und schreib dafür eine separate Funktion, der man den eingetippten Such-String übergeben kann.


Edit: Jetzt habe ich auch eine Lösung bzw. Frage. Warum nimmst du nicht das "OnChange"-Ereignis? Du brauchst doch auf die Tasten nicht reagieren, das macht doch das Eingabefeld von sich. Im "OnChange" liest du bloß den aktuellen Inhalt aus und übergibst den an die oben vorgeschlagene Suchfunktion.

DP-Maintenance 22. Apr 2005 21:40

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Sonstige Fragen zu Delphi" verschoben.

Smiley 22. Apr 2005 22:05

Re: Editbox mit Onlinesuche
 
Es ist ja nicht zu fassen, da quält man sich Tagelang mit einem Problem herum und dann sagt einem jemand mit einem Fingerschnippen wie das doch ganz einfach geht.
Mit dem OnChange Ereignis geht das ja ganz einfach, aber da habe ich doch als erstes angesetzt.
Ich frage mich warum bin ich blos auf die Idee mit dem keypress-Ereignis gekommen ?

Danke für den Tip.

Dass der Suchen-Block in eine eigene Routine kommt ist klar, war ja nur zum testen hier mit drin, ich brauch das ja für die anderen Eingabefelder auch noch.

Smiley 22. Apr 2005 22:31

Re: Editbox mit Onlinesuche
 
Noch ein kleines Problem hierbei, wie komme ich aus der EditBox mit Return raus ins nächste Feld anstatt nur mit Tab ?

Matze 22. Apr 2005 22:33

Re: Editbox mit Onlinesuche
 
Suche mal nach Delphi-Referenz durchsuchenSetFocus.

JasonDX 22. Apr 2005 22:33

Re: Editbox mit Onlinesuche
 
Delphi-Quellcode:
Edit1.SetFocus;
und Delphi-Referenz durchsuchenOnKeyPress dürfte dir da weiterhelfen

(obwohl normalerweise: Neue Frage, neuer Thread ;) )

Smiley 22. Apr 2005 22:46

Re: Editbox mit Onlinesuche
 
Editx.setfocus ist schon ganz prima, aber was wenn ich die Tabulatorreihenfolge benutzen möchte die ich im Formular eingestellt habe.
Sonst springt er mir bei Tab ja woanders hin als bei Return oder ich muss die Tabreihenfolge im Objectinspector und im Quelltext verändern, wenn sich was ändert.
Ich dachte mehr an eine Lösung dass ich vk_return abfrage und in vk_tab umsetze, aber der neue key Inhalt wird in der keypressroutine ja nicht ausgeführt.

Luckie 22. Apr 2005 22:48

Re: Editbox mit Onlinesuche
 
Wie so oft, muss man die Suche nur mit den richtigen Begriffen füttern, Und in diesem Fall sind sie geradezu trivial: Hier im Forum suchenreturn tab. :roll:

Smiley 22. Apr 2005 23:02

Re: Editbox mit Onlinesuche
 
Super Luckie du hast es wieder mal genau getroffen.

Perform(WM_NextDlgCtl, 0, 0);

Deine Tips sind immer wieder Gold wert.

Übrigens ich bin ein großer Fan von Dir.
Deine Tips sind immer genial und ich habe noch nicht gelesen, dass Du mal unwirsch oder agressiv geworden bist.
Deine Webseite find ich auch prima mit all den Beispielen.
Mit dem finden der Suchwörter hab ich immer etwas Probleme, ich hatte nach return und edit gesucht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 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-2025 by Thomas Breitkreuz