ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Message 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" ?
 
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Message 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.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Message 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 ? 🤔 😕
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Message 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.
Dernière modification par Mesa le mer. 31/janv./2024 9:57, modifié 2 fois.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Message 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 ?
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Message par Mesa »

Parfois W11 fait des trucs bizarre de ce type.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Message 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é.
Avatar de l’utilisateur
Mindphazer
Messages : 694
Inscription : mer. 24/août/2005 10:42

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Message 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:
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: ScrollAreaGadget & #PB_ScrollArea_InnerHeight

Message 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:
Répondre