[gelöst] Resize in PureVision

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Qnode
Beiträge: 85
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

[gelöst] Resize in PureVision

Beitrag von Qnode »

Hey,

ich benutze PureVision und habe damit ein Problem bei Resize-Operationen. Das entsprechende Modul hat nach meiner Recherche übrigens jemand aus unserem Forum geschrieben, aber ich weiß nicht ob dieses Mitglied geoutet werden will 8) .
Jedenfalls der Code, den ich benutze, ist ziemlich lang und nicht gerade selbsterklärend (ist ja auch Hobbyisten-Code). Deswegen versuche ich mein Problem erstmal allgemein zu beschreiben.

In meinem Hauptfenster habe ich eine Scrollarea, die ich in PV zum automatischen Resize angemeldet habe, wenn sich die Fenstergröße ändert. Klappt auch tadellos.

Diese Scrollarea befülle ich dynamisch mit Gadgets (via OpenGadgetList, CloseGadgetList). Klappt auch prima. Aber die Gadgets werden nicht automatisch in der Größe angepasst, wenn sich die Fenstergröße ändert. Hängt anscheinend damit zusammen, dass ich die Gadgetbreite beim Erstellen von der Innerwidth der Scrollarea abhängig mache.

Aber ich kapiere nicht, wie ich die Gadgets an einen Resize der Scrollarea anbinden kann, weil ich nicht verstehe, wie PV arbeitet. Denn ich wollte die Gadgets per BindEvent an eine Resizefunktion ranhängen, die sich die aktuelle Innerwidth nimmt und danach die neue Breite der Gadgets berechnet (analog dann mit der Höhe verfahren). Nun ist nach meinen Experimenten aber das Problem, dass PV bei Größenänderungen die Innerwidth gar nicht verändert, sondern die Vergrößerung irgendwie anders realisiert (Veränderung der Auflösung oder sowas???). Somit kann ich nicht auf eine Veränderung der Scrollarea reagieren.
Hat einer eine Idee? Ich habe für meine dynamischen Gadgets eine Liste zu laufen, damit ich später wieder an sie rankomme. Aber ich weiß nicht, wie ich sie an die PV-Resize-Logik anbinden kann.
Zuletzt geändert von Qnode am 18.04.2024 09:14, insgesamt 1-mal geändert.
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: Resize in PureVision

Beitrag von Axolotl »

Hi, ich kenne PureVision nicht, versuche mich aber mal mit einer vorsichtig formulierten Idee.
Das ScrollAreaGadget kennt zwei Eventtype() 'n
Eventtype 0 -> für scrolling
Eventtype 6 -> wenn die Größe verändert wird, auch bekannt als #PB_EventType_Resize
Vermutung: Vielleicht reagiert der Code nicht auf das "Resize" Event?
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
Qnode
Beiträge: 85
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

Re: Resize in PureVision

Beitrag von Qnode »

Hey,
vielen Dank für die Antwort. Ich habe jetzt mal folgendes getestet:
Ich habe diese Prozedur erstellt

Code: Alles auswählen

Procedure resizeHauptformular()
  Debug GetGadgetAttribute(#Gadget_frmHauptformular_saHauptanzeige, #PB_ScrollArea_InnerWidth)  
EndProcedure
und sie in meine Eventschleife eingebunden:

Code: Alles auswählen

...
Case #PB_Event_SizeWindow
    If WindowID = #Window_frmHauptformular
          resizeHauptformular()
    EndIf
...
Die Prozedur wird auch bei Änderung der Fenstergröße aufgerufen. Ich bekomme folgendes Ergebnis:
600
600
600
600
600
Und das obwohl sich die Scrollarea auf dem Bildschirm zusammen mit dem Fenster verbreitert. Intern verändert sich die innere Größe aber offenkundig nicht. Oder habe ich da ein digitales Brett vor dem Kopf?
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: Resize in PureVision

Beitrag von jacdelad »

@Axolotl: Ich kann jetzt gerade nicht an meinen Rechner, aber bist du sicher, dass es einen EventType mit dem Wert 0 gibt? Das glaube ich eher nicht. Außerdem steht in der Hilfe nur was von Resize und keine weiteren Events.
@QNode: Wie gesagt, bin gerade nicht am Rechner, aber soweit ich das verstanden habe behält das ScrollAreaGadget seine Größe und man kann dann eben hin- und herscrollen.
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: Resize in PureVision

Beitrag von Axolotl »

jacdelad hat geschrieben: 15.04.2024 17:19 @Axolotl: Ich kann jetzt gerade nicht an meinen Rechner, aber bist du sicher, dass es einen EventType mit dem Wert 0 gibt? Das glaube ich eher nicht. Außerdem steht in der Hilfe nur was von Resize und keine weiteren Events.
Nun ja, ich habe es ausprobiert und die Ausgabe von Debug war bei mir so, wie ich es beschrieben habe...
Hilfe habe ich (wie immer) auch gelesen. Vielleicht ist der Wert aber auch nicht wirklich relevant, da er ja nur beim Betätigen der Scrollleisten auftritt.
Und grundsätzlich gibt es diesen hier:

Code: Alles auswählen

Debug #PB_EventType_LeftClick 


Und zum probieren....

Code: Alles auswählen

  Procedure BindScrollDatas()
Debug #PB_Compiler_Procedure 
;     SetWindowTitle(0, "ScrollAreaGadget " +
;                       "(" +
;                       GetGadgetAttribute(0, #PB_ScrollArea_X) +
;                       "," +                      
;                       GetGadgetAttribute(0, #PB_ScrollArea_Y) +
;                       ")" )
  EndProcedure
  
  If OpenWindow(0, 0, 0, 405, 240, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered| #PB_Window_SizeGadget)
    ScrollAreaGadget(0, 10, 10, 390,220, 575, 555, 30)
      ButtonGadget  (1, 10, 10, 230, 30,"Button 1")
      ButtonGadget  (2, 50, 50, 230, 30,"Button 2")
      ButtonGadget  (3, 90, 90, 230, 30,"Button 3")
      TextGadget    (4,130,130, 230, 20,"This is the content of a ScrollAreaGadget!",#PB_Text_Right)
      CloseGadgetList()
  
    BindGadgetEvent(0, @ BindScrollDatas())
  
    Repeat
      Select WaitWindowEvent()
        Case  #PB_Event_CloseWindow
          End
        Case #PB_Event_SizeWindow 
          ResizeGadget(0, #PB_Ignore, #PB_Ignore, WindowWidth(0)-20, WindowHeight(0)-20) 
Debug "MAIN  #PB_Event_SizeWindow  " 

        Case  #PB_Event_Gadget
          Select EventGadget()
            Case 0
Debug "MAIN #PB_Event_Gadget " + GetGadgetAttribute(0, #PB_ScrollArea_X) + "," + GetGadgetAttribute(0, #PB_ScrollArea_Y) 
Debug "     #PB_Event_Gadget " + EventType() 
Debug "     #PB_Event_Gadget " + GadgetWidth(0) + ", " + GadgetHeight(0) 
            Case 1
              MessageRequester("Info","Button 1 was pressed!",#PB_MessageRequester_Ok)
            Case 2
              MessageRequester("Info","Button 2 was pressed!",#PB_MessageRequester_Ok)
            Case 3
              MessageRequester("Info","Button 3 was pressed!",#PB_MessageRequester_Ok)
          EndSelect
      EndSelect
    ForEver
  EndIf
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
Qnode
Beiträge: 85
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

Re: Resize in PureVision

Beitrag von Qnode »

Hi,

ich glaube, dass ich allmählich meinem Denkfehler auf die Spur komme. Ich habe mal folgendes probiert:

Code: Alles auswählen

Procedure resizeHauptformular()
  Debug "Innenbreite Scrollarea: " + GetGadgetAttribute(#Gadget_frmHauptformular_saHauptanzeige, #PB_ScrollArea_InnerWidth)  
  Debug "Breite Fenster: " + WindowWidth(#Window_frmHauptformular)
EndProcedure
Und kriege folgendes dabei raus:
Innenbreite Scrollarea: 600
Breite Fenster: 1357
Innenbreite Scrollarea: 600
Breite Fenster: 1357
Innenbreite Scrollarea: 600
Breite Fenster: 1357
Ich dachte bisher, wenn ich eine Fenstergröße verändere, dass das Fenster dann in der entsprechenden Dimension einfach mehr Pixel bekommt. Tatsächlich funktioniert das aber offenbar anders, denn die Größenveränderung wirkt sich nicht auf die Pixelanzahl aus. Ich weiß aber nicht, ob das etwas Windows-, Purebasic- oder PureVision-Spezifisches ist.

Wenn ich also auf ein Fenster-Resize reagieren will, dann muss ich irgendwie anders herausbekommen, um wieviel sich die Fensterdimensionen verändert haben. Kann mir dabei vielleicht jemand helfen?
Benutzeravatar
Qnode
Beiträge: 85
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

Re: Resize in PureVision

Beitrag von Qnode »

Zum Verständnis, welchen Effekt ich momentan habe, anbei zwei Bilder: das erste Bild zeigt das Hauptfenster, wenn es frisch geöffnet wurde. Alle Gadgets sind auf diese Größe hin angepasst. Das zweite Bild zeigt zeigt den Zustand, wie die dynamisch erzeugten Gadgets aussehen, wenn sich alles vergrößert, nur sie nicht. Wie kriege ich das hin, dass sie sich auch anpassen? Ich komme da echt nicht weiter und habe schon diverses ausprobiert bevor ich hier geschrieben habe. Ein Trick war, die InnerWidth der Scrollarea einfach deutlich größer zu machen, als sie in der ursprünglichen Größe gebraucht wird. Leider klappt das nicht immer und auch da verstehe ich die Logik nicht...
Bild
Bild
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: Resize in PureVision

Beitrag von jacdelad »

Die Größe eine jeden Gadgets bekommst du mit GadgetWidth(). Das ist die Breite, die das Gadget auf dem Bildschirm einnimmt. Mit GetGadgetAttribute bekommst du die Größe des nutzbaren Bereichs des ScrollAreaGadgets. Das heißt, dass du den Bereich festlegst und das ScrollAreaGadget dann automatisch Scrollbalken anzeigt, wenn seine eigene Größe kleiner als dieser Bereich ist.
Ich muss mir dann auf Arbeit mal alles hier in Ruhe durchlesen, war nur mitm Handy dabei. So wie ich es verstanden habe geht es dir darum die tatsächliche Breite des Gadgets zu manipulieren, nicht den Zeichenbereich?
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Benutzeravatar
Qnode
Beiträge: 85
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

Re: Resize in PureVision

Beitrag von Qnode »

Danke für die ganze Hilfe. Mein Ziel ist es eigentlich, dass die Gadgets den Bereich der Scrollarea ausfüllen und das tun sie nicht mehr, wenn ich das Fenster vergrößere und damit auch die Scrollarea, also der Container der Gadgets, der sich mitvergrößert (siehe zweites Bild, das ich gepostet habe). Die Scrollarea passt sich automatisch bei Fensterveränderungen an, weil ich das in PureVision so definieren kann, da gibt es ein Resizemodul, welches sich darum kümmert.
Die tatsächliche Breite der Gadgets versuche ich nur zu manipulieren, weil sie sich halt nicht automatisch an ihren Container anpassen. Wenn ich das irgendwie bei ihrer Erstellung einstellen könnte, dann wäre das noch die viel bessere Lösung. Aber ich weiß nicht, wie das gehen könnte, also frickel ich mit den tatsächlichen Breiten der Gadgets rum.
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: Resize in PureVision

Beitrag von jacdelad »

Sorry, falls ich mich jetzt total brettern anstelle: Du willst, dass die Gadgets im ScrollArea immer den kompletten Bereich des ScrollAreaGadgets ausfüllen (ohne scrollen?)? Wenn ich das richtig verstanden habe, dann solltest du die Dialog-Library nutzen. Dort resizen und platzieren sich die Gadgets "von selbst". Die Erstellung der Fenster läuft über XML, das ist gewöhnungsbedürftig. Ich selbst benutze quasi nur noch die Dialog-Library (die aber auch einige Nachteile hat).
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Antworten