Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Auswahl eines ComboBox-Elements per ENTER/durch das System (https://www.delphipraxis.net/185395-auswahl-eines-combobox-elements-per-enter-durch-das-system.html)

qiLy4n 6. Jun 2015 17:30

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

Aviator 6. Jun 2015 17:33

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Möglichweise bringt dir
Delphi-Quellcode:
OnCloseUp
oder
Delphi-Quellcode:
OnSelect
etwas?!

qiLy4n 6. Jun 2015 17:51

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.

Sir Rufo 6. Jun 2015 23:32

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Zitat:

Zitat von qiLy4n (Beitrag 1304341)
Nope, leider nicht.

Ich hab mir ein Label gemacht, um den ItemIndex zu überprüfen, aber es bleibt leer.

Dann hast du bei der Darstellung etwas falsch gemacht, denn leer dürfte das nicht bleiben, aber anscheinend ist der Code zu geheim ... da können wir nicht helfen.

qiLy4n 6. Jun 2015 23:36

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Hab schon gemerkt und behoben. Wert bleibt trdm auf -1

baumina 8. Jun 2015 06:24

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Wie wärs mit OnClick?

qiLy4n 8. Jun 2015 09:20

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:
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
Wäre zwar haufenweise Schreibarbeit, aber ich sehe mit meinem Können momentan keine andere Lösung.
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)?

himitsu 8. Jun 2015 09:42

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Zitat:

Delphi-Quellcode:
if ComboBox1.Text:='x' then

Zuweisung oder Vergleich? :wink:

Delphi-Quellcode:
if Key = Char(VK_RETURN) then begin
  i := ComboBox1.Items.IndexOf(ComboBox1.Text);
  if i >= 0 then
    ComboBox1.ItemIndex := i;
end;
bzw.
Delphi-Quellcode:
if Key = Char(VK_RETURN) then
  ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(ComboBox1.Text);
Schreibarbeit? Die CB kennt doch ihre Einträge, also fragt man sie einfach. :angle:

baumina 8. Jun 2015 09:48

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
*war mal wieder zu spät*

qiLy4n 8. Jun 2015 10:14

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:

unit1.pas(81,28) Error: Incompatible types: got "Char" expected "LongWord"
... bei diesem Code:

Code:
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;
Was ist da das Problem?

baumina 8. Jun 2015 10:21

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Lass einfach die Umwandlung in Char weg
Delphi-Quellcode:
if Key = VK_RETURN then

qiLy4n 8. Jun 2015 10:31

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

qiLy4n 8. Jun 2015 10:40

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...

mkinzler 8. Jun 2015 10:42

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

qiLy4n 8. Jun 2015 10:58

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Wieso Integer, es doch um Word und Char?

BadenPower 8. Jun 2015 11:27

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Zitat:

Zitat von qiLy4n (Beitrag 1304498)
Wieso Integer, es doch um Word und Char?

Delphi F1 Hilfe:

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.

Perlsau 8. Jun 2015 15:27

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Zitat:

Zitat von qiLy4n (Beitrag 1304491)
Delphi-Quellcode:
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;
Was ist da das Problem?

Das Problem ist die Inkompatibilität zwischen Integer und Char. Chars enthalten immer nur ein Zeichen: 'a' oder 'X' oder '&' usw. Der Wert, der in dieser Variablen gespeichert wird, bezieht sich auf die ASCII-Tabelle: Wenn du die linke Alt-Taste gedrückt hältst und auf deinem Nummernblock 65 eingibst, erhältst du ein 'A'. Das 'A' erhältst du auch durch Angabe von Chr(65). In KeyDown wird nun genau dieser Wert übergeben, und zwar als Word. Erst durch Chr(65)oder #65 wird daraus ein Char. VK_Return ist ebenfalls ein Integer, gespeichert in irgend einer der Delphi-System-Units als Konstante, Um den Wert von VK_Return ermitteln, kannst du ihn z.B. in einem Label anzeigen: Label1.Caption := IntToStr(VK_Return);

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 diese Seite für Einsteiger einmal etwas genauer an. Es gibt noch mehr solche Einsteiger-Tutorials im Netz, die findest du aber sicher auch alleine :)

Zum Üben mit KeyDown und KeyPress empfehle ich den Keyboard-Tutor vom Leuselator.

