![]() |
Delphi-Version: 5
Auswahl eines ComboBox-Elements per ENTER/durch das System
Abend,
ich habe eine ComboBox wie folgt eingestellt (relevante Eigenschaften): AutoComplete: False AutoDropDown: True AutoSelect: True Style: csDropDown D.h.: Wenn ich die Box anklicke, wird der vorgeschriebene Text markiert, ich kann daraufhin etwas eingeben, worauf sich die Liste öffnet, und wenn das Eingegebene mit einem Listen-Element übereinstimmt, bewegt sich die Scrollbar zu den Übereinstimmungen. Wenn ENTER gedrückt wird, wird das nun oben in der Liste der ComboBox stehende (und somit am meisten mit zuvor eingegebenem Text übereinstimmende) Element ausgewählt. Das Problem ist jetzt bloß, das durch diesen Auswahlweg nicht die entsprechende Prozedur ausgeführt wird, da ich OnChange benutze (und durch diese Auswahl - nach meinem Verständnis - der Code das Ausgewählte Element festlegt, was aber bei OnChange nicht legitim ist). Welches Ereignis könnte ich dafür benutzen (habe noch kein entsprechendes entdeckt) bzw wie könnte ich das beheben? EDIT.: ich seh grad da oben steht Delphi Version 5 - stimmt nicht, habe es bloß übersehen, sollte das was bringen |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Möglichweise bringt dir
Delphi-Quellcode:
oder
OnCloseUp
Delphi-Quellcode:
etwas?!
OnSelect
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Nope, leider nicht.
Ich hab mir ein Label gemacht, um den ItemIndex zu überprüfen, aber es bleibt leer. |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Zitat:
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Hab schon gemerkt und behoben. Wert bleibt trdm auf -1
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Wie wärs mit OnClick?
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Nein, leider nicht. Hatte es schon ausprobiert, aber es ergibt an sich auch wenig Sinn, wenn es in diesem Zusammenhang (wo ich doch per ENTER auswählen können will) genutzt würde.
Ich hatte eine Idee für ein Work-Around mit meinen Mitteln:
Code:
Wäre zwar haufenweise Schreibarbeit, aber ich sehe mit meinem Können momentan keine andere Lösung.
if Key=13 //müsste Enter sein
then do if ComboBox1.Text:='x' then ComboBox1.Itemindex:=0 else if ComboBox1.Text:='y' then ComboBox1.Itemindex:=1 else ... etc etc Die Sache dabei ist auch, dass ich es schon so versucht hatte, darauf aber die Antwort kam, dass Boolean expected wäre (bei jeder einzelnen Zeile)... Kann mir das wer erklären bzw meinen Fehler beheben (möglichst simpel)? |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Zitat:
Delphi-Quellcode:
bzw.
if Key = Char(VK_RETURN) then begin
i := ComboBox1.Items.IndexOf(ComboBox1.Text); if i >= 0 then ComboBox1.ItemIndex := i; end;
Delphi-Quellcode:
Schreibarbeit? Die CB kennt doch ihre Einträge, also fragt man sie einfach. :angle:
if Key = Char(VK_RETURN) then
ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(ComboBox1.Text); |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
*war mal wieder zu spät*
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Hi, danke für diese - wie immer (seit 13 Jahren) - schnelle Antwort.
Hätte ich gewusst, dass man das so abfragen kann, hätte ich es vllt auch so aufgeschrieben ;) Eine Sache gibt es noch: ich kenn mich mit KeyDown nicht aus und in den Nachrichten erhalte ich den Hinweis: Zitat:
Code:
Was ist da das Problem?
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: word;
Shift: TShiftState); begin if Key = Char(VK_RETURN) then begin i := ComboBox1.Items.IndexOf(ComboBox1.Text); if i >= 0 then ComboBox1.ItemIndex := i; end; end; |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Lass einfach die Umwandlung in Char weg
Delphi-Quellcode:
if Key = VK_RETURN then
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Danke, wieder so eine Sache von der ich gar nicht wusste, dass man sie machen darf.
Werd ich also so umsetzten. Just in case: Warum gibt es denn beim Doppelklicken auf das Ereignis im Objektinspektor eine Prozedur und offensichtlich - da ich den Code ja von himitsu hab - noch eine ähnliche mit einer anderen Variablen? Ist für das Programm nicht mehr wichtig btw |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Hi, himitsu's Code hat leider nicht funktioniert.
Kann man dem ENTER-Klicken auch zuweisen, dass es wie ein Mausklick wirkt und somit wie eine Auswahl des Items durch den User? Das wäre das einzige, was mir noch einfallen würde... |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Der Paramter key ist schon ein Integer
Delphi-Quellcode:
if Key = VK_RETURN then begin
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Wieso Integer, es doch um Word und Char?
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Zitat:
Zu den fundamentalen Integer-Typen gehören Shortint, Smallint, Longint, Int64, Byte, Word, Longword und UInt64. Du solltest Dich dringend mit den Variabel-Typen auseinandersetzen. |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Zitat:
Integer-Typen sind z.b: Word, Byte, LongInt, aber auch abgeleitete Typen wie z.B. TColor. Alle Integer-Typen können weder Zeichen noch Kommazahlen (Float-Werte) aufnehmen. Manche Integer-Typen können nur positive Zahlen (0 bis ...) aufnehmen, andere dagegen auch negative (-32768 bis 32768). Wenn im Parameter ein Word als Typ angegeben ist, kannst du diesen Wert nicht mit einem Char vergleichen (das wäre nicht mal Äpfel mit Birnen, das wäre Äpfel mit Broten). Schau dir doch ![]() Zum Üben mit KeyDown und KeyPress empfehle ich den ![]() |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Ich will nicht großmäulig sein, aber letzteres wusste ich sogar schon (das von Perlsau, werde natürlich trdm fehlendes Wissen aufbessern). Mein Problem war das, dass ich:
1. nicht wusste, das Word eine integer Var ist. Mir wurde in der Schule beigebracht, dass es integer, longint, real, char und string gibt - hab aber schon etwas länger angezweifelt, dass das irgendwo komplett ist. Word erschien mir (weil 'Wort') eher wie etwas von char oder string, weswegen ich die Aussage von mkinzler nicht verstanden hab. 2. nicht wusste - wie ich schrieb -, dass man KeyDown mit verschiedenen Variablen 'erstellen' kann. :wink: Um zum eigentlichen Tread-Thema zurück zu kommen: Zitat:
Wie gesagt, himitsus Code ist zwar logisch und sollte auch funktionieren, tut er aber aus irgendeinem Grund nicht. EDIT: klar würde ENTER wie ein Mausklick wirken, bzw wie eine User-Aktion, aber das tut es eben nicht ich hatte es mit OnChange (eigentlich auszuführende Prozedur) und himitsus Idee versucht. |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Zitat:
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Zitat:
(In der Schule lernt auch niemand mehr etwas vernünftiges) Zitat:
Zitat:
Gruß K-H |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Zitat:
Zitat:
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Im Anhang Zitat:
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Nun, ich hab mir den Source angeschaut, und nach ein paar Anpassungen mit D7 ausprobiert.
Ich konnte kein Fehlverhalten erkennen. Es ist übrigens nie verkehrt, wenn man Oberfläche und Daten, in Deinem Fall die Daten für die Auswahl, voneinander trennt. Und die Verwendung von halbwegs sprechenden Namen für Variablen ist eigentlich auch kein Fehler. Gruß K-H |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Auch ich habe mir den Source angeschaut, allerdings mit Lazarus.
Dabei habe ich festgestellt, dass die Property .ItemIndex im OnChange-Ereignis hinterherhinkt, wenn man zum Beispiel den Letzten Buchstaben eines Eintrages im Eingabefeld löscht. Auch bei anderen Events ist ein "Fehlverhalten" zu entdecken. Folgende Lösung funktioniert im OnChange (und in den anderen Events): Im OI die Property AutoComplete der ComboBox auf "false" setzen. Im OnChange-Ereignis nicht die Property ItemIndex verwenden, sondern den ItemIndex, welcher zum Text passt, selbst ermitteln.
Delphi-Quellcode:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin case ComboBox1.Items.IndexOf(ComboBox1.Text) of 14: begin ComboBox3.Items.Clear; ComboBox3.Items.Add('Nanometer'); ComboBox3.Items.Add('Mikrometer'); ComboBox3.Items.Add('Millimeter'); ComboBox3.Items.Add('Zentimeter'); ComboBox3.Items.Add('Dezimeter'); ComboBox3.Items.Add('Meter'); ComboBox3.Items.Add('Dekameter'); ComboBox3.Items.Add('Hektometer'); ComboBox3.Items.Add('Kilometer'); end; else begin ComboBox3.Items.Clear; end; end; end; |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Zitat:
Zitat:
Zitat:
|
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal schnell zum Testen der Events und der Property .ItemIndex einer ComboBox ein Quick'n'Dirty-Programm generiert.
Zip-Datei enthält: Source für Lazarus Projekt-Dateien ausführbare Exe (erstellt mit Lazarus 1.4RC2) Im Memo sieht man den Namen der Combo, das Event, Property . ItemIndex und als letztes den ermittelten Index des Textes in der Itemsliste. Hier werden die Unterschiede deutlich. |
AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
Danke für das Programm. Ich seh, was Du meinst (@BadenPower).
Hab's nochmal versucht und irgendwie klappt's jetzt per KeyDown: Nach dem ersten Enter wird der Text der ComboBox vervollständigt, nach einem zweiten die eigentliche Prozedur ausgelöst. Kann ich irgendwo einstellen, dass durch das erste Enter-Klicken erst der Text vervollständigt wird und danach - durch Berufung auf diesen Text - die Prozedur ausgeführt wird? Bzw wo finde ich die Prozedur dafür, dass durch Enter der Text vervollständigt wird? Könnte ich dort nicht einfach meine Prozedur hinzupacken? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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