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

Langage Delphi Discussion :

Problème avec constructor d'une TFrame


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2019
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Problème avec constructor d'une TFrame
    Bonjour à tous,

    J'ai un message d'erreur quand j'essaie de modifier un composant dans un frame.

    Je n'arrive pas modifier des composants dans une frame avec un constructor. Dans ma frame j'ai placé une TVertScrollBox. Et au démarrage de l'application, mon programme plante...
    Quand j'appelle cette même procédure à partir du FormCreate tout fonctionne correctement...

    J'ai essayer avec d'autre composant et même réusltat.
    Comment faire pour modifier un composants d'une TFrame a l'exécution sans passer par le FormCreate principale ?

    Merci pour votre aide

    Le message d'erreur:
    Nom : MSG.png
Affichages : 121
Taille : 6,6 Ko

    Constructor de ma frame:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    constructor Create(aOwner: TComponent);override; 
     
    constructor THomePageFrame1.Create(aOwner: TComponent);
    begin
      inherited;
      InitScore;
    end;
    La procedure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure THomePageFrame1.InitScore;
      var
      C: TLayout;
    begin
      Text5.Text:='NO DATA';
      Text2.Text:='0';
      C:=Tlayout(Form1.HomePageFrame11.Layout4.Clone(nil));
      C.Visible:=true;
      Form1.HomePageFrame11.VertScrollBox1.InsertObject(0, C);
      C.Align:=TAlignLayout.Top;
    end;

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    tu ne peux pas faire référence à Form1.HomePageFrame11 depuis le constructor car la variable n'est pas encore alimentée

    mais si je comprend ton code, Layout4 est un composant de ta Frame au même titre que Text2 ou Text5 non ? alors pourquoi passer par Form1 ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2019
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    C'est justement mon problème, je suis obligé de passer par le constructor du Form1. Dans Ma Frame, j'ai une TVertScrollBox et a l'intérieur le layout4 avec text2 et text5.
    Ce que je n'arrive pas a comprendre c'est pourquoi mon programme crash quand j'appelle ma procédure avec le code ci dessus.
    Mais quand j'appelle cette même procédure avec le le constructor du Form1 tout marche parfaitement.

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    ben je viens de te répondre non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure THomePageFrame1.InitScore;
      var
      C: TLayout;
    begin
      Text5.Text:='NO DATA';
      Text2.Text:='0';
      C:=Tlayout(Layout4.Clone(nil));
      C.Visible:=true;
      VertScrollBox1.InsertObject(0, C);
      C.Align:=TAlignLayout.Top;
    end;
    mais pourquoi diable faire cela ?!

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2019
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour tes réponses et tes explications!! Maintenant je comprends mieux ceux qui se passe.
    Mais Imaginons que je mette cette procédure dans un fichier unité, comment je fait pour pouvoir accéder a la variable si elle n'est pas encore alimentée?

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    alors il y a une notion que tu ne maîtrise manifestement pas c'est celle de l'objet

    dans cet exemple, je n'ai pas besoin d'avoir accès à la variable Form1.HomePageFrame11 car le code est celui de l'objet lui-même, et comme dirait Descartes : "je pense donc je suis"; l'objet n'a pas besoin d'accéder à une variable qui lui fait référence pour exister et travailler.

    le fait même de déclarer une objet avec des membres lui permet d'être autonome.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type
      THomePageFrame = class(TFrame)
        ErgoSum: Boolean;
        procedure Cogito;
      end;
     
    procedure THomePageFrame.Cogito;
    begin
      ErgoSum := True;
    end;
    dans le code ci-dessus, ErgoSum étant un membre de la classe, toutes ses méthodes peuvent y faire référence directement, il est dans "la portée" du code, si je crée deux instances de cette frame, chacun a sa propre valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
      Frame1, Frame2, Frame3: THomePageFrame;
    begin
      Frame1 := THomePageFrame.Create(Application);
      Frame1.Cogito();
      Frame2 := THomePageFrame.Create(Application);
      Frame2.Cogito();
      Frame3 := Frame1;
      Frame1 := nil;
      Frame3.Cogito();
    end;
    dans le code ci-dessus je crée deux frames: Frame1 et Frame2, si je copie Frame1 dans Frame3, cela ne crée pas une nouvelle frame, c'est juste un nouveau mode d'accès à la frame existante.
    ensuite quand je mets "nil" dans Frame1, cela ne détruit pas la frame, mais il n'est plus possible d'y accéder par Frame1...et si j'appelle Frame3.Cogito, c'est toujours le membre ErgoSum de la première frame crée qui sera mis à jour.

    et dans le constructor de la frame (ou dans tout autre méthode de celle-ci) je peux aussi appeler Cogito ou modifier ErgoSum directement sans passer par une des variables Frame1, 2 ou 3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    constructor THomePageFrame.Create(AOwner: TComponent);
    begin
      Cogito();
      if ErgoSum = False then
       raise Exception.Create('Je ne pense pas !');
    end;
    ensuite si tu veux faire une procédure indépendante de l'objet qui le manipule, le plus simple est de lui donner une référence à l'objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure Cogite(Frame: THomePageFrame);
    begin
      if not Frame.ErgoSum then
        Frame.Cogito();
    end;
    et au besoin tu pourras faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Cogite(HomePageFrame11);
    end;
    mais ça n'a pas bcp d'intérêt, il serait plus judicieux de faire appel à une méthode Cogite() de la frame

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2019
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Problème résolue !!
    Merci beaucoup pour tes réponses et ton temps.
    Après mettre amusé sur delphi je dois avouer que ta méthode marche super bien.
    Merci beaucoup !!

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

Discussions similaires

  1. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50
  2. FAQ : problème avec création d'une requete en VBA
    Par Oluha dans le forum VBA Access
    Réponses: 14
    Dernier message: 14/02/2006, 12h05
  3. Problème avec RegEx et une Query string
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 15h48
  4. Problème avec affichage d'une table modifiée
    Par auriolbeach dans le forum Access
    Réponses: 6
    Dernier message: 31/10/2005, 15h45
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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