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 automatische Suche in ListBox abschalten (https://www.delphipraxis.net/149805-automatische-suche-listbox-abschalten.html)

delphin 30. Mär 2010 17:51


automatische Suche in ListBox abschalten
 
Hallo Freunde,

ich bin am Verzweifeln, weil ich in einer Listbox die Standardsuchfunktion einfach nicht deaktivert bekomme.

Wenn ich eine ListBox z.B. mit folgenden Daten im Create-Ereignis füttere:

Delphi-Quellcode:
with ListBox1 do
begin Items.Add('07159');
      Items.Add('f8130');
      Items.Add('10300');
      Items.Add('ab255');
      Items.Add('11150');
      Items.Add('17636');
end;
und nixweiter tue als das - kann ich mit den "Hoch" und "Runter"-Tasten wunderbar in der Liste navigieren.

Drücke ich die Taste "x" passiert auch nichts, d.h. der Kursor steht, wo er zuletzt eben stand und bewegt sich nicht, weil kein Eintrag mit "x" losgeht.

Drücke ich aber nunmehr eine "1", dann springt der Balken auf die erste vorhandene "1" sprich auf die 3. Stelle - in meinem Fall zur '10300'. Drücke ich erneut auf die Taste "1" springt er dann auf die 5 Position, usw.

Meine Frage: Welche Eigenschaft schaltet dieses ungewollte Sucheverhalten ab?

Für Eure Hinweise bin ich sehr dankbar.
Gruß Gerd

IceBube 30. Mär 2010 18:00

Re: automatische Suche in ListBox abschalten
 
Hallo!

Diese...
Delphi-Quellcode:
procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: Char);
begin
  Key := #0;
end;
:)

lg

rapante 30. Mär 2010 18:10

Re: automatische Suche in ListBox abschalten
 
...und damit das navigieren mit den PfeilTasten weiterhin funktioniert...

Delphi-Quellcode:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if not Key in [VK_UP, VK_DOWN] then
    Key := 0;
end;

BUG 30. Mär 2010 18:15

Re: automatische Suche in ListBox abschalten
 
Zitat:

Zitat von rapante
...und damit das navigieren mit den PfeilTasten weiterhin funktioniert...

Code:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if not Key in [VK_UP, VK_DOWN] then
    Key := 0;
end;

Hast du es ausprobiert? Es funktioniert auch so mit den Pfeiltasten.

Zudem haust du virtuelle Tastencodes und Buchstaben durcheinander.

EDIT:

Entschuldigung, war auf KeyPress festgefahren :oops:

delphin 30. Mär 2010 19:26

Re: automatische Suche in ListBox abschalten
 
Hallo,

also ich dachte ja, da gibts irgend so einen verborgenen Schalter der Art

ListBox1.wasweißichnicht:=disable

aber wie es scheint, kann man es tatsächlich beim KeyPressed-Event verbiegen.

Delphi-Quellcode:
procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: Char);
begin
  Key := #0;
end;
Funktioniert bei mir und das navigieren mit den Pfeiltasten geht auch noch!!!

Das verändern des Wertes im KeyDown-Event bringt dagegen garnichts, will sagen:

Delphi-Quellcode:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if not Key in [VK_UP, VK_DOWN] then
    Key := 0;
end;
der Rollbalken springt bei mir immer noch auf den entsprechenden Eintrag in der Listbox ???

und über einen Schalter gehts wirklich nicht ?

Viele Grüße
Gerd

BUG 30. Mär 2010 20:22

Re: automatische Suche in ListBox abschalten
 
Zitat:

Zitat von delphin
Das verändern des Wertes im KeyDown-Event bringt dagegen garnichts, will sagen:

Im KeyDown-Code war die Klammerung falsch, so geht es:
Delphi-Quellcode:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if not (Key in [VK_UP, VK_DOWN]) then
    Key := 0;
end;

m.wollert 30. Mär 2010 20:55

Re: automatische Suche in ListBox abschalten
 
Hi,

ehrlich gesagt würde ich aber noch PageUp, PageDown, Home und End in die Ausnahme einfügen.

Grüße :-)
Michael

delphin 30. Mär 2010 21:52

Re: automatische Suche in ListBox abschalten
 
Vielen Dank für Eure Mithilfe,

da es ja offensichtlich keinen Schalter gibt, der den Suchsprung verhindert, werde ich Eure Lösungen mit dem Key:=0 als Lösung nehmen.

Viele Grüße
Gerd

SirThornberry 30. Mär 2010 22:01

Re: automatische Suche in ListBox abschalten
 
Ich meine mich Erinnern zu können das es eine Eigenschaft(Property) bei der Listbox gab um dies zu deaktivieren. Sollte sogar im Objektinspektor zu sehen sein.

Sir Rufo 31. Mär 2010 00:19

Re: automatische Suche in ListBox abschalten
 
