TCYRESIZER BOUGER/REDIMENSIONNER VOS CONTROLS EN RUNTIME!

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 13 mai 2005 à 17:55
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 15 avril 2009 à 16:14
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31365-tcyresizer-bouger-redimensionner-vos-controls-en-runtime

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
15 avril 2009 à 16:14
Bonjour,

je vous invite à faire le download de mon pack de compos gratuits V2.03 qui contient une nouvelle version de mon TcyResizer. Il existe une démo qui contient le source et l' exe pour pouvoir tester avant d' installer.

Il est désormais possible de contrôler plusieurs compos en même temps avec 3 lignes de code, très simple à utiliser!!!

Site:
https://sourceforge.net/projects/tcycomponents/

Il me reste à bosser 2 choses:
- le contrôle par le clavier
- le snap to grid

A+
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
10 août 2006 à 10:05
Salut Guillaume,
content que ça te plaise!!!
pas de nouvelle version pour le moment...
A+
ioda19 Messages postés 21 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 20 juin 2007
9 août 2006 à 20:17
Salut,
ton control me sauve la vie. Il est vraiment super et marche vraiment bien. Juste une petite chose. Je voudrais savoir si tu as fais une mise à jour pour pouvoir sélectionner plus d'un control à la fois (avec le bouton ctrl), ça serais vraiment pratique. Mise à part ça, tout beigne.

Merci de me répondre au plus tôt.
Guillaume
Fred_Ca_Pulse Messages postés 20 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 19 juin 2008
16 mars 2006 à 18:37
Re MAURICIO

Non, c'est en activant la "Vérification des limites" pour le compilateur, que çà génère cette erreur, et uniquement sur TLabel.
Si la "Vérification des limites" est désactivée, pas d'erreur ... ce qui ne veut pas forcément dire code OK.
Je t'avourerai que j'ai pas testé plus loin pour trouver le problème.

C'est vrai que j'ai toujours cette manie de vérifier toutes les erreurs d'exécution ... au moins en phase de test.

Cordialement
FRED
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
16 mars 2006 à 18:28
Salut Fred_Ca_Pulse,
désolé mais je n' est pas d' erreur de ce genre ...
Comme personne n' a noté ce genre d' erreur, cela doit venir forcement de ton PC.
A+
Fred_Ca_Pulse Messages postés 20 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 19 juin 2008
16 mars 2006 à 16:46
Bonjour, ce composant m'a l'air super !

Mais j'ai un bug avec les TLabel de la démo d'origine :
"Erreur de vérification d'étendue" dans la procédure PAINT_OTHER_CONTROLS sur la ligne FControl.Perform(WM_PAINT, DC, 0)

Code compilé sous Delphi 7 et tournant sur XP.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
2 janv. 2006 à 14:42
Merci pour ces précisions DelphiProg.

Pou répondre à Assemple, je pense que pour la multisélection je vais créer un compo que je pourrai attribuer à mon TcyResizer. Ce compo aura une position/taille qui englobera les compos voulus. C' est la meilleure soluc car sinon on aurai des problèmes de visualisation en bougeant/redimensionant les compos.
La proprété est publiée pour la simple et bonne raison que je vois pas pourquoi et en plus, on peut attibuer un compo tout de suite. Sans compter qu' ainsi, il est plus facile d' utiliser le compo, on voit tout de suite la propriété interessante !!!
assemple Messages postés 65 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 16 décembre 2011
31 déc. 2005 à 19:25
Après avoir essayé le Drag'n'Drop d'IceBird je me suis précipité sur ton cyResizer, cher Mauricio !
Je ne sais trop quoi en dire (si ce ne sont les compliments déjà fait dans les autres commentaires) car pour la multisélection, il faut autant de cyResizer que de composants sélectionnés (mais est-ce que ça marche ?).
Pourquoi la propriété "Control" est-elle publiée ?
Ne serait-il pas plus simple, dans le cas de la gestion de sélection multiple, de définir une variable "Selectionnes" un tableau dynamique de contrôles (TControl), et dans l'évènement on paint de la fenêtre de dessiner les "poignées" :

