Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 240954 (2390)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Tastenabfrage mit Listbox
Thomas Erny
| 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
David
| Datum:30.07.02 11:18 (David@Brennan.de) |
Probiere es mal mit WindowStyle +512 Gruß David...
Thomas Erny
| Datum:30.07.02 23:27 (thomas.erny@bluewin.ch) |
Hallo David Danke für den Tipp. Funktioniert leider nicht... Gruss Thomas
David
| 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...
Moritz Kersten
| 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
Jörg Sellmeyer
| 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
Moritz Kersten
| 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
Schiewago
| 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?
Frank Abbing
| Datum:02.08.02 22:09 |
Setz' doch den Focus wieder auf das Hauptfenster zurück, sobald es auf der Listbox liegt... Gruß, Frank
Thomas Erny
| 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
Schiewago
| 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....
Thomas Erny
| 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
Thomas Erny
| 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
Schiewago
| 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.
Thomas Erny
| 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
Schiewago
| 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

| Zurück zur Übersicht