ImageGadget als Button

Anfängerfragen zum Programmieren mit PureBasic.
rowo
Beiträge: 13
Registriert: 28.12.2017 17:45
Computerausstattung: Macbook Pro, Mid 2010
Lenovo Workstation, i5 3,2 Ghz, 32 GB RAM, 480 GB SSD, Nvidia Quadro
Wohnort: Bayern, nähe Augsburg

ImageGadget als Button

Beitrag von rowo »

Hallo liebes Purebasic Forum. Mir wurde hier schon mal gut geholfen, vielleicht findet sich jemand, der eine Lösung für mein Problem hat. Evtl. ist es auch ein Bug in Purebasic?
Ich schreibe gerade ein kleines Programm und statt eines ButtonGadgets bzw. ButtonImage habe ich ein ImageGadget genommen und lade zum Programmstart ein Bild. Wenn man auf das ImageGadget klickt, ändert sich das Bild. Vorher schwarzer Smiley, danach roter Smiley. Ich habe das über BindEvent realisiert und es funktioniert... beim Programmstart.
BindEvent(#PB_Event_Gadget, @ButtonGesicht(), frmMAIN, imgGesichtRot, #PB_EventType_LeftClick)
Die Bilder habe ich in eine DataSection gepackt und compiliere sie in die exe mit rein per IncludeBinary. Es sind kleine Icons mit wenigen Bytes.

Wie gesagt, wenn das Programm startet, funktioniert das einwandfrei. Ein Klick und das Bild ändert sich. Jedoch wenn man mehrmals draufklickt, dauert es immer länger, bis der Klick vom Programm realisiert wird. Manchmal muß man 2-3x klicken. Könnte es sein, daß da irgendein Puffer vollläuft oder ich irgendwelchen Speicher freigeben muß?
Anmerkung: Wenn ich die Gadgets in der WaitWindowEvent() Schleife abfrage, ist der Effekt genau der selbe. Am Anfang funktioniert das sofort und mit der Zeit brauchts 2-3 Klicks.

Ich hätte natürlich auch ImageButton verwenden können, nur gibt es leider keine Einstellung, um den Button flach einzustellen und ich möchte keine 3D-Optik.

Vielen Dank

__________________________________________________
Thread verschoben
Code, Tipps und Tricks>Anfänger
11.09.2018
RSBasic
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ImageGadget als Button

Beitrag von RSBasic »

rowo hat geschrieben:Manchmal muß man 2-3x klicken. Könnte es sein, daß da irgendein Puffer vollläuft oder ich irgendwelchen Speicher freigeben muß?
Anmerkung: Wenn ich die Gadgets in der WaitWindowEvent() Schleife abfrage, ist der Effekt genau der selbe. Am Anfang funktioniert das sofort und mit der Zeit brauchts 2-3 Klicks.]
Du verwendest wahrscheinlich WaitWindowEvent() mehrfach. Du darfst nur 1x WaitWindowEvent() benutzen, sonst hast du genau dieses Problem, dass bestimmte Events verloren gehen und du mehrmals klicken musst, damit dein Klick ausgewertet werden kann.
Speichere den Rückgabewert von WaitWindowEvent() in eine Variable und verwende danach nur noch diese Variable, um alle Events auswerten zu können.

Beispiel:

Code: Alles auswählen

EnableExplicit

Define Event

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  Repeat
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            
        EndSelect
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
rowo
Beiträge: 13
Registriert: 28.12.2017 17:45
Computerausstattung: Macbook Pro, Mid 2010
Lenovo Workstation, i5 3,2 Ghz, 32 GB RAM, 480 GB SSD, Nvidia Quadro
Wohnort: Bayern, nähe Augsburg

Re: ImageGadget als Button

Beitrag von rowo »

Nein. Meine Schleife ist exakt genauso aufgebaut mit Event = WaitWindowEvent()
Wie gesagt, es funktioniert am Anfang. Alle anderen Gadgets funktionieren auch später einwandfrei wie TrackBar, Panel etc, nur das ImageGadget braucht mehrfachen Klick.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ImageGadget als Button

Beitrag von RSBasic »

Kannst du mit meinem Beispielcode deinen ImageGadget-Code nachbauen, damit wir es nachvollziehen können?
Falls du es nicht nachstellen kannst, dann poste hier einen Teil deines Codes.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
rowo
Beiträge: 13
Registriert: 28.12.2017 17:45
Computerausstattung: Macbook Pro, Mid 2010
Lenovo Workstation, i5 3,2 Ghz, 32 GB RAM, 480 GB SSD, Nvidia Quadro
Wohnort: Bayern, nähe Augsburg

Re: ImageGadget als Button

Beitrag von rowo »

Hier ein Teil meines Codes:
Das war die ursprüngliche Form ohne BindEvent. Fehler ist bei beiden Varianten der selbe.

Code: Alles auswählen

Repeat                                                            
    Event = WaitWindowEvent()                                      
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case imgGesichtRot
            ButtonGesicht()
          EndSelect
       Case #PB_Event_CloseWindow
         ProgrammEnde()
      EndSelect
Until Event = #PB_Event_CloseWindow
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ImageGadget als Button

Beitrag von RSBasic »

Kannst du den Code posten, der für das Ändern der Grafik zuständig ist?
Kannst du im Task-Manager schauen, ob der RAM-Verbrauch deiner Anwendung jedes Mal größer wird, wenn du auf dein ImageGadget klickst?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ImageGadget als Button

Beitrag von RSBasic »

Hier mal mein Beispielcode:

Code: Alles auswählen

EnableExplicit

CreateImage(1, 50, 50, 24, RGB(255, 0, 0))
CreateImage(2, 50, 50, 24, RGB(0, 0, 255))

Procedure ButtonGesicht()
  Protected CurrentGadget = EventGadget()
  
  If GetGadgetState(CurrentGadget) = ImageID(1)
    SetGadgetState(CurrentGadget, ImageID(2))
  Else
    SetGadgetState(CurrentGadget, ImageID(1))
  EndIf
  
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ImageGadget(1, 10, 10, 0, 0, ImageID(1), 0)
  
  ;BindEvent(#PB_Event_Gadget, @ButtonGesicht(), 0, 1, #PB_EventType_LeftClick)
  BindGadgetEvent(1, @ButtonGesicht(), #PB_EventType_LeftClick)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Irgendwas stimmt in deinem Code nicht. Ist nur die Frage, was. Deshalb schau nochmal in deinen Code rein, ob du irgendwas zusätzliches machst. Kannst du deinen Code hier posten?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
rowo
Beiträge: 13
Registriert: 28.12.2017 17:45
Computerausstattung: Macbook Pro, Mid 2010
Lenovo Workstation, i5 3,2 Ghz, 32 GB RAM, 480 GB SSD, Nvidia Quadro
Wohnort: Bayern, nähe Augsburg

Re: ImageGadget als Button

Beitrag von rowo »

Hallo, ich habe das Programm compiliert und die EXE wird bei jedem Klick auf ein Bild um ca. 700k größer.

Code: Alles auswählen

Procedure ButtonGesicht()
    SetGadgetState(imgGesichtRot, 0)
    SetGadgetState(imgGesichtRot, ImageID(icoGesichtSchwarz))
EndProcedure
Und das icoGesichtSchwarz ist eine png Datei, die ich in einer DataSection lade

Code: Alles auswählen

DataSection
   icoGesichtSchwarz:
   IncludeBinary "icoGesichtSchwarz.png"
EndDataSecion
Zudem habe ich noch folgenden Code:

Code: Alles auswählen

Global.l icoGesichtSchwarz = CatchImage(#PB_Any, ?icoGesichtSchwarz)
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ImageGadget als Button

Beitrag von RSBasic »

rowo hat geschrieben:

Code: Alles auswählen

Procedure ButtonGesicht()
    SetGadgetState(imgGesichtRot, 0)
    SetGadgetState(imgGesichtRot, ImageID(icoGesichtSchwarz))
EndProcedure
Ist das alles, was bei einem Klick passiert oder werden noch andere Sachen durchgeführt? Hast du diesen Code reduziert, um diesen hier zu posten?
Diese Prozedur wird auch nur einmal bei einem Klick ausgeführt? Herausfinden kannst du, wenn du in dieser Prozedur Debug "hallo" schreibst.
rowo hat geschrieben:

Code: Alles auswählen

Global.l icoGesichtSchwarz = CatchImage(#PB_Any, ?icoGesichtSchwarz)
Diese Zeile wird auch nur einmal ausgeführt?

Was du machen kannst ist, den Debugger einzuschalten, einen Haltepunkt mit F9 zu setzen und deine Anwendung mit F8 schrittweise zu debuggen. Vielleicht findest du damit eine andere Ursache.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
rowo
Beiträge: 13
Registriert: 28.12.2017 17:45
Computerausstattung: Macbook Pro, Mid 2010
Lenovo Workstation, i5 3,2 Ghz, 32 GB RAM, 480 GB SSD, Nvidia Quadro
Wohnort: Bayern, nähe Augsburg

Re: ImageGadget als Button

Beitrag von rowo »

Wird nur einmal ausgeführt. Im Prinzip habe ich nur eine Buttonfunktion realisiert. 1x Klicken Smiley = Schwarz, nächstes Mal Klicken Smiley = Rot
Beim Programmstart funktioniert das auch auf den ersten Klick. Nach einigen Durchläufen braucht es mehrere Klicks.
Antworten