Page 1 sur 1

ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Publié : mar. 30/janv./2024 2:10
par boddhi
Salut,

Je suis confronté à un problème que je n'arrive pas à résoudre malgré plusieurs approches.

Je réalise une appli dont le but est de créer une liste des polices du dossier système Windows\Fonts ou tout autre dossier et d'afficher un aperçu de chacune d'elle dans un ScrollAreaGadget. Pour cela, je créé, pour chaque fonte, une image avec sa représentation graphique que j'affiche au fur et à mesure dans le ScrollAreaGadget à l'aide d'un ImageGadget placé juste en dessous du précédent.

Mon problème est qu'à un certain moment la valeur de l'ordonnée utilisée pour positionner l'ImageGadget semble se figer comme l'illustre l'image ci-dessous :
Image
 
Bien évidemment, j'ai vérifié le typage des variables utilisées qui est de type Long, donc suffisant en terme de plage de valeurs.
Ici, un bout du code, situé immédiatement à la fin de la boucle de traitement, qui me permet de vérifier cela :

Code : Tout sélectionner

          Debug "PositionY finale : "+DonneesGadget\PositionY
          Debug "PositionY finale à l'échelle : "+Str(DonneesGadget\PositionY/FacteurEchelleY)
          ; Méthode 1
          ;SetGadgetAttribute(#GAD_FP_ZD_GALERIE,#PB_ScrollArea_InnerHeight,DonneesGadget\PositionY/FacteurEchelleY)
          ; Méthode 2
          Protected.l ValeurX=DonneesGadget\PositionY/FacteurEchelleY
          SetGadgetAttribute(#GAD_FP_ZD_GALERIE,#PB_ScrollArea_InnerHeight,ValeurX)
          ;
          Debug "Hauteur finale innerheight : "+GetGadgetAttribute(#GAD_FP_ZD_GALERIE,#PB_ScrollArea_InnerHeight)
 
Et maintenant, une partie du résultat de la progression incrémentielle et de la valeur des données finales :
Image
 
On constate que la valeur finale de la variable permettant de déterminer la hauteur interne nécessaire à l'affichage total (qui sera utilisée pour #PB_ScrollArea_InnerHeight), ici calculée à 63710 et 50968 avec mise à l'échelle DPI, est cohérente.
Or, après affectation de cette valeur via SetGadgetAttribute(), quand je récupère ladite valeur via GetGadgetAttribute(), elle ne correspond absolument pas.
Ce phénomène ne se produit pas pour un nombre plus faible d'ImageGadget().
 
Toutefois, j'ai fait d'autres tests où, par exemple, je créé un ScrollAreaGadget avec une hauteur interne de 100 000 pixels, pas de souci, un autre avec plus de 3 000 ImageGadget, pas de souci non plus d'où mon incompréhension totale dans les comportements et résultats exposés plus haut.

Quelqu'un aurait-il une idée de ce qui peut causer de "dysfonctionnement" ?
 

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Publié : mar. 30/janv./2024 10:28
par Mesa
J'ai trouvé ça dans mes archives.

Code : Tout sélectionner

; Win OS - Workaround sample for removing the 32k size Limit on the ScrollAreaGadget - First testversion d19 m07 y2017
; Author Werner Albus - www.nachtoptik.de - www.quick-aes-256.de

#ImageHeight=200 ; Change you the height, you must change also the pre defined offset, it's simple

#AmountCanvas=4000

Global Dim y_pos_canvas(#AmountCanvas)

Procedure BindScrollDatas()
	yy=-(#ImageHeight+10)
	offset.f=0.0070042*#AmountCanvas ; Pre defined offset for max 9000 canvas, changeable
	min=#AmountCanvas*(#ImageHeight+10)
	
	If min<=GadgetHeight(0)
		DisableGadget(0, 1)
	Else
		short_loop_1:
		If y_pos_canvas(#AmountCanvas)-GetGadgetAttribute(0, #PB_ScrollArea_Y)*offset<GadgetHeight(0)-10 And min>GadgetHeight(0)
			offset-0.00001
				Goto short_loop_1
		EndIf
		For a=1 To #AmountCanvas
			yy+(#ImageHeight+10)
			scroll_offset.f=GetGadgetAttribute(0, #PB_ScrollArea_Y)*offset
			If y_pos_canvas(a)-(#ImageHeight+10)-scroll_offset<GadgetHeight(0) And  y_pos_canvas(a)-(#ImageHeight+10)-scroll_offset>-(#ImageHeight+10)
				HideGadget(5+a, 0)
				ResizeGadget(5+a, #PB_Ignore, yy-scroll_offset+10, #PB_Ignore, #PB_Ignore)
			Else
				HideGadget(5+a, 1)
			EndIf
		Next
		DisableGadget(0, 0)
	EndIf 
	
EndProcedure

If OpenWindow(0, 0, 0, 363, 700, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	ScrollAreaGadget(0, 331, 10, 21, 680, 0, 0, 1500/#AmountCanvas+1, #PB_Container_Single)
	CloseGadgetList()
	ContainerGadget(#PB_Any, 10, 10, 325, GadgetHeight(0), #PB_Container_Double)
	
	y=10 
	For a=1 To #AmountCanvas
		CreateImage(1, Random(300, 100), #ImageHeight)
		drawX=ImageWidth(1)
		If StartDrawing(ImageOutput(1))
			drawY=0
			For x=0 To drawX Step 10
				RoundBox(x, drawY, drawX-2*x, #ImageHeight-2*drawY, 20, 20, RGB(Random(255), Random(255), Random(255)))
				drawY+10 
			Next x
			DrawText(10, 10, "Image "+Str(a))
			StopDrawing() 
		EndIf
		CanvasGadget(5+a, 10+(300-drawX)/2, y, drawX, #ImageHeight)  : y+#ImageHeight+10
		y_pos_canvas(a)=y
		SetGadgetAttribute(5+a, #PB_Canvas_Image, ImageID(1))
		While WindowEvent() : Wend
	Next

	SetGadgetAttribute(0, #PB_ScrollArea_InnerHeight, 30759-100000/#AmountCanvas)
	
	BindGadgetEvent(0, @BindScrollDatas())
	
	Repeat
		Select WaitWindowEvent()
			Case  #PB_Event_CloseWindow
				End
			Case  #PB_Event_Gadget
				Select EventGadget()
				EndSelect
		EndSelect
	ForEver
EndIf

M.

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Publié : mar. 30/janv./2024 19:36
par boddhi
Salut Mesa
Mesa a écrit : J'ai trouvé ça dans mes archives.
Merci pour ton code :wink:

Toutefois, il semble souffrir du même problème :
Image

On constate :
• Qu'au défilement le plus bas, la totalité des CanvasGadget n'est pas affichée, Ici, 3410 au lieu de 4000
• Que, tout comme dans mon code, la valeur finale retournée par #PB_ScrollArea_InnerHeight est "bloquée" à 26214 ! 8O

Est-ce un bug, une limitation, un mauvais paramétrage de je ne sais quoi ? 🤔 😕

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Publié : mer. 31/janv./2024 9:13
par Mesa
J'ai testé mon code sur windows 10 64b avec pb6.10 x64 et x86 ainsi que sur windows xp 32b pb 6.03 x86 et tout fonctionne bien, les 4000 images sont affichées.

As-tu Windows 11 ?

[AJOUT]
J'ai comme limite 30734 et la limite absolue est de 32767 qui est une limite de Windows.
voir ici https://www.purebasic.fr/english/viewto ... 13&t=42202

Donc 4000 images de 200+10 pixels de hauts = 840 000, très très supérieur à 32767...
Il faut ruser :D

M.

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Publié : mer. 31/janv./2024 9:24
par boddhi
Mesa a écrit : J'ai testé mon code sur windows 10 64b avec pb6.10 x64 et x86 ainsi que sur windows xp 32b pb 6.03 x86 et tout fonctionne bien, les 4000 images sont affichées.
As-tu Windows 11 ?
Non, faute de chipset compatible.
Tous les tests (mon code et celui que tu m'as proposé) ont été exécutés sous WIN10 x64 & PB6.10b4 x64.
Pourquoi évoquer WIN11 ?

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Publié : mer. 31/janv./2024 9:58
par Mesa
Parfois W11 fait des trucs bizarre de ce type.

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Publié : jeu. 01/févr./2024 10:27
par boddhi
Salut,
Pierre53 a écrit : Vérifiez si il y a des limites sur le nombre d'éléments ou la taille totale que peut gérer ScrollAreaGadget.
Il y a effectivement une limite de 32767 ((2^16)-1) pixels.
Aussi, envisagez de réutiliser les ImageGadgets au lieu d'en créer de nouveaux pour chaque police, ou de charger les images de manière dynamique au fur et à mesure du défilement
C'est, hélas, la solution vers laquelle je vais devoir me tourner et gérer des contraintes dont je me serais bien passé.

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Publié : jeu. 01/févr./2024 13:29
par Mindphazer
La réponse formulée par ce Pierre53 ressemble furieusement à une réponse générée par ChatGPT :mrgreen:
J'ai copié-collé ton premier post dans chatGPT, j'ai eu une très belle réponse qui avait beaucoup de similitudes avec celle de notre ami...
Tu devrais essayer, juste pour le fun :wink:

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Publié : jeu. 01/févr./2024 14:30
par boddhi
Mindphazer a écrit : La réponse formulée par ce Pierre53 ressemble furieusement à une réponse générée par ChatGPT :mrgreen:
J'ai copié-collé ton premier post dans chatGPT, j'ai eu une très belle réponse qui avait beaucoup de similitudes avec celle de notre ami...
Tu devrais essayer, juste pour le fun :wink:
8O
Bien vu :wink:
Je t'avoue que je m'étais interrogé sur le fait que c'était son premier post mais, pour être très honnête, j'ai pumpé comme ça aussi sur le forum, il y a 14 ans, alors cela faisait déjà 6 ans que je le suivais en mode fantôme... :mrgreen:

@Pierre53
Cher Pierre, si vous n'êtes pas un bot, merci d'avoir pris de votre temps pour m'apporter cette réponse quand bien même elle n'a été d'aucune pertinence technique si ce n'est confirmer ce dont j'avais déjà fait le constat :wink: