IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Imposer une taille à un composant en conception


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 43
    Points : 45
    Points
    45
    Par défaut Imposer une taille à un composant en conception
    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.

  2. #2
    Membre habitué Avatar de gord's
    Inscrit en
    Avril 2003
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 115
    Points : 127
    Points
    127
    Par défaut
    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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 43
    Points : 45
    Points
    45
    Par défaut
    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.

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut

    Citation Envoyé par gord's
    Pour savoir si tu es en mode conception, je crois que c'est la propriété ComponentState
    C'est cela même!

    Alors, dans la clause published de ton TPaintBox, tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      property Width:integer read FWidth write SetWidth;
    Puis tu fais Ctrl+C, pour créer ce qui manque

    Dans ta procedure SetWidth, tu mets :
    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;
    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...

    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

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 43
    Points : 45
    Points
    45
    Par défaut
    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 ....").

    Si je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if componentstate = [csDesigning] then
    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
    ie : Width = 50 dans l'inspecteur d'objet n'entraine pas Height = 50.

    Des suggestions ?[

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    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
    Mais ceci appelle de nouveau SetWidth
    Essaie d'écrire ceci dans le SetWidth :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inherited Width := Value;
    Mais vraiment, ça m'étonnerait que ça fonctionne .
    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.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 43
    Points : 45
    Points
    45
    Par défaut
    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 ?

  8. #8
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    et en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inherited height := inherited width;
    ça le ferait pas ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 43
    Points : 45
    Points
    45
    Par défaut
    Ca ne fait rien.


    Une autre suggestion ??

  10. #10
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    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.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 43
    Points : 45
    Points
    45
    Par défaut
    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 :
    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;
    j'ai bien le message quand je pose le composant sur la fiche.

    Mais si j'y met :
    il ne se passe rien.

    Merci

  12. #12
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    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

  13. #13
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    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!
    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;
    et en plus c'est pas dans le constructeur que tu dois faire ca mais dans le SetWidth

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 43
    Points : 45
    Points
    45
    Par défaut
    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 :
    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));
    ...
    Et ca suffit à mon bonheur.

  15. #15
    Membre actif
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Points : 245
    Points
    245
    Par défaut
    De toutes les choses que j'ai perdue,
    Celle qui me manque le plus...
    c'est mon esprit !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vérifier une propriété d'un composant à la conception
    Par The Jos dans le forum Composants VCL
    Réponses: 4
    Dernier message: 27/11/2011, 16h23
  2. imposer une taille minimale pour la fenetre
    Par etud_ini dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/10/2008, 21h19
  3. creer un tableau sans lui imposer une taille max
    Par christianf dans le forum C#
    Réponses: 7
    Dernier message: 05/05/2008, 18h50
  4. Imposer une taille minimum à un JFrame
    Par Dagnir dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 06/05/2006, 12h51
  5. Debutant : Imposer la taille minimale d'une JFrame
    Par canigu dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 01/01/2006, 22h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo