TextGadget aktualisieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 442
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

TextGadget aktualisieren

Beitrag 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
Win-11, PB 5.31 (Windows - x86)
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: TextGadget aktualisieren

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
marcelx
Beiträge: 442
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: TextGadget aktualisieren

Beitrag 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
Win-11, PB 5.31 (Windows - x86)
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: TextGadget aktualisieren

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: TextGadget aktualisieren

Beitrag 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
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: TextGadget aktualisieren

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: TextGadget aktualisieren

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: TextGadget aktualisieren

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
marcelx
Beiträge: 442
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: TextGadget aktualisieren

Beitrag 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
Win-11, PB 5.31 (Windows - x86)
Benutzeravatar
marcelx
Beiträge: 442
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: TextGadget aktualisieren

Beitrag 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
Win-11, PB 5.31 (Windows - x86)
Antworten