Seite 1 von 2

TextGadget aktualisieren

Verfasst: 08.07.2012 19:24
von marcelx
Hallo,

ich möchte in ein StringGadget (#nr) ein Wert schreiben, welche in eine loop aktualisiert wird.
Was ich nicht verstehe ist das Vehalten mein Test:
1) in StringGadget (#nr) wird das letzte Werte (in den Fall 10) geschrieben, ob wohl ich mit debug meine Texte sehe.
2) mein button (#Button_listStart, #Button_listCancel und #Listview) werden erst nach Ablauf der loop angezeigt.

Code: Alles auswählen

#WindowWidth  = 520
#WindowHeight = 460 

Enumeration
  #Window_ana
  #Window_list
  #Txt_ana
  #Txt_nr
  #nr
  #Button_anaCancel
  #Button_list
  #Button_start
  #Txt_list
  #Button_listStart
  #Button_listCancel
  #Listview
   
  #T_NUM ; an Ende 
EndEnumeration

Global Dim T.s(#T_NUM)

T(#Window_ana) = "Ana ..."
T(#Txt_ana) = "Analyse de ..."
T(#Txt_nr) = "Nombre de dossier ..:"
T(#nr) = ""
T(#Button_anaCancel) = "Annuler"
T(#Button_list) = "Liste"
T(#Button_start) = "Executer"
T(#Window_list) = "List ..."
T(#Button_listStart) = "Start ..."
T(#Button_listCancel) = "Cancel"

Procedure Open_Window_ana()
  If OpenWindow(#Window_ana, 0, 0, 346, 160, T(#Window_ana),  #PB_Window_TitleBar | #PB_Window_ScreenCentered )
      LoadImage(0, "ok.ico")
      TextGadget(#Txt_ana, 20, 10, 310, 40, T(#Txt_ana), #PB_Text_Center )
      TextGadget(#Txt_nr, 10, 50, 210, 20, T(#Txt_nr))
      StringGadget(#nr, 200, 50, 80, 20, "", #PB_String_ReadOnly)

      ButtonGadget(#Button_anaCancel, 20, 120, 90, 20, T(#Button_anaCancel))
      ButtonGadget(#Button_list, 130, 120, 90, 20, T(#Button_list))
      ButtonGadget(#Button_start, 240, 120, 90, 20, T(#Button_start))
      Delay(200)

      DisableGadget(#Button_start, 0)
      Debug("Open_Window_ana")
      Delay(200)
  EndIf
EndProcedure
 
Procedure getListData()
  For i = 1 To 10
     SetGadgetText(#nr, Str(i))
     Debug Str(i)+" "+GetGadgetText(#nr)
     Delay(200)
  Next
EndProcedure

Procedure Open_Window_list()
  CloseWindow(#Window_ana)
  If OpenWindow(#Window_list, 0, 0, 776, 538, T(#Window_list),  #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      TextGadget(#Txt_list, 20, 10, 740, 20, "#Txt_list", #PB_Text_Center)
      ButtonGadget(#Button_listStart, 640, 500, 110, 20, T(#Button_listStart))
      ButtonGadget(#Button_listCancel, 480, 500, 110, 20, T(#Button_listCancel))
      ListViewGadget(#Listview, 20, 50, 730, 440)
  EndIf
EndProcedure

Open_Window_ana()
getListData()

Repeat
  EventID = WaitWindowEvent()

  Select EventID
    Case #PB_Event_CloseWindow
      CloseWindow(#Window_ana)
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      If EventGadget = #Button_anaCancel
        CloseWindow(#Window_ana)
        Break
      ElseIf EventGadget = #Button_list
        Open_Window_list()
      ElseIf EventGadget = #Button_listCancel
        CloseWindow(#Window_list)
      EndIf
  EndSelect      
Until EventID = #PB_Event_CloseWindow  
Was ist falsch daran?

Danke und Gruß
MarcelX

Re: TextGadget aktualisieren

Verfasst: 08.07.2012 19:52
von NicknameFJ
Hallo marcelx,

die Gadgets werden erst aktualisiert (Bildschirmanzeige) wenn WaitWindowEvent() aufgerufen wird.

Du schreibst die neuen Werte aber in der Procedure getListData() rein. Während dieser Zeit wird WaitWindowEvent aber nicht aufgerufen, folglich keine Aktualisierung der Bildschirmanzeige - wohl aber im Speicher.

Grüße

NicknameFJ

Re: TextGadget aktualisieren

Verfasst: 08.07.2012 20:31
von marcelx
Hallo NicknameFJ,

ich habe WaitWindowEvent/WindowEvent in meine loop eingebaute und das Verhalten ist der gleiche:

Code: Alles auswählen

Procedure getListData()
  For i = 1 To 10
     SetGadgetText(#nr, Str(i))
     Debug Str(i)+" "+GetGadgetText(#nr)
     WaitWindowEvent()
     Delay(200)
  Next
EndProcedure
Grüße

MarcelX

__________________________________________________
Tags geändert
quote>code
08.07.2012
RSBasic

Re: TextGadget aktualisieren

Verfasst: 08.07.2012 20:49
von NicknameFJ
Hier mal ein Beispiel (mal schnell so hingeschmiert) für das Hochzählen in der Repeat/until Schleife.

Du kannst natürlich auch einen WindowTimer verwenden, ist eleganter :mrgreen:


Code: Alles auswählen

#WindowWidth  = 520
#WindowHeight = 460

Enumeration
  #Window_ana
  #Window_list
  #Txt_ana
  #Txt_nr
  #nr
  #Button_anaCancel
  #Button_list
  #Button_start
  #Txt_list
  #Button_listStart
  #Button_listCancel
  #Listview
   
  #T_NUM ; an Ende
EndEnumeration

Global Dim T.s(#T_NUM)

T(#Window_ana) = "Ana ..."
T(#Txt_ana) = "Analyse de ..."
T(#Txt_nr) = "Nombre de dossier ..:"
T(#nr) = ""
T(#Button_anaCancel) = "Annuler"
T(#Button_list) = "Liste"
T(#Button_start) = "Executer"
T(#Window_list) = "List ..."
T(#Button_listStart) = "Start ..."
T(#Button_listCancel) = "Cancel"

Procedure Open_Window_ana()
  If OpenWindow(#Window_ana, 0, 0, 346, 160, T(#Window_ana),  #PB_Window_TitleBar | #PB_Window_ScreenCentered )
      LoadImage(0, "ok.ico")
      TextGadget(#Txt_ana, 20, 10, 310, 40, T(#Txt_ana), #PB_Text_Center )
      TextGadget(#Txt_nr, 10, 50, 210, 20, T(#Txt_nr))
      StringGadget(#nr, 200, 50, 80, 20, "", #PB_String_ReadOnly)

      ButtonGadget(#Button_anaCancel, 20, 120, 90, 20, T(#Button_anaCancel))
      ButtonGadget(#Button_list, 130, 120, 90, 20, T(#Button_list))
      ButtonGadget(#Button_start, 240, 120, 90, 20, T(#Button_start))
      Delay(200)

      DisableGadget(#Button_start, 0)
      Debug("Open_Window_ana")
      Delay(200)
  EndIf
EndProcedure
 

Procedure Open_Window_list()
  CloseWindow(#Window_ana)
  If OpenWindow(#Window_list, 0, 0, 776, 538, T(#Window_list),  #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      TextGadget(#Txt_list, 20, 10, 740, 20, "#Txt_list", #PB_Text_Center)
      ButtonGadget(#Button_listStart, 640, 500, 110, 20, T(#Button_listStart))
      ButtonGadget(#Button_listCancel, 480, 500, 110, 20, T(#Button_listCancel))
      ListViewGadget(#Listview, 20, 50, 730, 440)
  EndIf
EndProcedure

Open_Window_ana()


timerStart = GetTickCount_()
num = 1

Repeat
  EventID = WaitWindowEvent(100)
  
  If GetTickCount_() > timerstart +1000
    timerstart = GetTickCount_()
    SetGadgetText(#nr,Str(num))
    num +1
    
  EndIf
  
  
  
  Select EventID
    Case #PB_Event_CloseWindow
      CloseWindow(#Window_ana)
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      If EventGadget = #Button_anaCancel
        CloseWindow(#Window_ana)
        Break
      ElseIf EventGadget = #Button_list
        Open_Window_list()
      ElseIf EventGadget = #Button_listCancel
        CloseWindow(#Window_list)
      EndIf
  EndSelect     
Until EventID = #PB_Event_CloseWindow 
Grüße

NicknameFJ

Re: TextGadget aktualisieren

Verfasst: 08.07.2012 21:11
von Kiffi
hier noch mal mit nem WindowTimer:

Code: Alles auswählen

#WindowWidth  = 520
#WindowHeight = 460 

Enumeration
  #Window_ana
  #Window_list
  #Txt_ana
  #Txt_nr
  #nr
  #Button_anaCancel
  #Button_list
  #Button_start
  #Txt_list
  #Button_listStart
  #Button_listCancel
  #Listview
  
  #T_NUM ; an Ende 
EndEnumeration
Enumeration
  #getListData_Timer
EndEnumeration

Global Dim T.s(#T_NUM)

T(#Window_ana) = "Ana ..."
T(#Txt_ana) = "Analyse de ..."
T(#Txt_nr) = "Nombre de dossier ..:"
T(#nr) = ""
T(#Button_anaCancel) = "Annuler"
T(#Button_list) = "Liste"
T(#Button_start) = "Executer"
T(#Window_list) = "List ..."
T(#Button_listStart) = "Start ..."
T(#Button_listCancel) = "Cancel"

Procedure Open_Window_ana()
  If OpenWindow(#Window_ana, 0, 0, 346, 160, T(#Window_ana),  #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    ;LoadImage(0, "ok.ico")
    TextGadget(#Txt_ana, 20, 10, 310, 40, T(#Txt_ana), #PB_Text_Center )
    TextGadget(#Txt_nr, 10, 50, 210, 20, T(#Txt_nr))
    StringGadget(#nr, 200, 50, 80, 20, "", #PB_String_ReadOnly)
    
    ButtonGadget(#Button_anaCancel, 20, 120, 90, 20, T(#Button_anaCancel))
    ButtonGadget(#Button_list, 130, 120, 90, 20, T(#Button_list))
    ButtonGadget(#Button_start, 240, 120, 90, 20, T(#Button_start))
    Delay(200)
    
    DisableGadget(#Button_start, 0)
    Debug("Open_Window_ana")
    Delay(200)
  
    AddWindowTimer(#Window_ana, #getListData_Timer, 200)
  
  EndIf
EndProcedure

Procedure getListData()
  Static Counter
  Counter + 1
  SetGadgetText(#nr, Str(Counter))
  Debug Str(Counter)+" "+GetGadgetText(#nr)
  If Counter = 10
    RemoveWindowTimer(#Window_ana, #getListData_Timer)
  EndIf
EndProcedure

Procedure Open_Window_list()
  CloseWindow(#Window_ana)
  If OpenWindow(#Window_list, 0, 0, 776, 538, T(#Window_list),  #PB_Window_TitleBar | #PB_Window_ScreenCentered)
    TextGadget(#Txt_list, 20, 10, 740, 20, "#Txt_list", #PB_Text_Center)
    ButtonGadget(#Button_listStart, 640, 500, 110, 20, T(#Button_listStart))
    ButtonGadget(#Button_listCancel, 480, 500, 110, 20, T(#Button_listCancel))
    ListViewGadget(#Listview, 20, 50, 730, 440)
  EndIf
EndProcedure

Open_Window_ana()

Repeat
  EventID = WaitWindowEvent()
  
  Select EventID
    Case #PB_Event_CloseWindow
      CloseWindow(#Window_ana)
    Case #PB_Event_Timer
      Select EventTimer()
        Case #getListData_Timer
          getListData()
      EndSelect
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      If EventGadget = #Button_anaCancel
        CloseWindow(#Window_ana)
        Break
      ElseIf EventGadget = #Button_list
        Open_Window_list()
      ElseIf EventGadget = #Button_listCancel
        CloseWindow(#Window_list)
      EndIf
  EndSelect      
Until EventID = #PB_Event_CloseWindow
Der tiefere Sinn dieser Schleifenzählerei erschließt sich mir allerdings nicht.

Grüße ... Kiffi

Re: TextGadget aktualisieren

Verfasst: 08.07.2012 21:19
von ts-soft
@marcelx

Die Delays in Open_Window_ana() sind wohl vollkommen unnütz!
Das Fensterschließen und dann noch die nicht mehr existierenden Gadget im EventLoop abfragen geht so auch nicht.

Und der Vorschlag von NicknameFJ mit Code, der ohne Event im Eventloop ausgeführt wird, ist auch nicht das Wahre :mrgreen:

Animation auf kosten der Bedienbarkeit, Zeit des Nutzers usw. halte ich nicht für Sinnvoll, aber wenn, dann bitte mit
Timer und auf Timer-Ereignis reagieren.

So wie der Code jetzt ist, wird er nie vernünftig laufen, habe aber jetzt auch keine Lust Dir einen neuen zu
schreiben, bringt mehr, wenn Du es Dir selbst erarbeitest.

Fenster und Gadgets werden nur im EventLoop aktualisiert und Delay hat in einer GUI-Anwendung meist nichts verloren.

Gruß
Thomas

Re: TextGadget aktualisieren

Verfasst: 08.07.2012 21:34
von NicknameFJ
ts-soft hat geschrieben:
Und der Vorschlag von NicknameFJ mit Code, der ohne Event im Eventloop ausgeführt wird, ist auch nicht das Wahre :mrgreen: (...)

Gruß
Thomas

Thomas, ich weis. Aber bei dem Konzept mit GetTickCount_() habe ich ja kein Event auf das ich reagieren kann. Daher auch der Hinweis auf WindowTimer :mrgreen:
ts-soft hat geschrieben: (...) bringt mehr, wenn Du es Dir selbst erarbeitest.
Das habe ich mir auch gedacht, dass er sich das selbst mit den WindowTimer erarbeiten kann. Sind schließlich nicht im Anfängerforum

Wollte nur zeigen, dass der Aufruf von SetGadetText() aus der Repeat/Until heraus erfolgen soll.

Grüße

NIcknameFJ

Re: TextGadget aktualisieren

Verfasst: 08.07.2012 21:45
von ts-soft
NicknameFJ hat geschrieben:
ts-soft hat geschrieben: (...) bringt mehr, wenn Du es Dir selbst erarbeitest.
Das habe ich mir auch gedacht, dass er sich das selbst mit den WindowTimer erarbeiten kann. Sind schließlich nicht im Anfängerforum
Wenn dass, das einzige Problem wäre, der ganze Code funktioniert in keinster Weise, spatestens nach dem zweiten Klick
gibts Ärger wegen fehlender Gadgets oder Fenster :mrgreen:

Apropo, dieser Code gehört wirklich eher ins Anfänger-Forum, der funktioniert leider nicht mal Ansatzweise, sry, aber ist so.

Vielleicht erstellt er erstmal seine GUI, ohne diese komischen Animationsversuche, und bringt diese zum Laufen.
Das Konzept ohne Hauptfenster, wo ein Fenster das andere vernichtet, sollte er sich nochmal durch den Kopf gehen
lassen.

Gruß
Thomas

Re: TextGadget aktualisieren

Verfasst: 08.07.2012 22:44
von marcelx
Hallo zusammen,

ich habe vergessen zu schreiben, dass der Delay(200) dazu dient als Test.
An diese Stelle kommt ein Verarbeitung.
Mit diese Delay(200), kann ich sehen, ob ein Ausgabe in GadgetText-#nr ok ist.

@ Thomas:
Das ist nur ein Test. (die Hauptfenster gibt noch dazu)

Gruß
MarcelX

Re: TextGadget aktualisieren

Verfasst: 09.07.2012 16:42
von marcelx
Hallo zusammen,

jetzt verstehe ich ein bissen mehr von den Ablauf in PB und konnte meine Aufgabe so lösen:
ich verwende CreateThread in meine loop (WaitWindowEvent()), um meine Procedure getListData aufzurufen.

Gruß
MarcelX