2010-10-01 5 views
2

J'ai un formulaire Delphi avec TImages dessus. En fait, c'est un "faux" bureau avec des "icônes" (les TImages).Repositionnement proportionnel des images sur FormResize

Lorsque l'utilisateur redimensionne le formulaire (l'agrandit ou le maximise, par exemple), les icônes du formulaire doivent être alignées proportionnellement.

En ce moment, je fais quelque chose comme ça avec les images:

ImageX.Left:=Round(ImageX.Left * (Width/OldWidth)); 
ImageX.Top:=Round(ImageX.Top * (Height/OldHeight)); 

Maintenant, c'est OK, tant que je commence à faire la forme maximisé plus petit.

Dans ce cas, les images les plus à droite sont partiellement coupées par la bordure du formulaire (elles ne sont pas dans la zone client du formulaire).

Si je repositionne ces images pour les adapter à la zone client, la position des icônes est déformée lors du redimensionnement à la taille maximale.

Des idées pour un meilleur algorithme/correctif?

Merci!

+0

Je pense que vous manquez de publier des informations précieuses pour vous aider à atteindre votre objectif. Par exemple, les icônes sont organisées en lignes/colonnes bien définies ou flottent-elles n'importe où dans le formulaire? Voulez-vous empêcher le chevauchement des icônes? – jachguate

Répondre

5

Tout d'abord, vous ne pouvez pas avoir un bureau mis à l'échelle correctement lorsque vous ne déplacer les images, et ne échelle eux aussi. Vous pouvez faire un peu mieux en déplaçant les mi-points de vos images, pas leur coin supérieur gauche. Ce ne sera toujours pas parfait, mais ça marchera mieux. Bien sûr, maintenant les images seront rognées sur tous quatre côtés, non seulement en bas et à droite, mais au moins il sera symétrique :-)

Deuxièmement, vous obtiendrez des erreurs d'arrondi puisque vous substituez accumulative constamment le " "valeurs originales" (coordonnées supérieure et gauche d'ImageX). Il vaudrait mieux que les valeurs d'origine soient stockées dans une sorte de collection ou de tableau, et que vous définissiez la nouvelle position en fonction de la valeur d'origine, plutôt que de la valeur précédente.

Quelque chose comme ceci:

ImageX.Left:=Round(ImageX_OriginalLeft * (Width/Original_Width)); 
Questions connexes