Seite 6 von 7

Re: Ein Infofenster anzeigen

Verfasst: 30.06.2013 10:53
von derschutzhund
@dysti
Habe mir nochmal deine 3 Videos zum Formdesigner angesehen und dann das letzte zu den Codebausteinen.
Am Ende hast du ja wirklich nur eine Formdatei und eine Codedatei!
Im Grunde ideal.
Habe danach mal ein Minimalprogramm erstellt. Ein Button um das Prog. zu beenden und einen Button um etwas in ein Textfeld zu schreiben.
Weniger geht wohl nicht. Nur um mal zu verstehen wie es mit den Events läuft.
Die Verwaltung und Verschaltung ist irgendwie die Hauptarbeit bei Purebasic wobei man da in anderen Systemen wie Gambas eigentlich nichts dazu programmieren muss.
Jetzt habe ich einen merkwürdigen Effekt. Als ich das Prog. fertig hatte lief es wie gewünscht dann habe ich etwas damit experimentiert und nun muss ich mehrfach auf die Buttons klicken damit sich was tut. Vielleicht siehst du woran es liegt. Der Effekt ist übrigens sowohl unter Windows als auch unter Linux gleich.

testform.pbf

Code: Alles auswählen

Global Window_0

Global Button_0, String_0, Button_1

Declare testb(EventType)
Declare progende(EventType)

Procedure OpenWindow_0()
  Window_0 = OpenWindow(#PB_Any, 0, 0, 600, 400, "testfenster", #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
  Button_0 = ButtonGadget(#PB_Any, 106, 88, 100, 25, "start", #PB_Button_Left)
  String_0 = StringGadget(#PB_Any, 310, 90, 100, 25, "")
  Button_1 = ButtonGadget(#PB_Any, 10, 10, 100, 25, "ende")
EndProcedure

Procedure Window_0_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_0
          testb(EventType())          
        Case Button_1
          progende(EventType())          
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

main.pb

Code: Alles auswählen

IncludeFile "testform.pbf"

Define event, EventGadget, EventType, EventMenu, EventWindow

OpenWindow_0()
  
Repeat
  
  Event = WaitWindowEvent()
  EventGadget = EventGadget()
  EventType = EventType()
  EventMenu = EventMenu()
  EventWindow = EventWindow()
  
  prglauf=Window_0_Events(WaitWindowEvent())

  Until prglauf=#False
End
  
Procedure testb(EventType)
  SetGadgetText(string_0,"hallo")
EndProcedure

Procedure progende(EventType)
  ExitApplication = 1  
EndProcedure

Re: Ein Infofenster anzeigen

Verfasst: 30.06.2013 10:59
von RSBasic
@derschutzhund
Warum deine Events verschluckt werden, ist ganz einfach. Du verwendest die Eventfunktionen merhfach. Das sollte man nicht tun!
WaitWindowEvent() rufst du zweimal auf. Benutze bitte die Variable.
Ebenso wie EventGadget(), ...

Re: Ein Infofenster anzeigen

Verfasst: 30.06.2013 11:19
von derschutzhund
RSBasic hat geschrieben:@derschutzhund
Warum deine Events verschluckt werden, ist ganz einfach. Du verwendest die Eventfunktionen merhfach. Das sollte man nicht tun!
WaitWindowEvent() rufst du zweimal auf. Benutze bitte die Variable.
Ebenso wie EventGadget(), EventType(), ...
Sollte doch so aussehen oder aber jetzt wird es überhaupt nicht mehr geschlossen:

Code: Alles auswählen

IncludeFile "testform.pbf"

Define event, EventGadget, EventType, EventMenu, EventWindow

OpenWindow_0()
  
Repeat
  
  Event = WaitWindowEvent()
  EventGadget = EventGadget()
  EventType = EventType()
  EventMenu = EventMenu()
  EventWindow = EventWindow()

  Until event=#False
End
  
Procedure testb(EventType)
  SetGadgetText(string_0,"hallo")
EndProcedure

Procedure progende(EventType)
  ExitApplication = 1  
EndProcedure

Re: Ein Infofenster anzeigen

Verfasst: 30.06.2013 11:21
von Kiffi

Code: Alles auswählen

Repeat
  
  Event = WaitWindowEvent()
  EventGadget = EventGadget()
  EventType = EventType()
  EventMenu = EventMenu()
  EventWindow = EventWindow()
  
  prglauf=Window_0_Events(Event)

  Until prglauf=#False

End

Re: Ein Infofenster anzeigen

Verfasst: 30.06.2013 11:26
von derschutzhund
Kiffi hat geschrieben:

Code: Alles auswählen

Repeat
  
  Event = WaitWindowEvent()
  EventGadget = EventGadget()
  EventType = EventType()
  EventMenu = EventMenu()
  EventWindow = EventWindow()
  
  prglauf=Window_0_Events(Event)

  Until prglauf=#False

End
Hat nix gebracht!

Re: Ein Infofenster anzeigen

Verfasst: 30.06.2013 11:46
von Kiffi
derschutzhund hat geschrieben:Hat nix gebracht!
ei freilich bringt das was. Vorausgesetzt, Dein Code sieht
noch immer so aus wie in Deinem Eröffnungsposting.

Das einzige was geändert werden musste, ist

Code: Alles auswählen

prglauf=Window_0_Events(WaitWindowEvent())
zu

Code: Alles auswählen

prglauf=Window_0_Events(Event)
Grüße ... Kiffi

Re: Ein Infofenster anzeigen

Verfasst: 30.06.2013 11:52
von derschutzhund
Sorry aber wenn ich es starte funktioniert der Ende-Button bei mir nicht!

Code: Alles auswählen

Global Window_0

Global Button_0, String_0, Button_1

Declare testb(EventType)
Declare progende(EventType)

Procedure OpenWindow_0()
  Window_0 = OpenWindow(#PB_Any, 0, 0, 600, 400, "testfenster", #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
  Button_0 = ButtonGadget(#PB_Any, 106, 88, 100, 25, "start", #PB_Button_Left)
  String_0 = StringGadget(#PB_Any, 310, 90, 100, 25, "")
  Button_1 = ButtonGadget(#PB_Any, 10, 10, 100, 25, "ende")
EndProcedure

Procedure Window_0_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_0
          testb(EventType())          
        Case Button_1
          progende(EventType())          
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

Code: Alles auswählen

IncludeFile "testform.pbf"

Define event, EventGadget, EventType, EventMenu, EventWindow

OpenWindow_0()
  
Repeat
 
  Event = WaitWindowEvent()
  EventGadget = EventGadget()
  EventType = EventType()
  EventMenu = EventMenu()
  EventWindow = EventWindow()
 
  prglauf=Window_0_Events(Event)

Until prglauf=#False

End
  
Procedure testb(EventType)
  SetGadgetText(string_0,"hallo")
EndProcedure

Procedure progende(EventType)
  ExitApplication = 1  
EndProcedure

Re: Ein Infofenster anzeigen

Verfasst: 30.06.2013 11:55
von Kiffi
derschutzhund hat geschrieben:Sorry aber wenn ich es starte funktioniert der Ende-Button bei mir nicht!
wenn Du den 'ende'-Button drückst, setzt Du ExitApplication auf 1

ExitApplication wird aber sonst nirgendwo in Deinem Code überprüft.

Grüße ... Kiffi

Re: Ein Infofenster anzeigen

Verfasst: 30.06.2013 12:12
von derschutzhund
Ich hoffe, dass ich demnächst auch mal auf irgend eine Stärke von PureBasic komme.

Bis jetzt war es ehrlich gesagt ein einziger Krampf!

Man muss eine Entlosschleife für den gesamten Programmablauf programmieren was alle anderen guten Systeme sowieso automatisch haben weil es klar ist dass ein Programm so lange laufen soll bis es einen Endebefehl bekommt.

Man muss von Hand mit den Events des Systems schonglieren um überhaubt irgendwas zu sehen und dabei ist noch keine einzige, wirkliche Funktion erstellt.

Welche Zeile muss jetzt in

Code: Alles auswählen

Procedure progende(EventType)
  ExitApplication = 1  
EndProcedure
stehen???

Re: Ein Infofenster anzeigen

Verfasst: 30.06.2013 12:28
von RSBasic
Und es wäre schön, wenn du EnableExplicit verwenden würdest. ;) Einfach ganz oben in deinem Hauptcode "EnableExplicit" schreiben/einfügen und ggf. Variablen definieren.
derschutzhund hat geschrieben:Bis jetzt war es ehrlich gesagt ein einziger Krampf!
Ich hab zwar bis jetzt noch nie mit dem neuen VD gearbeitet, aber wenn ich das machen würde, sähe es dann so aus:

Code: Alles auswählen

EnableExplicit

Define EventID

Enumeration
  #Window_Main
EndEnumeration

Enumeration
  #Gadget_Button_Start
  #Gadget_Button_End
  #Gadget_Input
EndEnumeration

If OpenWindow(#Window_Main, 0, 0, 600, 400, "testfenster", #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
  ButtonGadget(#Gadget_Button_Start, 106, 88, 100, 25, "start", #PB_Button_Left)
  StringGadget(#Gadget_Input, 310, 90, 100, 25, "")
  ButtonGadget(#Gadget_Button_End, 10, 10, 100, 25, "ende")
  
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case #Gadget_Button_Start
          SetGadgetText(#Gadget_Input, "hallo")
        Case #Gadget_Input
          
        Case #Gadget_Button_End
          EventID = #PB_Event_CloseWindow
      EndSelect
    EndIf
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
In einer Minute geschrieben, ist kürzer als deins und es funktioniert so, wie du es haben möchtest. ;)