qiLy4n 8. Jun 2015 15:49

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:

Kann man dem ENTER-Klicken auch zuweisen, dass es wie ein Mausklick wirkt und somit wie eine Auswahl des Items durch den User?
Oder hat jmd eine andere Idee?
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.

BadenPower 8. Jun 2015 15:55

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Zitat:

Zitat von qiLy4n (Beitrag 1304543)
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.

Beim Drücken der Entertaste und bei einem Mausklick auf ein Element in der DropDown-Liste wird ein OnEditDone-Event ausgelöst.

p80286 8. Jun 2015 16:09

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Zitat:

Zitat von qiLy4n (Beitrag 1304543)
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.

Um es mal genau zu sagen, WORD ist ein Datentyp für positive ganzzahlige Werte. Ein Integer kann auch negative ganzzahlige Werte enthalten.
(In der Schule lernt auch niemand mehr etwas vernünftiges)

Zitat:

Zitat von qiLy4n (Beitrag 1304543)
Zitat:

Kann man dem ENTER-Klicken auch zuweisen, dass es wie ein Mausklick wirkt und somit wie eine Auswahl des Items durch den User?
Oder hat jmd eine andere Idee?

Was bitte ist "ENTER-Klicken" ?

Zitat:

Zitat von qiLy4n (Beitrag 1304543)
Wie gesagt, himitsus Code ist zwar logisch und sollte auch funktionieren, tut er aber aus irgendeinem Grund nicht.

Was tut er nicht? und wie sieht Dein aktueller Sourcecode aus?

Gruß
K-H

qiLy4n 8. Jun 2015 16:25

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Zitat:

Um es mal genau zu sagen, WORD ist ein Datentyp für positive ganzzahlige Werte. Ein Integer kann auch negative ganzzahlige Werte enthalten.
Das mit den negativen ganzzahligen Werten wusste ich - kannte nur Word nicht.

Zitat:

(In der Schule lernt auch niemand mehr etwas vernünftiges)
Stimme zu, in Sachen Informatik. Allerdings weiß ich nicht, ob man da wirklich "mehr" schreiben kann.

Zitat:

Was bitte ist "ENTER-Klicken" ?
Wenn man ENTER drückt

Zitat:

Was tut er nicht?
Funktionieren im Sinne der Fragestellung am Anfang des Threads

Zitat:

wie sieht Dein aktueller Sourcecode aus?
Soll ich den als ZIP hochladen?

BadenPower 9. Jun 2015 11:04

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Zitat:

Zitat von qiLy4n (Beitrag 1304558)
Zitat:

Was tut er nicht?
Funktionieren im Sinne der Fragestellung am Anfang des Threads

Hast Du OnEditDone ausprobiert?

Zitat:

Zitat von qiLy4n (Beitrag 1304558)
Zitat:

wie sieht Dein aktueller Sourcecode aus?
Soll ich den als ZIP hochladen?

Am Besten die .pas und die zugehörige .lfm - Datei zippen.

qiLy4n 9. Jun 2015 18:40

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Hast Du OnEditDone ausprobiert?
Jetzt ja und nein, es funktioniert leider nicht.

Im Anhang
Zitat:

die .pas und die zugehörige .lfm - Datei

p80286 10. Jun 2015 10:25

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

BadenPower 10. Jun 2015 11:33

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;

qiLy4n 10. Jun 2015 11:56

AW: Auswahl eines ComboBox-Elements per ENTER/durch das System
 
Zitat:

Es ist übrigens nie verkehrt, wenn man Oberfläche und Daten, in Deinem Fall die Daten für die Auswahl, voneinander trennt.
Ja, habe ich schon gehört, allerdings weiß ich (noch) nicht wie. Hatte in letzter Zeit leider keine Zeit für mehr als das Nötige für's Programm.

Zitat:

Im OI die Property AutoComplete der ComboBox auf "false" setzen.
Mhm. Habe das sogar, aber wohl ohne:

Zitat:

Im OnChange-Ereignis nicht die Property ItemIndex verwenden, sondern den ItemIndex, welcher zum Text passt, selbst ermitteln.
Werde es so machen, danke ^^

BadenPower 10. Jun 2015 12:15

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.

qiLy4n 11. Jun 2015 20:38

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 12:20 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