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

Delphi Discussion :

XE7 Optimisation de code owner/Parent


Sujet :

Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut XE7 Optimisation de code owner/Parent
    Bonjour,

    J'en suis à la "fin" de ma Grid. J'ai un code fonctionnel mais j'ai encore quelques approximations dans les explications relatives à sa formulation.
    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
    20
    21
    22
    23
    procedure TfELVL.DBGrid1DblClick(Sender: TObject);
    var
      aPt: TPoint;
      aGc: TGridCoord;
      aRect : TRect;
      aEdit : TEdit;
    begin
      GetCursorPos(aPt);
      with Sender as TDBGrid do begin
        aPt   := ScreenToClient(aPt);
        aGc   := MouseCoord(aPt.X, aPt.Y);
        aRect := CellRect(aGc.X, 0);
        Canvas.FillRect(aRect);
        aEdit := TEdit.Create(nil);
        with aEdit do begin
          Parent  := Sender as TDBGrid;
          Left    := aRect.Left;
          Top     := aRect.Top;
          Width   := aRect.Width;
          Height  := aRect.Height;
        end;
      end;
    end;
    Le but de ce code est de créer un TEdit, là où l'entête de la Grid a été double-cliquée. Cet Edit sert de champ de recherche.
    Première question : aEdit := TEdit.Create(nil); ou aEdit := TEdit.Create(self); Le self renvoie à la Form. Lequel privilégier et pourquoi ? Par défaut j'utilise nil... mais à vrai dire sans explication possible de ma part... Evidemment pour le Parent, il est en tout autrement.
    Deuxième question : Pourquoi dois-je écrire : Parent := Sender as TDBGrid; dans la mesure où quelques lignes plutôt et dans la portée de la définition, j'ai précisé "with Sender as TDBGrid do begin" ce qui stipule en clair que le Sender est un dbGrid... donc Parent = Sender devrait passer. Enfin ce n'est pas le cas.

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par selzig Voir le message
    Le but de ce code est de créer un TEdit, là où l'entête de la Grid a été double-cliquée. Cet Edit sert de champ de recherche.
    Première question : aEdit := TEdit.Create(nil); ou aEdit := TEdit.Create(self); Le self renvoie à la Form. Lequel privilégier et pourquoi ? Par défaut j'utilise nil... mais à vrai dire sans explication possible de ma part... Evidemment pour le Parent, il est en tout autrement..
    Avec nil, il est préférable de gérer la libération mais ...
    Avec Self, le Edit à un Owner, il sera libéré implicitement à la libération du Onwer, c'est juste une notion de propriété de la mémoire !

    Avec nil mais, comme tu affectes un Parent, si le Parent est détruit, ce dernier va aussi détruire ses enfants
    Le Parent joue le rôle de Owner au final, ... c'était mal documenté avant mais maintenant c'est clair :

    Remarque : La propriété Parent déclarée dans TControl est similaire à la propriété Owner déclarée dans TComponent, dans le sens où le Parent d'un contrôle libère le contrôle de même que le propriétaire d'un composant libère ce composant. Néanmoins, le Parent d'un contrôle est toujours un contrôle fenêtré contenant visuellement le contrôle en question et est responsable de l'écriture du contrôle dans un flux lorsque la fiche est enregistrée. Le propriétaire d'un composant est le composant transmis comme paramètre dans le constructeur et, s'il est affecté, lance le processus d'enregistrement de tous les objets (y compris le contrôle et son parent) lorsque la fiche est enregistrée
    Citation Envoyé par selzig Voir le message
    Deuxième question : Pourquoi dois-je écrire : Parent := Sender as TDBGrid; dans la mesure où quelques lignes plutôt et dans la portée de la définition, j'ai précisé "with Sender as TDBGrid do begin" ce qui stipule en clair que le Sender est un dbGrid... donc Parent = Sender devrait passer. Enfin ce n'est pas le cas.

    Merci.
    on te laisse toujours accéder à Sender tel qu'il est à l'origine,
    le with n'est pas une déclaration mais juste rend implicite l'élément cible
    le with ne modifie pas l'interprétation de Sender par le compilateur
    il manque une sorte de WithSelf qui permettrait d'accéder à la variable dans le with !
    mais si WithSelf existait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     with Sender as TDBGrid do begin
        with aEdit do begin
          Parent  := WithSelf;
    Qui est WithSelf ??? le Sender, le aEdit ???
    Les with multiples ou les with imbriqués serait très complexe à gérer,
    et au final un WithSelf serait plus compliquer que d'utiliser la variable directement
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

    OK. Merci. C'est parfaitement clair.

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

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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