Delphi-Referenz durchsuchenTListBox.AutoComplete
Geht auf jeden Fall in D2010

SirThornberry 31. Mär 2010 07:25

Re: automatische Suche in ListBox abschalten
 
Genau dieses Property meinte ich :-D Und wenn ich mich richtig erinnere gab es das auch schon bei Delphi7. Bei BDS2006 gab es dies auf jeden Fall.

jaenicke 31. Mär 2010 07:32

Re: automatische Suche in ListBox abschalten
 
Das gab es auch schon ab Delphi 6, vorher nicht.

Bei den älteren Delphiversionen (getestet 6, 7, 2006) bewirkt es aber nichts. Zumindest nicht unter Windows XP (virtueller PC :mrgreen:), dabei sieht man im Quelltext, dass ohne AutoComplete der Quelltext für die Selektion per Filter nicht ausgeführt wird. Ich vermute, dass Windows das dennoch automatisch macht, hatte jetzt aber gerade auch keine Lust das genauer anzuschauen.

rapante 31. Mär 2010 08:21

Re: automatische Suche in ListBox abschalten
 
@BUG ...kein Problem, hab' ja auch ein bisschen was durcheinander gebracht. :oops:

Mir war nicht bewusst, dass im OnkeyPress-Ereignis nur Tastatureingaben ankommen
die Zeichen erzeugen. naja wieder was gelernt.

Hast du das Beispiel eigentlich mal getestet?

Delphi-Quellcode:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if not (Key in [VK_UP, VK_DOWN]) then
    Key := 0;
end;
Es kann eigentlich gar nicht funktionieren, da zwar der Key auf 0 gesetzt und die Weiterverarbeitung der WM_KEYDOWN-Botschaft verhindert wird,
aber nicht die der WM_Char-Botschaft. Dass heißt es gibt trotzdem ein OnkeyPress-Ereignis und die Eingabe
einer Zeichenerzeugenden Taste wird nicht abgefangen.

Wie auch immer - die AutoComplete-Variante ist hier wohl der bessere Weg...

delphin 1. Apr 2010 01:37

Re: automatische Suche in ListBox abschalten
 
Also nun doch noch ein Abschlussbericht zu Eurern Lösungen.

ListBox1.AutoComplete:=false und Delphi 7:

1. Der Schalter ist nicht im Objektinspektor zugänglich, aber es gibt ihn
2. Die Wirkung auf das von mir beschrieben Verhalten = 0

Somit kommt zu mindest im Delphi 7 nur die Variante von IceBube:

Delphi-Quellcode:
procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: Char);
begin
  Key := #0;
end;
zum sinnvollen Einsatz.
Das Ausklammern der Kursorsteuertasten VK_Down, VK_UP, VK_Left etc. kann man sich übrigens schenken, da sie kein KeyPress-Ereignis auslösen, zumindest nicht unter Win2000.

Das Abfangen des Ereignisses ListBox1KeyPress gemäss Lösungsvorschlag von BUG greift viel zuspät ins Geschehen ein. Das könnt Ihr ja einfach mal hiermit testen:

Delphi-Quellcode:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin ShowMessage('leider schon zu spät');
      if not (Key in [VK_UP, VK_DOWN]) then Key:=0;
end;
Der Rollbalken springt beim Drücken einer Taste, dessen Char einem Anfangsbuchstaben des Strings in der Liste entspricht sofort an die entsprechende Stelle und erst danach geht die Messagebox auf.

jaenicke 1. Apr 2010 08:10

Re: automatische Suche in ListBox abschalten
 
Zitat:

Zitat von delphin
ListBox1.AutoComplete:=false und Delphi 7:

1. Der Schalter ist nicht im Objektinspektor zugänglich, aber es gibt ihn

Bei mir gibt es den (Delphi 7 PE im virtuellen PC getestet). :gruebel:

Zitat:

Zitat von delphin
2. Die Wirkung auf das von mir beschrieben Verhalten = 0

Richtig, habe ich ja schon geschrieben, ich vermute mal das liegt an einer Automatik von Windows, denn der Quelltext zum Filtern wird korrekt übersprungen (hab ich im Debugger kurz getestet).

rapante 1. Apr 2010 10:41

Re: automatische Suche in ListBox abschalten
 
Zitat:

Das Abfangen des Ereignisses ListBox1KeyPress gemäss Lösungsvorschlag von BUG greift viel zuspät ins Geschehen ein. Das könnt Ihr ja einfach mal hiermit testen:

Delphi-Quellcode:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin ShowMessage('leider schon zu spät');
      if not (Key in [VK_UP, VK_DOWN]) then Key:=0;
end;

Das ist so nicht richtig! Setz doch mal in beiden Prozeduren bei showmessage einen Breakpoint und schau was passiert!

Delphi-Quellcode:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  showmessage('down');
end;

procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: Char);
begin
  showmessage('press')
end;
Erklärung zu Keyboard-Events und Verarbeitung


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz