ContainerGadget wird nicht angezeigt

Anfängerfragen zum Programmieren mit PureBasic.
Michael(362)
Beiträge: 16
Registriert: 28.07.2019 12:51

ContainerGadget wird nicht angezeigt

Beitrag 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
Zuletzt geändert von Michael(362) am 04.09.2019 14:00, insgesamt 1-mal geändert.
PureBasic 5.72 LTS (Windows - x86)
Windows 10 x86
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ContainerGadget wird nicht angezeigt

Beitrag 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)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ContainerGadget wird nicht angezeigt

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ContainerGadget wird nicht angezeigt

Beitrag von mk-soft »

@RSBasic

Bitte erwähne das ändern von Gadgets mit Threads Nur Unter Windows funktioniert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ContainerGadget wird nicht angezeigt

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: ContainerGadget wird nicht angezeigt

Beitrag 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...
Zuletzt geändert von Mijikai am 04.09.2019 12:55, insgesamt 1-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ContainerGadget wird nicht angezeigt

Beitrag von RSBasic »

Liegt vielleicht daran, dass es kein Standard-Window Control ist, sondern ein selbst erstelltes. Klassenname lautet PureContainer.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: ContainerGadget wird nicht angezeigt

Beitrag 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.
Michael(362)
Beiträge: 16
Registriert: 28.07.2019 12:51

Re: ContainerGadget wird nicht angezeigt

Beitrag 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
PureBasic 5.72 LTS (Windows - x86)
Windows 10 x86
Antworten