Bonjour,
J'ai créé un composant dérivé de TPaintBox et je voudrais lui imposer une contrainte sur la taille, à savoir un ratio hauteur largeur constant en mode création de fiche.
Est ce possible et si oui comment ?
Merci.
Version imprimable
Bonjour,
J'ai créé un composant dérivé de TPaintBox et je voudrais lui imposer une contrainte sur la taille, à savoir un ratio hauteur largeur constant en mode création de fiche.
Est ce possible et si oui comment ?
Merci.
ne rend modifiable qu'une des deux, et dans sa méthode write, modifie les deux (sur l'autre, pas de write dans la propriété)
Pour savoir si tu es en mode conception, je crois que c'est la propriété ComponentState
Désolé mais je n'arrive pas à faire ce que je souhaite :
quand je dépose le composant sur ma fiche en conception, faire en sorte que la largeur soit automatiquement égale à la hauteur (par exemple).
Puis je avoir un peu plus de précision sur la manière de faire svp.
Salut
C'est cela même! :lol:Citation:
Envoyé par gord's
Alors, dans la clause published de ton TPaintBox, tu mets
Puis tu fais Ctrl+C, pour créer ce qui manque :wink:Code:
1
2 property Width:integer read FWidth write SetWidth;
Dans ta procedure SetWidth, tu mets :
Une autre solution serait de surcharger la procedure appelé par le composant (ou plutot un de ses ancêtre), un truc comme SetBounds ou SetSize et de la refaire en ne prenant en compte que la hauteur ou la largeur et calculer l'autre en fonction...Code:
1
2
3
4
5
6
7
8
9 procedure TMachin.SetWidth(Value:integer); begin if Value<>FWidth then //Ca 'tes pas obligé, c'est juste pour tester begin Width:=Value; Height:=Value; end; end;
Bonne chance
Merci de l'aide mais je n'y arrive toujours pas.
Quand je compile le programme, il semble boucler sur
(je fais en pas à pas et si je l'exécute j'ai une "access violation ....").Code:
1
2width := 50
Si je met :
avant cette instruction, alors il n'y passe pas (c'est déjà un point positif!), mais je n'ai rien qui se passe en mode créationCode:
1
2 if componentstate = [csDesigning] then
ie : Width = 50 dans l'inspecteur d'objet n'entraine pas Height = 50.
Des suggestions ?[
Je sais pourquoi :), mais je ne sais pas comment faire pour résoudre le problème :lol:. En fait, quand tu fais
tu appelle la méthode SetWidth qui elle faitCode:Width := 50;
Mais ceci appelle de nouveau SetWidth :D :!:Code:Width := Value;
:arrow: Essaie d'écrire ceci dans le SetWidth :
Mais vraiment, ça m'étonnerait que ça fonctionne :wink:.Code:inherited Width := Value;
Inherited ne fait pas de mal, ca évite la boucle.
Mais je n'ai toujours pas le comportement espéré en mode création et le height n'est pas pris en compte en run time !
D'autres suggestions ?
et en mettantça le ferait pas ?Code:
1
2 inherited height := inherited width;
Ca ne fait rien.
Une autre suggestion ?? :cry:
Refais la même chose pour Height que pour Width et peut-être que ça fonctionnera mieux en tout cas pour le mode conception.
Un des gourous du site pourrait il me dire si ce que je veux faire est possible ou non ?
Imposer la taille d'un composant en mode conception
Quand je fais ca :
j'ai bien le message quand je pose le composant sur la fiche.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 constructor TComp.Create(AOwner: TComponent); var rect : trect; begin //inherited Create(AOwner); inherited; if (csDesigning in ComponentState) then // si on est en mode conception begin ShowMessage('mode conception') ; width := height; end else ShowMessage('mode exécution'); end;
Mais si j'y met :
il ne se passe rien.Code:
1
2 width := height:
Merci
Salut
essaye de surcharger SetWidth ou même SetSize!! Ce sera d'ailleurs un peu plus propre!!
Bonne chance
dans ton composant au lieu de changer la width change Fwidth... tu accède directement au champs privé, pas besoin de passer par un accesseur la!
et en plus c'est pas dans le constructeur que tu dois faire ca mais dans le SetWidthCode:
1
2
3
4
5
6
7
8
9
10
11
12
13 constructor TComp.Create(AOwner: TComponent); var rect : trect; begin //inherited Create(AOwner); inherited; if (csDesigning in ComponentState) then // si on est en mode conception begin ShowMessage('mode conception') ; Fwidth := Fheight; // c'est ici que ca boucle a l'infini end else ShowMessage('mode exécution'); end;
Merci pour votre aide à tous. Ca m'a mis sur la voie plus ceci :
Components Based on TCustomControl
If a component is created from TCustomControl, then the Paint method is called at both design time and at run time, and you must draw the control yourself.
Donc j'ai mis pour ce que cela interesse :
Et ca suffit à mon bonheur. :lol:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 public constructor Create(AOwner: TComponent); override; procedure Paint; override; .... procedure TComp.paint(); begin if fratio = 0 then fratio := 1.65; Inherited SetBounds(Left,Top,width,round(fratio*width)); ...
:wink: