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

Lazarus Pascal Discussion :

aOwner dans les constructeurs de composants


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut aOwner dans les constructeurs de composants
    Bonjour,

    Un petit éclaircissement sur le constructeur des composants :

    Lorsqu'on définit constructor TmyComponent.Create(aOwner: TComponent), TmyComponent étant "posé" sur une Form ou un élément de celle-ci (TPanel,...), le aOwner "renvoyé" est-il systématiquement une TForm ? Sinon que peut-il être d'autre ?

    Merci. Cordialement.
    Gilles
    Lazarus 1.1-37477 fpc-2.6.1-20120602-Win32

  2. #2
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    ça fait un moment que je n'ai pas touché lazarus ou delphi mais tu peux faire ça si tu veux, je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      label1:=TLabel.create(panel1);
      label1.parent:=panel1;
      label1.caption:='mon propriétaire est panel1';
    end;
    Ceci dit, si tu mets self, form1 devrait se charger de libérer ton label dynamique. C'est l'avantage. Cependant, ça doit se faire aussi en cascade...

    @+

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci pour votre réponse. J'aimerais savoir s'il se peut que le aOwner du composant renvoie une autre réponse que la TForm sur laquelle il est posé lorsque l'on interroge le aOwner.

    Dans la configuration suivante, le myComponent1.Parent est Panel1. Son aOwner est Form1.
    Form1
    --|__Panel1
    -------|__myComposant1

    Mais est-il possible que dans certaines (autres) circonstances, le aOwner ne soit pas la TForm ? Autrement dit, est-il nécessaire de vérifier que le aOwner est bien une TForm ? Et dans le cas où ce ne serait pas la TForm, quelles sont ces circonstances ?

    Cordialement. Gilles
    Dernière modification par Invité ; 02/06/2012 à 19h18.

  4. #4
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    Regarde peut-être du côté de FindComponent...

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 934
    Billets dans le blog
    6
    Par défaut
    Bonsoir,

    Pourquoi as-tu besoin de compter sur le fait que le Owner soit une fiche ?

    Et si c'est le cas, n'est-il pas dangereux de l'assumer au cas où lors d'une création dynamique on assigne nil, par exemple.

    Cela dit, si ce besoin ne se situe que lors de la création en Design Time, il suffit de tester dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if csDesigning in ComponentState
    then // je suis bien en création de fiche, et mon Owner est fatalement (?) une fiche
    else // je ne suis pas sûr de la nature de mon Owner
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour Toulourou,

    J'ai dérivé une partie de mes composants visuels pour diverses raisons, notamment, celle qui est à l'origine de ma question : je veux que le Enter puisse avoir la même fonction que le Tab.

    Dans un premier temps, je me suis facilité la tâche dans ma propre activité de programmation en dérivant les composants standards pour les adapter à mes besoins usuels, sans laisser trainer des codes répétitifs indispensables mais "loins de la couche métier". Maintenant, j'améliore l'ergonomie pour l'utilisateur.

    J'ai donc dans mes composants, une méthode de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    procedure TmyEdit.SelfOnKeyPress(Sender: TObject; var Key: char);  
    begin
      if Assigned(FOnKeyPress) then FOnKeyPress(Sender);
      if (FEnterKeyIsNext)
      and (not (ReadOnly))
      and (Enabled)
      and not (csDesigning in ComponentState) then begin
     
        if Key = #13 then begin
          with bForm do
            if HiWord(GetKeyState(VK_SHIFT)) <> 0 then
              SelectNext(ActiveControl, False, True)
            else
              SelectNext(ActiveControl, True, True);
          Key := #0
        end;
     
      end;
    end;
    Elle repose sur SelectNext qui nécessite une TForm. Le bForm ci-dessus est défini dans le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    constructor TmyEdit.Create(aOwner: TComponent);
    begin
     inherited;
     bOwner  := aOwner;
     if bOwner is TForm then bForm := TForm(bOwner) else
       Showmessage('Le aOwner n''est pas une Tform : ?');         
      [...]
    end;
    J'utilise ces composants depuis pas mal de temps et je n'ai jamais rencontré de problème (ie le ''Le aOwner n''est pas une Tform : ?' n'est jamais apparu). Mais comme je les revisitais, la question que j'avais éludée est aujourd'hui d'actualité. [RQ : j'ai besoin d'utiliser aOwner dans d'autres méthodes du composant, d'où la présence de bOwner].

    Avec ces composants, je n'utilise pas la création dynamique. Ils sont systématiquement "déposés à la souris" sur une TForm.

    Cordialement. Gilles
    Dernière modification par Invité ; 03/06/2012 à 11h15.

Discussions similaires

  1. Liste d'initialisation dans les constructeurs
    Par Dani3L dans le forum C++
    Réponses: 4
    Dernier message: 25/12/2008, 18h36
  2. champs domain dans les constructeurs
    Par TrueBeliever dans le forum JDeveloper
    Réponses: 0
    Dernier message: 09/08/2008, 16h47
  3. Débutant dans les constructeurs
    Par dot-_-net dans le forum C++
    Réponses: 16
    Dernier message: 31/03/2008, 22h24
  4. Réponses: 18
    Dernier message: 28/02/2007, 10h23
  5. Saut de ligne dans les proprietes de composants
    Par kase74 dans le forum Delphi
    Réponses: 5
    Dernier message: 10/07/2006, 13h30

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