Seite 1 von 2

Programm reagiert sporadisch auf Mausklicke

Verfasst: 21.04.2006 20:52
von PureBaser
Hi!

Gott sprach "Es werde Windows" und es es ward Window! :wink:
So damit bin ich nun von der Konsole auf die Windowsfenster umgestiegen. Nen billiger Taschenrechner hat problemlos funktioniert. Hier ist mein zweites Windoof-Programm.

Es hat das Problem, dass es NICHT IMMER auf den ersten Mausklick reagiert, und der Fehler tritt sporadisch auf! Selbst das Schliessen-Button oben rechts muss ich bisweilen auch 3-4x anklicken eh sich das Programm schließt . wo könnte das Problem sein?!

By the way: Wie kann ich Symbole in den Meldungen einfügen (rotes Kreuz oder Info?)

Code: Alles auswählen

; Windows-Meldungen Erzeugen
; 21.04.2006
; PB 3.94
;- Variablen
Global bool.b
Global Ereignis
Global titel$, text$
;- Prozeduren
Procedure Fensteraufbau()
If OpenWindow(0,0,0,200,115,#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget,"Meldungsfälscher")
  If CreateGadgetList(WindowID(0))
     StringGadget(0,0,0,200,20,"Titel")
     GadgetToolTip(0,"Hier bitte den Text eingeben, welcher der Titelleiste erscheinen soll")
     StringGadget(1,0,20,200,20,"Text")
     GadgetToolTip(1,"Hier bitte den Text eingeben, welcher in der Meldung erscheinen soll")
     ButtonGadget(2,0,45,25,20,"Ok")
     ButtonGadget(3,30,45,90,20,"OK && Abbrechen")
     ButtonGadget(4,125,45,75,20,"Ja && Nein")
     ButtonGadget(5,0,70,200,20,"Abbrechen && Wiederholen && Ignorieren")
     ButtonGadget(6,0,95,175,20,"Abbrechen && Wiederholen && Weiter")
     ButtonGadget(7,180,95,20,20,"?")
     GadgetToolTip(7,"Information")
  bool = 1
  Else
  MessageRequester("Fehler 2","Es konnten keine Steuerelemente erstellt werden! Bitte kontaktieren Sie den Programmierer!",0) 
  EndIf
Else
MessageRequester("Fehler 1","Es konnte kein Fenster erstellt werden! Bitte kontaktieren Sie den Programmierer!",0) 
EndIf
EndProcedure

Procedure Ereignis()
If bool = 1
UseWindow(0)
  Repeat
  Ereignis = WaitWindowEvent()
  titel$ = GetGadgetText(0)
  text$ = GetGadgetText(1)
    Select Ereignis
      Case #PB_Event_Gadget
        Select EventGadgetID()
          Case 2
          MessageRequester(titel$,text$,0)
          Case 3
          MessageRequester(titel$,text$,1)
          Case 4
          MessageRequester(titel$,text$,4)
          Case 5
          MessageRequester(titel$,text$,2)
          Case 6
          MessageRequester(titel$,text$,6)
          Case 7
          MessageRequester("Meldungsfälscher (1.00)","              By xelotiac",0)
          EndSelect
    EndSelect
  Until WaitWindowEvent() = #PB_Event_CloseWindow
  CloseWindow(0)
  End
Else
MessageRequester("Fehler 3:","Es konnten kein Ereignis ausgeführt werden! Bitte kontaktieren Sie den Programmierer!",0)
EndIf
EndProcedure

Procedure Main()
Fensteraufbau()
Ereignis()
EndProcedure

;- Code
Main()
Thx!

Verfasst: 21.04.2006 20:55
von Kaeru Gaman
der gleiche fehler, wie immer, wenn diese frage kommt:

du hast mehrfach WaitWindowEvent() drin.


mit

Code: Alles auswählen

Until Ereignis = #PB_Event_CloseWindow 
sollte es gehen...


[edit]--------------------------
das ist so ein "beliebter" fehler, das sollte direkt in die Help mit rein...

Verfasst: 21.04.2006 21:10
von AND51
Du hast zwei mal WaitWindowEvent() verwendet.

Wurde aber schon während ich schreibe von Kaeru beantwortet, weil ich afk war.

Ist wie schon gesagt ein beliebter Fehler.

Zu den SYMBOLEN:

Gib bei den MessageRequester(), mal diese Konstanten an:
#MB_ICON ...
  • QUESTION
    AETERISK
    ERROR
    WARNING
    INFORMATION

Verfasst: 21.04.2006 21:17
von PureBaser
Danke!
Die Hilfe hat mich übrigens geradezu animiert so zu schreiben, weil der Code so ähnlich da drin war. Ich schau mal nach und sag morgen genauer Bescheid.

Verfasst: 21.04.2006 21:24
von Kaeru Gaman
> so ähnlich

aber eben nur so ähnlich und nicht gleich und nicht mehrfach WaitWindowEvent() ;)

[edit]-----------------------------------------
und in der neuen help isses doch schon drin...

sagtest du nich die tage, du hättest die 4.0beta draufgezogen?

wo in der Help hast du denn dann geschaut...?

Verfasst: 21.04.2006 23:23
von PureBaser
Ich nutze momentan immer noch PB 3.94 bis zur Final...
Ich weiß auch warum die Hilfe mich durcheinander brachte: Bei den großen Beispielen war

Code: Alles auswählen

until Ereignis = #PB_Event_CloseWindow
und bei den kleinen Beispielen zu den einzelnen Gadgets

Code: Alles auswählen

until WaitWindowEvent() = #PB_Event_CloseWindow
...
Um das Programm auszuschmücken, wollte ich das mit Options kombinieren - warum gehts wieder mal net?!

Code: Alles auswählen

; OptionGadgets
; 22.04.2006
; PB 3.94
;- Variablen
Global bool.b
Global Ereignis
Global titel$, text$
;- Prozeduren
Procedure Fensteraufbau()
If OpenWindow(0,0,0,200,135,#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget,"Meldungsfälscher")
  If CreateGadgetList(WindowID(0))
     StringGadget(0,0,0,200,20,"Titel")
     StringGadget(1,0,20,200,20,"Text")
     ButtonGadget(2,0,45,25,20,"Ok")
     OptionGadget(3,0,65,100,20,"Frage-Symbol")
     OptionGadget(4,0,85,100,20,"Info-Symbol")
  bool = 1
  EndIf
EndIf
EndProcedure

Procedure Ereignis()
If bool = 1
UseWindow(0)
  Repeat
  Ereignis = WaitWindowEvent()
  titel$ = GetGadgetText(0)
  text$ = GetGadgetText(1)
    Select Ereignis
      Case #PB_Event_Gadget
        If EventGadgetID() = 2
           MessageRequester(titel$,text$,0)
        ElseIf EventGadgetID() = 2 And 3
          MessageRequester(titel$,text$,0|#MB_ICONQUESTION)
        ElseIf EventGadgetID() = 2 And 4
          MessageRequester(titel$,text$,0|#MB_ICONINFORMATION)
        EndIf
    EndSelect
  Until Ereignis = #PB_Event_CloseWindow
  End
EndIf
EndProcedure

Procedure Main()
Fensteraufbau()
Ereignis()
EndProcedure

;- Code
Main()

Verfasst: 21.04.2006 23:29
von Kaeru Gaman

Code: Alles auswählen

EventGadgetID() = 2 And 3
is unfug

mal abgesehen davon, daß es nie zu dem elseif kommt...

du musst vorher eine variable einstellen gemäß den einstellungen der option.
(-> GetGadgetState(..) )

das "ok"-event löst dann den msg-req aus, der mit eben diesem flag versehen wird.

Verfasst: 21.04.2006 23:33
von PureBaser
Kleines Beispiel :roll: ?

Verfasst: 21.04.2006 23:38
von Kaeru Gaman
du musst vorher die option checken, schau mal nach GetGadgetState

dementsprechend richtest du ne variable ein, z.b. "ActualIcon"

später hast du nurnoch

Code: Alles auswählen

        If EventGadgetID() = 2 
           MessageRequester(titel$,text$, ActualIcon ) 
deine überlegung war in sofern grundfalsch:

Code: Alles auswählen

If EventGadgetID() = 2 And 3
3 ist immer 3, das If würde also nur auf EventGadgetID() = 2 reagieren.

aber wie gesagt, da kommt es gar nicht hin, weil du vorher ja schon das
EventGadgetID() = 2 abfängst...

Verfasst: 21.04.2006 23:42
von PureBaser
Boah :o
Gibts ne Hochschule wo man PB studieren kann?!? Is ja nich zu fassen wieviel Wissen ihr hier habt! Bin beeindruckt! <)