 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 24.04.2010, 14:21 Titel: Button gedrückt, aber welcher?(Problem mit ByVal) |
|
|
Hi
Ich habe mir eine Funktion geschrieben, um zu prüfen ob ein Button gedrückt wird. Allerdings funktioniert das ganze nicht so, wie es soll.
Wenn Button 1 gedrückt wurde, passiert nichts. Wenn Button2 gedrückt wird erscheint allerdings die Nachricht, dass Button 1 gedrückt wurde...
Das ist der (fehlerhafte) Code:
GUI.bas
Code: | dim shared as integer mousex,mousey,buttons
declare sub button(anfangx as integer,anfangy as integer,text as string,byval num as integer)
declare function buttonpressed(byval num as integer)as integer
dim shared as integer num2
sub button(anfangx as integer,anfangy as integer,text as string,byval num as integer)
dim as integer textz
textz=(Len(text)*8)+4
line (anfangx,anfangy)-(anfangx+textz,anfangy+18),7,BF
line (anfangx,anfangy)-(anfangx+textz,anfangy),15
'line (anfangx,anfangy+1)-(anfangx-1+textz,anfangy+1),15
line (anfangx,anfangy)-(anfangx,anfangy+16),15
'line (anfangx+1,anfangy)-(anfangx+1,anfangy+15),15
line (anfangx+1,anfangy+17)-(anfangx+textz,anfangy+17),8
line (anfangx+textz-1,anfangy+18)-(anfangx+textz-1,anfangy+1),8
line (anfangx,anfangy+18)-(anfangx+textz,anfangy+18),254
line (anfangx+textz,anfangy+18)-(anfangx+textz,anfangy),254
color 254
draw string(anfangx+3,anfangy+2),text
color 254
if (mousex>anfangx and mousex<anfangx+textz and mousey>anfangy and mousey<anfangy+18 and buttons=1) then
num2=1
line (anfangx,anfangy)-(anfangx+textz,anfangy+18),7,BF
line (anfangx,anfangy)-(anfangx+textz,anfangy),254
line (anfangx,anfangy)-(anfangx,anfangy+16),254
line (anfangx+1,anfangy+1)-(anfangx+textz,anfangy+1),8
line (anfangx+1,anfangy+1)-(anfangx+1,anfangy+17),8
line (anfangx,anfangy+18)-(anfangx+textz,anfangy+18),15
line (anfangx+textz,anfangy+18)-(anfangx+textz,anfangy),15
color 254
draw string(anfangx+4,anfangy+3),text
color 254
else
num2=0
end if
end sub
function buttonpressed(byval num as integer)as integer
if num=1 and num2=1 then
return 1
elseif num=2 and num2=1 then
return 2
else
return 0
end if
end function |
DEMO.bas
Code: | #include "GUI.bas"
dim shared as string taste
screen 12
do
taste=inkey
getmouse mousex,mousey,,buttons
screenlock
cls
line (0,0)-(640,480),3,BF
button (50,50,"Button 1",1)
button (50,70,"Button 2",2)
if buttonpressed(1)=1 then
draw string(100,100), "Gedrueckt: 1"
elseif buttonpressed(2)=2 then
draw string(100,100), "Gedrueckt: 2"
'else
' draw string(100,100),"Kein Button wurde gedrueckt"
end if
screenunlock
sleep 1
loop until taste=chr(27) |
Kann mir jemand helfen, oder komme ich um Types nicht herum? |
|
Nach oben |
|
 |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 24.04.2010, 17:06 Titel: |
|
|
Code: | Kann mir jemand helfen, oder komme ich um Types nicht herum? |
Was heist "um Types herum kommen". Types sind eine super Sache und bei Oberflächen auch sehr sinnvoll. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 24.04.2010, 17:11 Titel: |
|
|
Ich versuche es mal mit Types. Es war nur weil ich früher mit BlitzBasic gecodet habe, und da waren Types sehr kompliziert ...  |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 24.04.2010, 17:51 Titel: |
|
|
Hallo,
eine sehr praktische Musterlösung zu einem solchen Eventsystem speziell für GUIs findest du hier: http://www.freebasic-portal.de/tutorials/eventsystem-71.html Das ist deutlich flexibler als dein Ansatz.
Für alle, die sich in den hier geposteten Code einarbeiten möchten: Die Sub button zeichnet in jeder Schleifenausführung den jeweiligen Button neu und prüft anschließend, ob er gedrückt wurde (mittels globaler Variablen für die Mauskoordinaten). Wurde der Button gedrückt, wird die globale Variable num2 auf 1 gesetzt. Der Parameter num der SUB button hat keine Funktion.
Führt man das Programm jetzt aus, wird beim Klick auf Button 2 der Text "Gedrueckt: 1" ausgegeben. Beim Klick auf Button 1 passiert nichts.
Das liegt daran, dass in der Schleife zunächst der erste Button überprüft wird. Wird dieser gedrückt, wird num2 auf 1 gesetzt. So weit, so gut. Anschließend wird in der Schleife der 2. Button überprüft. Da der erste Button geklickt wird und nicht der zweite, wird num2 jetzt auf 0 gesetzt. Das Programm "vergisst", dass der erste Button noch gedrückt wurde. Daher kann ein Klick auf Button 1 nicht abgefangen werden.
Es wird weiterhin immer "Gedrueckt: 1" ausgegeben, obwohl der 2. Button gedrückt wurde, da die FUNCTION zur Überprüfung (buttonpressed) immer den übergebenen Zahlwert zurückliefert, wenn irgendein Button gedrückt wurde (Bedingung: num2=1). Da die Überprüfung von buttonpressed(2) im ELSE-Zweig der ersten, immer wahren (wenn ein Button gedrückt wurde) Abfrage ist, wird sie nicht ausgeführt.
Alles in allem halte ich das Konzept des Programms für stark überarbeitungsbedürftig, was in einem IRC-Chatgespräch mit dem Themenstarter bereits erläutert wurde.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 24.04.2010, 17:56 Titel: |
|
|
Habe es jetzt andesr gemacht, und zwar so(funktioniert auch):
GUI.bas:
Code: | dim shared as integer mousex,mousey,buttons
declare sub button(anfangx as integer,anfangy as integer,text as string,byval num as integer)
declare function buttonpressed(byval num as integer)as integer
dim shared as integer num2
sub button(anfangx as integer,anfangy as integer,text as string,byval num as integer)
dim as integer textz
textz=(Len(text)*8)+4
line (anfangx,anfangy)-(anfangx+textz,anfangy+18),7,BF
line (anfangx,anfangy)-(anfangx+textz,anfangy),15
'line (anfangx,anfangy+1)-(anfangx-1+textz,anfangy+1),15
line (anfangx,anfangy)-(anfangx,anfangy+16),15
'line (anfangx+1,anfangy)-(anfangx+1,anfangy+15),15
line (anfangx+1,anfangy+17)-(anfangx+textz,anfangy+17),8
line (anfangx+textz-1,anfangy+18)-(anfangx+textz-1,anfangy+1),8
line (anfangx,anfangy+18)-(anfangx+textz,anfangy+18),254
line (anfangx+textz,anfangy+18)-(anfangx+textz,anfangy),254
color 254
draw string(anfangx+3,anfangy+2),text
color 254
if (mousex>anfangx and mousex<anfangx+textz and mousey>anfangy and mousey<anfangy+18 and buttons=1) then
line (anfangx,anfangy)-(anfangx+textz,anfangy+18),7,BF
line (anfangx,anfangy)-(anfangx+textz,anfangy),254
line (anfangx,anfangy)-(anfangx,anfangy+16),254
line (anfangx+1,anfangy+1)-(anfangx+textz,anfangy+1),8
line (anfangx+1,anfangy+1)-(anfangx+1,anfangy+17),8
line (anfangx,anfangy+18)-(anfangx+textz,anfangy+18),15
line (anfangx+textz,anfangy+18)-(anfangx+textz,anfangy),15
color 254
draw string(anfangx+4,anfangy+3),text
color 254
if num=1 then
num2=1
elseif num=2 then
num2=2
elseif num=3 then
num2=3
end if
end if
end sub
function buttonpressed(byval num as integer)as integer
if num=1 and num2=1 then
return num
elseif num=2 and num2=2 then
return num
elseif num=3 and num2=3 then
return num
else
return 0
end if
end function |
DEMO.bas:
Code: | #include "GUI.bas"
dim shared as string taste
screen 12
do
taste=inkey
getmouse mousex,mousey,,buttons
screenlock
cls
line (0,0)-(640,480),3,BF
button (50,50,"Button 1",1)
button (50,70,"Button 2",2)
if buttonpressed(1)=1 then
draw string(100,100), "Gedrueckt: 1"
elseif buttonpressed(2)=2 then
draw string(100,100), "Gedrueckt: 2"
'else
' draw string(100,100),"Kein Button wurde gedrueckt"
end if
screenunlock
sleep 1
loop until taste=chr(27) |
 |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 24.04.2010, 19:08 Titel: |
|
|
Versuch doch auch mal ob ein Bild-Button( mit Put...) schneller ist als das Linien ziehen.
Gruss |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 24.04.2010, 19:19 Titel: |
|
|
Ist ein bisschen schneller, nicht unbedingt viel, aber ein bisschen, danke für den Tipp  |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 24.04.2010, 19:26 Titel: |
|
|
funkeld hat Folgendes geschrieben: | Versuch doch auch mal ob ein Bild-Button( mit Put...) schneller ist als das Linien ziehen. |
Das Programm ist insgesamt "suboptimal". So wird beispielsweise permanent der gesamte Bildschirminhalt einschließlich der beiden Buttons neu gezeichnet, auch wenn sich eigentlich nichts verändert.
Ich habe das vorhin mal genauer untersucht: Durchschnittlich 254 mal pro Sekunde wurde der Bildschirminhalt komplett neu gezeichnet, obwohl ich nichts im Fenster gemacht habe, d.h. es hat sich in der Zeit nichts am Bild verändert. Getestet habe ich das auf einem älteren PC mit 2,4 GHz Celeron Prozessor. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|