TCYRESIZER BOUGER/REDIMENSIONNER VOS CONTROLS EN RUNTIME!
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 2014
-
13 mai 2005 à 17:55
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 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.
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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!!!
Il me reste à bosser 2 choses:
- le contrôle par le clavier
- le snap to grid
A+
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 10 août 2006 à 10:05
Salut Guillaume,
content que ça te plaise!!!
pas de nouvelle version pour le moment...
A+
ioda19
Messages postés21Date d'inscriptionjeudi 10 juin 2004StatutMembreDernière intervention20 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és20Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention19 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és2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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és20Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention19 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és2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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és65Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention16 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és4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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és2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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és10Date d'inscriptionlundi 14 novembre 2005StatutMembreDernière intervention27 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:
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és2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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és10Date d'inscriptionlundi 14 novembre 2005StatutMembreDernière intervention27 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és2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 20 juin 2005 à 10:27
Merci DelphiProg, j' avoue que j' attendais ton opinion avec bcp d' impatiente!
A+
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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és2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 18 mai 2005 à 18:30
Voilà, j' ai corrigé le bug !
EnJoY!!!
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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és2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 16 mai 2005 à 10:26
Merci Inekman, mais comme tu peux le voire, j' ai encore des améliorations à faire ...
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 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és2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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!
15 avril 2009 à 16:14
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+
10 août 2006 à 10:05
content que ça te plaise!!!
pas de nouvelle version pour le moment...
A+
9 août 2006 à 20:17
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
16 mars 2006 à 18:37
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
16 mars 2006 à 18:28
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+
16 mars 2006 à 16:46
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.
2 janv. 2006 à 14:42
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 !!!
31 déc. 2005 à 19:25
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 ;
30 déc. 2005 à 20:01
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...
30 déc. 2005 à 12:29
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+
30 déc. 2005 à 12:22
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?
30 déc. 2005 à 11:40
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 :)
30 déc. 2005 à 11:16
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.
20 juin 2005 à 10:27
A+
18 juin 2005 à 15:30
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.
18 mai 2005 à 18:30
EnJoY!!!
18 mai 2005 à 13:14
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 ...
16 mai 2005 à 10:26
13 mai 2005 à 19:41
Bravo pour le compo, intéressant ;-)
Inekman. 10/10.
13 mai 2005 à 17:55