Canvas.Brush.Style := bsClear ;
If Length(Selectionnes)=1
then Canvas.Pen.Color := clCouleurDimensionnement
// clCouleurDimensionnement : une couleur qui sera testée
// lors de l'évènement "OnMouseDown" décrit plus bas
// pour la distinguée des autres couleur
// par exemple clCouleurDimensionnement := 1
// aura l'apparence du Noir mais sera différente
// donc sera considérée comme issue d'un point de
// redimmensionnement par opposition à une sélection
// ou une déselection
else Canvas.Pen.Color := clGray ;
For I := 1 to Length(Selectionnes) do
Begin
// Bordure
Canvas.Rectangle(Selectionnes[I-1].left-1,
Selectionnes[I-1].Top-1,
Selectionnes[I-1].left+Selectionnes[I-1].Width+1,
Selectionnes[I-1].Top+Selectionnes[I-1].Height+1) ;
// Petit carré
Canvas.Brush.Color := Canvas.Pen.Color ;
Canvas.Rectangle( ... les 8 carrés ....
...
End ;

Dans OnMouseDown

...
If Canvas.Pixels[X,Y] = clCouleurDimensionnement then
Begin
Redimensionne := True ;
End Else
Begin
...
End ;

Et dans MouseMove
If Redimensionne then
Begin
DX := F(X) ;
DY := F(Y) ;
ResizeLaSelection(DX,DY) ;
End Else
Begin
... // autres
End ;

et MouseUp la ligne suivante suffit : (pour la partie resize)
Redimensionne := False ;
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 déc. 2005 à 20:01
Plus exactement, l'utilisation du mot clé default indique au compilateur de considérer toute autre valeur comme devant être enregistré dans les ressources. Comme l'a dit Mauricio, c'est pour économiser de la place et réduire la taille sur disque de l'exe.
Pour affecter une valeur initiale à une propriété il faut le faire dans le constructeur (en règle générale).

Pour la dernière question de IceBird, je ne vois pas trop non plus. A dire vrai, je n'ai pas cherché non plus...
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
30 déc. 2005 à 12:29
Pour la dernière, je vois pas trop non.

Par contre,
property MoveGrid: Byte read FMoveGrid write SetMoveGrid default 1
Default permet non pas de donner une valeur para défaut (on a tous cru ça au moins une fois!!!) mais permet de définir une valeur qui devrait être le plus souvent utilisée. Pourquoi faire? pour économiser de la place lors de la sauvegarde du projet !!! A+
Icebird Messages postés 10 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 27 décembre 2005
30 déc. 2005 à 12:22
Bon, j'ai commencé à modifier ton composant et j'ai ajouté deux propriétés: MoveGrid et ResizeGrid. Ca fonctionne plutot pas mal, et je bouge et redimensionne les composants selon deux grilles virtuelles.

Mais, j'ai deux soucis quand même:

Quand je pose un nouveau composant cyResizer sur la fiche, dans l'inspecteur d'objet la valeur par défaut de mes propriétés est toujours 0, malgré le fait d'avoir écrit ceci, qui semble correct:

property MoveGrid: Byte read FMoveGrid write SetMoveGrid default 1;
property ResizeGrid: Byte read FResizeGrid write SetResizeGrid default 1;

Ce qui est étonnant, c'est que la valeur est en gras, comme si c'etait une valeur modifiée. Si je met 1, alors ce n'est plus en gras, comme si c'etait la valeur par défaut.
Ce ne serait pas grave si çà ne causait pas une erreur de division par zero quand je teste avec 1!!!
En debug, je constate que la valeur que j'ai mis à 1 dans l'inspecteur d'objet est compté comme 0 par le composant!

Bon, en écrivant ce commentaire, j'ai pigé pourquoi çà faisait cela et j'ai corrigé, j'avais tout simplement oublié de rajouter l'initialisation des variables dans le constructeur.

....

Passons.

Bon, reste mon seconde souci: le redimensionnement vers le haut ou la gauche est considéré comme un mouvement, et là j'ai du mal, vu que çà prend alors ma valeur de MoveGrid au lieu de ResizeGrid. Une idée?
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
30 déc. 2005 à 11:40
Oui je comprends ce que tu veux faire ...
Mais c' est là que tu entres en jeu:
le compo est sous sa forme brute et possède les fonctionnalités de base.
Ensuite, c' est au programmeur de l' adapter à toutes les situations.
A+

PS: merci pour le commentaire :)
Icebird Messages postés 10 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 27 décembre 2005
30 déc. 2005 à 11:16
Ton composant est vraiment super!
Malheureusement, il n'offre pas la possibilité que je recherche, de pouvoir attacher les composants sur une grille.
Actuellement, quelqu'un qui veut se faire une interface en runtime aura bien des problèmes d'alignements des composants.
Un pixel par ci, deux pixels par là, et l'ensemble donnera l'impression de ne pas être très net.
D'où l'idée d'offrir un déplacement le long d'une grille virtuelle, similaire à l'interface delphi, pour pouvoir aligner facilement les composants.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
20 juin 2005 à 10:27
Merci DelphiProg, j' avoue que j' attendais ton opinion avec bcp d' impatiente!
A+
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 juin 2005 à 15:30
Voilà un composant qui brille par son originalité.
Le code est nickel, rien à redire à première vue.
Franchement, l'idée est géniale et la mise en oeuvre soignée.
Sans hésitation : 10/10.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
18 mai 2005 à 18:30
Voilà, j' ai corrigé le bug !
EnJoY!!!
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
18 mai 2005 à 13:14
Je viens de trouver une soluce pour les TGraphicControl qui d' ailleurs, fonctionne pour les TWinControl aussi:

FControl.Perform(WM_PAINT, GetDC(self.Handle), 0);
Ça va peindre FControl sur mon canvas mais il y a un Hic, il me peinds ça sur la position (0, 0).

Si quelqu' un a une soluce pour ce problème ...
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
16 mai 2005 à 10:26
Merci Inekman, mais comme tu peux le voire, j' ai encore des améliorations à faire ...
Inekman Messages postés 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 juin 2006
13 mai 2005 à 19:41
Même si je n'en n'ai pas l'utilité tout de suite, je trouve ce compo vachement bien didon. Ca y est, j'ai l'impression que t'as pris ton envol dans la création de compo, et ça va de mieux en mieux.

Bravo pour le compo, intéressant ;-)

Inekman. 10/10.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
13 mai 2005 à 17:55
Salut tout le monde, en ce qui concerne le petit bug d' affichage des compos héritant de TGraphicControl, il suffirait de rendre mon compo transparent, j' attends vos propositions les gars!
Rejoignez-nous