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.
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
La prochaine révolution informatique : les machines qui font ce qu'on veut, au lieu de faire ce qu'on leur demande...
Grand Vizir du Grand Gourou - Trois-quart aile gauche du TRFC et intendant de 3ème mi-temps - Papy fait de la résistance
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!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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Pedro
Aucune réponse aux sollicitations techniques par MP
Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)
Les pages Source C'est bon. Mangez-en!
Le défi Delphi
Règles du forum - FAQ Delphi - Pensez au chtit
Aéroclub Bastia Saint-Exupéry
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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éation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 . En fait, quand tu fais
tu appelle la méthode SetWidth qui elle fait
Code : Sélectionner tout - Visualiser dans une fenêtre à part Width := 50;
Mais ceci appelle de nouveau SetWidth
Code : Sélectionner tout - Visualiser dans une fenêtre à part Width := Value;
Essaie d'écrire ceci dans le SetWidth :
Mais vraiment, ça m'étonnerait que ça fonctionne .
Code : Sélectionner tout - Visualiser dans une fenêtre à part inherited Width := Value;
sjrd, ancien rédacteur/modérateur Delphi.
Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
Découvrez Mes tutoriels.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 inherited height := inherited width;
Refais la même chose pour Height que pour Width et peut-être que ça fonctionnera mieux en tout cas pour le mode conception.
sjrd, ancien rédacteur/modérateur Delphi.
Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
Découvrez Mes tutoriels.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 width := height:
Merci
Salut
essaye de surcharger SetWidth ou même SetSize!! Ce sera d'ailleurs un peu plus propre!!
Bonne chance
Pedro
Aucune réponse aux sollicitations techniques par MP
Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)
Les pages Source C'est bon. Mangez-en!
Le défi Delphi
Règles du forum - FAQ Delphi - Pensez au chtit
Aéroclub Bastia Saint-Exupéry
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 SetWidth
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)); ...
De toutes les choses que j'ai perdue,
Celle qui me manque le plus...
c'est mon esprit !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager