Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Button gedrückt, aber welcher?(Problem mit ByVal)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 24.04.2010, 14:21    Titel: Button gedrückt, aber welcher?(Problem mit ByVal) Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 24.04.2010, 17:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 24.04.2010, 17:11    Titel: Antworten mit Zitat

Ich versuche es mal mit Types. Es war nur weil ich früher mit BlitzBasic gecodet habe, und da waren Types sehr kompliziert ... zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 24.04.2010, 17:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 24.04.2010, 17:56    Titel: Antworten mit Zitat

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)


grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 24.04.2010, 19:08    Titel: Antworten mit Zitat

Versuch doch auch mal ob ein Bild-Button( mit Put...) schneller ist als das Linien ziehen.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 24.04.2010, 19:19    Titel: Antworten mit Zitat

Ist ein bisschen schneller, nicht unbedingt viel, aber ein bisschen, danke für den Tipp
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 24.04.2010, 19:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz