Seite 1 von 1

ContainerGadget wird nicht angezeigt

Verfasst: 04.09.2019 12:26
von Michael(362)
Moin,
ich habe ein ContainerGadget mit ProgressBar und 2 Textfeldern erstellt.
Das ContainerGadget hab ich mit x=-1000 und y=-1000 erstmal versteckt.

Code: Alles auswählen

  ContainerGadget(#ContainerProgress, -1000, -1000, 460, 110, #PB_Container_Raised)
    ProgressBarGadget(#ProgressBar, 20, 20, 420, 20, 0, 100, #PB_ProgressBar_Smooth)
    TextGadget(#ContainerProgressText_1, 20, 50, 420, 20, "")
    TextGadget(#ContainerProgressText_2, 20, 70, 420, 20, "")
  CloseGadgetList()
Wenn ich jetzt das ContainerGadget mit folgendem Code verwenden möchte,

Code: Alles auswählen

  ResizeGadget(#ContainerProgress, 100, 100, 460, 110)
  For i = 0 To ArraySize(FileArray())-1
    SetGadgetState(#ProgressBar, (i))
    SetGadgetText(#ContainerProgressText_1, FileArray(i))
    SetGadgetText(#ContainerProgressText_2, "wird geladen")
    InsertFile(FileArray(i))
  Next i
Werden zwar die ProgressBar und die Textfelder angezeigt, aber das ContainerGadget
wird nicht dargestellt.

Kann mir Jemand sagen warum das so ist?

Gruß Michael

Re: ContainerGadget wird nicht angezeigt

Verfasst: 04.09.2019 12:34
von RSBasic
Wenn du in einer Schleife ohne Thread die Gadgetwerte änderst, dann gibt es auch keine Fenster-Events und deshalb werden die Gadgets auch nicht neu gezeichnet.
Entweder lagerst du in einen Thread aus:

Code: Alles auswählen

EnableExplicit

Enumeration
  #ContainerProgress
  #ProgressBar
  #ContainerProgressText_1
  #ContainerProgressText_2
EndEnumeration

Procedure Thread(z)
  Protected i
  
  ;For i = 0 To ArraySize(FileArray())-1
  For i = 0 To 100
    SetGadgetState(#ProgressBar, (i))
    ;SetGadgetText(#ContainerProgressText_1, FileArray(i))
    SetGadgetText(#ContainerProgressText_1, Str(i))
    SetGadgetText(#ContainerProgressText_2, "wird geladen")
    Delay(100)
  Next i
EndProcedure

If OpenWindow(0, 0, 0, 800, 600, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ContainerGadget(#ContainerProgress, -1000, -1000, 460, 110, #PB_Container_Raised)
  ProgressBarGadget(#ProgressBar, 20, 20, 420, 20, 0, 100, #PB_ProgressBar_Smooth)
  TextGadget(#ContainerProgressText_1, 20, 50, 420, 20, "")
  TextGadget(#ContainerProgressText_2, 20, 70, 420, 20, "")
  CloseGadgetList()
  
  ResizeGadget(#ContainerProgress, 100, 100, 460, 110)
  
  CreateThread(@Thread(), 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
(funktioniert nur unter Windows)

Oder du sorgst dafür, dass dein Fenster mit UpdateWindow_() neu gezeichnet wird:

Code: Alles auswählen

EnableExplicit

Define i

Enumeration
  #ContainerProgress
  #ProgressBar
  #ContainerProgressText_1
  #ContainerProgressText_2
EndEnumeration

If OpenWindow(0, 0, 0, 800, 600, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ContainerGadget(#ContainerProgress, -1000, -1000, 460, 110, #PB_Container_Raised)
  ProgressBarGadget(#ProgressBar, 20, 20, 420, 20, 0, 100, #PB_ProgressBar_Smooth)
  TextGadget(#ContainerProgressText_1, 20, 50, 420, 20, "")
  TextGadget(#ContainerProgressText_2, 20, 70, 420, 20, "")
  CloseGadgetList()
  
  ResizeGadget(#ContainerProgress, 100, 100, 460, 110)
  ;For i = 0 To ArraySize(FileArray())-1
  For i = 0 To 100
    SetGadgetState(#ProgressBar, (i))
    ;SetGadgetText(#ContainerProgressText_1, FileArray(i))
    SetGadgetText(#ContainerProgressText_1, Str(i))
    SetGadgetText(#ContainerProgressText_2, "wird geladen")
    UpdateWindow_(WindowID(0))
    Delay(100)
  Next i
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
(funktioniert nur unter Windows)

Re: ContainerGadget wird nicht angezeigt

Verfasst: 04.09.2019 12:38
von Mijikai
ResizeGadget() sollte ein Repaint triggern.

Re: ContainerGadget wird nicht angezeigt

Verfasst: 04.09.2019 12:38
von mk-soft
Hallo Michael,

- Bitte ein lauffähiges Code rein stellen. Ersten Beitrag kannst du editieren.
- Welche OS und welche PB version?
- Schau mal nach HideGadget

Re: ContainerGadget wird nicht angezeigt

Verfasst: 04.09.2019 12:41
von mk-soft
@RSBasic

Bitte erwähne das ändern von Gadgets mit Threads Nur Unter Windows funktioniert.

Re: ContainerGadget wird nicht angezeigt

Verfasst: 04.09.2019 12:44
von RSBasic
Mijikai hat geschrieben:ResizeGadget() sollte ein Repaint triggern.
Das klappt leider nicht. Auch nicht mit ResizeWindow(). Funktioniert anscheinend nur, wenn man direkt (unter Windows) die WinAPI-Funktion nutzt.

@mk-soft
Okay, habe ich hinzugefügt.

Re: ContainerGadget wird nicht angezeigt

Verfasst: 04.09.2019 12:51
von Mijikai
RSBasic hat geschrieben:... Funktioniert anscheinend nur, wenn man direkt (unter Windows) die WinAPI-Funktion nutzt.

@mk-soft
Okay, habe ich hinzugefügt.
Das überrascht mich :?

Liegt das am ContainerGadget?
In meinem ProgressBar Modul (hier im Forum) benutze ich Resize um alle Element zu Updaten und hatte noch nie Probleme damit.
Hab damals Resize verwendet da dies der einzige Weg war die Progressbar auf allen OS korrekt darzustellen...

Re: ContainerGadget wird nicht angezeigt

Verfasst: 04.09.2019 12:55
von RSBasic
Liegt vielleicht daran, dass es kein Standard-Window Control ist, sondern ein selbst erstelltes. Klassenname lautet PureContainer.

Re: ContainerGadget wird nicht angezeigt

Verfasst: 04.09.2019 12:56
von Mijikai
RSBasic hat geschrieben:Liegt vielleicht daran, dass es kein Standard-Window Control ist, sondern ein selbst erstelltes. Klassenname lautet PureContainer.
Das könnte sein, gut zu wissen.

Re: ContainerGadget wird nicht angezeigt

Verfasst: 04.09.2019 13:59
von Michael(362)
Vielen Dank für die Antworten.

@RSBasic
Ich habe vergessen, daß in die Schleife noch ein Prozedur-Aufruf gehört, in dem die Dateien verarbeitet werden.
Hab ich jetzt geändert.

Das Problem habe ich gelöst, in dem ich das ContainerGadget mit der ProgressBar in einem eigenen Fenster laufen lasse.

Trotzdem vielen Dank für die Antwort.
Gruß Michael