Autor | Thema: Tastenabfrage mit Listbox | | Datum:29.07.02 10:15 
(thomas.erny@bluewin.ch) | |
Hallo Profaner
Ich habe ein Hauptfenster und eine sortierte Listbox. Ausserdem sollen ein paar Funktionstasten (F3, F4...) abgefragt werden. Kein Problem, wenn das Hauptfenster den Focus hat. Ist der Focus aber auf der Listbox, wird WaitInput durch Tasteneingaben nicht mehr ausgelöst. Ausnahme F1 mit %Key=5.
Was ist zu tun, damit die anderen Funktionstasten immer ansprechen?
Vielen Dank schon jetzt für Eure Antworten.
Gruss Thomas
|
| | Datum:30.07.02 11:18 
(David@Brennan.de) | |
Probiere es mal mit WindowStyle +512
Gruß David...
|
| | Datum:30.07.02 23:27 
(thomas.erny@bluewin.ch) | |
Hallo David
Danke für den Tipp. Funktioniert leider nicht...
Gruss Thomas
|
| | Datum:31.07.02 11:55 
(David@Brennan.de) | |
Hallo Thomas,
entschuldige war wohl etwas falsch, hier nun die Antwort mit Listing.... (Beachte bei der Ausführung &WParam)
WindowStyle 16
Window 0,0-%MaxX,%MaxY
WindowStyle 3
Declare LBXHandle%,Exit%
Exit%=1
LBXHandle%=@Create("ListBox",%HWnd,"",30,30,200,200)
SetFocus (LBXHandle%)
'MainProggy Beenden mit ESC
While Exit%
GetMessage
Locate 0,0
print "--------------------"
Locate 0,0
Print %Message,&WParam
If &WParam=27
Exit%=0
EndIf
Wend
Gruss David...
|
| | Datum:31.07.02 19:18 
(IsNoMK@gmx.de) | |
Hallo David,
ist leider auch nicht das wahre, weil jetzt die Schleife dauerhaft durchlaufen wird (wie ohne waitinput). Normalerweise sollte der Befehl doch warten bis irgendwas passiert, tut es aber nicht !
Hier die Schleife (von einem Dialog, nicht %hwnd !)
whilenot @getfocus(endebutton%)
getmessage
prozedur 'überprüft auf Änderungen und wertet sie aus
if %wmpaint
paint_dialog
elseif @getfocus(button1%)
...
elseif @getfocus(listbox1%)
...
endif
wend
Wird dauerhaft durchlaufen !
Moritz
|
| | Datum:31.07.02 23:43 
(joerse@gmx.de) | |
Probier mal das:
Cls
Settimer 1
Whilenot Ende%
Waitinput
If %wmtimer
'hier kann z.B. ein Editcontrol überwacht werden
ElseIf
...
EndIf
Wend
KillTimer 'nicht vergessen darum sinnvollerweise Usermessage 16
'definieren und auf %umessage = 16 auswerten
Gruß
Jörg
|
| | Datum:01.08.02 03:43 
(IsNoMK@gmx.de) | |
Hallo Jörg,
ich find die settimer lösung ist generell, auf gut deutsch, fürn ar*** ! Nichts gegen dein Vorschlag !!!
Das Problem ist das ich mit settext ... einen Text ändere wenn der benutzer etwas im edit geändert hat. Die settimer lösung führt da leider zum flackern, ausserdem reagieren die Buttons sofort wenn man sie anklickt ! Und settimer auf 100 oder höher zu setzen ist auch nicht das gelbe vom Ei.
Gibts den da keine "professionelle" oder "echte" Lösung ??? Hänge da im Moment wirklich fest und ärgere mich das die Dialoge anders als das hauptfenster reagieren, auf %hwnd würde das einwandfrei klappen weil da das waitinput verlassen wird wen man im edit was ändert ! Mit windowstyle und @create("window",... anstatt @create("dialog",... hab ich es auch schon probiert, geht auch net !
der (wie immer) nachtschichtende,
Moritz
|
| | Datum:02.08.02 21:58 
| |
Also versteh ich dich richtig?
Du willst das man in der Listbox einen eintrag anklicken kann wodurch dann irgendwas passiert
und gleichzeitig sollen tastencodes abgefragt werden durch die dann auch irgendwas passiert?
|
| | Datum:02.08.02 22:09 
| |
Setz' doch den Focus wieder auf das Hauptfenster zurück, sobald es auf der Listbox liegt...
Gruß, Frank
|
| | Datum:02.08.02 23:11 
(thomas.erny@bluewin.ch) | |
Hallo Frank
Dies war auch meine erste Idee. Hat allerdings ein paar andere Nachteile. Man kann z. Bsp. mit den Up/Down Tasten nicht mehr scrollen in der Listbox. In meinem Programm ist es eben so, dass man ziemlich oft Daten eingeben, löschen oder sonstwie manipulieren muss. Das geht über die Tastatur viel schneller als mit Maus und Buttons anklicken.
Wie die anderen Antworten auch zeigen, efährt man das Ereignis einer Taste nur mit GetMessage, wenn der Focus auf der Listbox liegt, weil man gerade einen Eintrag angeklickt hat. Mit GetMessage erkauft man sich aber auch viele Nachteile, da manchmal ziemlich viele Messages ankommen... flackernde Controls sind nur eines von vielen Problemen, die auf einen zukommen.
Vielleicht hat ja jemand noch eine andere Idee...
Gruss Thomas und vielen Dank für Eure Antworten
|
| | Datum:03.08.02 19:19 
| |
cls
declare a%,ende%,t%
let a%=CreateListBox(%hwnd,"",100,10,50,50)
AddString(a%,"hhh")
AddString(a%,"hhh")
AddString(a%,"hhh")
AddString(a%,"hhh")
AddString(a%,"hhh")
AddString(a%,"hhh")
SetTimer 1
whilenot ende%
waitinput
if %wmtimer
if GetFocus(a%)
SetFocus (%hwnd)
endif
endif
let t%=%scankey
case equ(t%,112):print "F1"
case equ(t%,113):print "F2"
case equ(t%,114):print "F3"
case equ(t%,115):print "F4"
case equ(t%,116):print "F5"
case equ(t%,117):let ende%=1
endif
wend
KillTimer
Versuchs mal so!!!
auf diese weise werden die funktionen der listbox (Scrollen)
nicht beeinflusst und die tastenabfrage läuft ohne schwierigkeiten....
|
| | Datum:05.08.02 07:38 
(thomas.erny@bluewin.ch) | |
Hallo Schiewago (komischer Name)
Vielen Dank für Deinen Vorschlag. Funktioniert in Deinem Beispiel sehr gut. Ich wollte solche Sachen zwar eigentlich vermeiden. Man ist schon ziemlich dicht an einem Programm ohne jeden Wartebefehl. Nicht optimal unter Windows. Da es aber besser funktioniert als alles andere, was ich bis jetzt probiert habe, werde ich es sicher einbauen und testen. Möglicherweise gibt's dann doch noch Schwierigkeiten, da meine Eventloop wegen der vielen Controls ziemlich lange ist. Mal sehen...
Gruss Thomas
|
| | Datum:07.08.02 23:51 
(thomas.erny@bluewin.ch) | |
Hallo Leute
Möchte kurz meine Erfahrungen mit Euren Vorschlägen schildern:
Bin mit GetMessage nicht weitergekommen. Für jedes gelöste Problem 3 neue bekommen. Arbeit ohne Ende...
SetTimer 1 funktioniert trotz meiner Abneigung gegen solche Sachen gut. Die Systemlauslastung liegt bei Win 9x bei ca. 30%!, unter NT/2K allerdings nicht auffällig.
Ich hoffe in der Zwischenzeit auf weitere Verbesserungen im Messagehandling von Profan, damit solche Sachen eleganter gelöst werden können.
Gruss und Danke
Thomas
|
| | Datum:10.08.02 20:30 
| |
Solltest du durch irgendwas schwierigkeiten bekommen sag bescheid und ich versuche dir zu helfen.
Meine idee wird sicherlich nicht perfekt, hab ja nur 5 min drüber nachgedacht aber in meinem beispielprog. lief es recht gut. wie es läuft wenn dort viele abfragen sind kann ich dir net sagen.
also sag bescheid ob es geht oder wo es hängt.
würde mich interressieren.
|
| | Datum:11.08.02 20:39 
(thomas.erny@bluewin.ch) | |
Hallo Schiewago
Nein wirklich, es funktioniert erstaunlich gut, trotz der vielen Abfragen in der Eventloop. Hin und wieder verpasst das Programm einen Tastendruck. Das kommt aber eher daher, dass der Timer noch für andere Sachen benutzt wird, die auch mal länger als 1ms dauern können.
Nachteil ist, dass man eine Systemauslastung von ca. 30% hat, auch wenn überhaupt nichts läuft.
Gruss Thomas
|
| | Datum: 12.08.02 16:59 
| |
Super!! das freut mich!
an der sys.auslastung kann man ja mal wieder sehen wie scheiße (tschuldigung is aber so) windows halt is
ok viel spass noch
mfg
Malte Lang
|
|
|