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 :

Accéder aux composants d'une Form créée dynamiquement


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Par défaut Accéder aux composants d'une Form créée dynamiquement
    Bonjour à tous,

    Afin de rendre mon application plus réactive et moins gourmande, seule ma Main Form et mon Datamodule sont créés au lancement de l'application, toutes les autres Forms sont créées dynamiquement et libérées quand plus utilisées.
    Je procède de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TfrmKeywords.BtNewKwClick(Sender: TObject);
    var
      F_Kw_Mod : TfrmKwMod;
    begin
      F_Kw_Mod := TfrmKwMod.Create(nil);
        try
          F_Kw_Mod.ShowModal;
        finally
          F_Kw_Mod.Free;
        end;
    end;
    Ici, une From F_Kw_Mod est créée (et libérée à sa fermeture) depuis une autre Form (F_Keywords) elle même précédement créée dynamiquement.

    Cette Form (F_Kw_Mod) contient un TEdit et un Tbutton, pour la saisie de nouveaux enregistrements. Le click du bouton déclenche une série de vérifications (champ vide, doublon...) avant validation, enregistrement en base de données et fermeture de la Form.

    Mon problème est le suivant : après un enregistrement réussi, je veux forcer le recalcule du nombre d'enregistrements dans un footer de ma DBGrid sur la Form précédente. Bien sur, je pourrais ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBGridEh1.SumList.RecalcAll;
    juste avant l'appel de
    et cela fonctionnerait (je l'ai testé).

    Ce que je voudrais savoir c'est comment accéder depuis ma seconde Form (créée dynamiquement) à un composant de la Form précédent (elle aussi créée dynamiquement) ?
    Quand je tente d'y faire référence directement, j'ai droit à une belle "Application Exception" parce que je fais référence à "nil".
    Alors savez-vous comment "partager" un composant et lui envoyer une commande depuis une autre Form en gardant à l'esprit (je sais que je me répète) qu'elles ont toutes les deux été créées dynamiquement (le simple ajout de l'unité à la use clause n'y change rien) ?

    Merci d'avance


    Math

  2. #2
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par mathmathou Voir le message
    Quand je tente d'y faire référence directement, j'ai droit à une belle "Application Exception" parce que je fais référence à "nil".
    Tu t'y prends de quelle façon ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Par défaut
    Bonjour Lung et merci de t'être intéressé à ma question.

    Je vais tenter d'être clair : j'ai donc deux Forms : frmKeywords et frmkwmod qui sont respectivement déclarées comme suit :
    F_Keywords := TfrmKeywords depuis un ButtonClick de ma main Form
    et
    F_Kw_Mod := TfrmKwMod depuis un ButtonClick de frmKeywords
    et créées dynamiquement comme exposé dans mon premier post.

    Elles ne sont pas créées directement en frmKeywords ou frmKwmod pour éviter d'utiliser les variables globales que Delphi génère automatiquement entre Type et Implementation (que je pourrais effacer), et qui, semble t'il, sont le mal absolu .

    Le problème est que si je les efface, je ne sais plus accéder à frmKeywords.dbgrideh1 depuis frmKwMod.

    Et si je réactive ces variables, que ce soit F_Keywords ou frmKeywords, quand je tente un
    FrmKeywords.dbgrideh1.sumlist.recalcall depuis frmKwMod, j'ai une AE.

    Ces Forms sont créées avec Create(nil) car elles sont modales mais je n'arrive pas à interagir de la seconde sur un composant de la première.

    Je me relis et ne suis pas certain d'avoir été très clair

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pour le Create(nil), le nil est simplement le Owner.

    Tu pourrais utiliser les property ?

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    type
      TForm2 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        FDBGrid: TDBGrid;
        function GetDBGrid: TDBGrid;
      public
        property DBGrid: TDBGrid read GetDBGrid;
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.dfm}
     
    { TForm2 }
     
    procedure TForm2.FormCreate(Sender: TObject);
    begin
       // initialisation de la variable
       FDBGrid := nil;
    end;
     
    procedure TForm2.FormShow(Sender: TObject);
    begin
       // création de la grille
       FDBGrid := TDBGrid.Create(nil);
    end;
     
    function TForm2.GetDBGrid: TDBGrid;
    begin
       // récupération de la grille
       Result := FDBGrid;
    end;
    Du coup depuis une autre fenêtre si tu crées une Form de type TForm2 tu auras accès à la grille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm3.Button1Click(Sender: TObject);
    var
       CurrentForm: TForm2;
    begin
       CurrentForm := TForm2.Create(nil);
     
       try
          CurrentForm.ShowModal;
          CurrentForm.DBGrid; // <-- accès à la grille
       finally
          FreeAndNil(CurrentForm);
       end;
    end;

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Bonjour,

    Je viens de rédiger un petit article sur la question
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Par défaut
    Bonjour à tous,

    @Paul
    Un article très instructif et intéressant en vérité, c'est toujours une satisfaction de faire, non plus parce que l'on vous a dit que c'était comme cela, mais parce qu'on a compris pourquoi.
    Malheureusement, j'ai eu beau tourner et retourner cela dans tous les sens, je n'ai pas abouti à ce que je souhaitais. Le manque d'expérience à n'en pas douter

    @retwas
    malheureusement, même constat, je ne saisis pas encore tout parfaitement, et donc de là à l'appliquer...

    Je vais tenter de m’expliquer de manière plus claire

    Merci pour votre participation

    Math

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Par défaut
    Alors, en essayant d'être plus précis, voici un petit schéma :

    Nom : Sans titre-1.png
Affichages : 945
Taille : 202,7 Ko

    La Form 1 est la main Form, elle est créée automatiquement
    La Form suivante (frmkeywords) est créée dynamiquement au click du bouton Keywods (1)
    La dernière Form (frmKwMod la plus petite) est également créée dynamiquement au click du bouton "Add New Keyword" (2).

    La Form frmkeyword et frmKwMod sont créées respectivement suivant la procédure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TfrmWelcome.BtKeywordsClick(Sender: TObject);
    var
      F_Keywords : TfrmKeywords;
    begin
      F_Keywords := Tfrmkeywords.Create(nil);
        try
          F_Keywords.ShowModal;
        finally
          F_Keywords.Free;
        end;
    end;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TfrmKeywords.BtNewKwClick(Sender: TObject);
    var
      F_Kw_Mod : TfrmKwMod;
    begin
      F_Kw_Mod := TfrmKwMod.Create(nil);
        try
          F_Kw_Mod.ShowModal;
        finally
          F_Kw_Mod.Free;
        end;
    end;
    Mais comme elles sont toutes les deux créées avec Owner nil, il n'y a pas de variable globale pour y accéder.

    En fermant la Form frmKwMod, avant le "Close", je tente de déclencher un rafraichissement de la DBGrid de la fenêtre frmkeywords.
    Mais impossible d'accéder à ce DBGrid, elle est sur une autre Form (frmKeywords) avec laquelle je suis incapable de créer une "passerelle".


    Je continue à me creuser les méninges

    Math

  8. #8
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Si j'ai bien compris, voici un exemple qui marche :

    Une form1 crée et affiche une form2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    var
       MaForm2: TForm2;
    begin
       MaForm2 := TForm2.Create(nil);
       try
          MaForm2.ShowModal;
       finally
          MaForm2.Free;
       end;
    end;
    Une form2 crée une form3, lui donne un pointeur d'elle-même, et l'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm2.Button1Click(Sender: TObject);
    var
       MaForm3: TForm3;
    begin
       MaForm3 := TForm3.Create(nil);
       try
          MaForm3.LaForm2 := Self;    // <-- Je lui donne un pointeur sur moi-même.
          MaForm3.ShowModal;
       finally
          MaForm3.Free;
       end;
    end;
    La form3 accède à la Form2 par le pointeur, et se ferme :
    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
    uses ... Unit2 ...
     
    type
      TForm3 = class(TForm)
        Button1: TButton;
     
        procedure Button1Click(Sender: TObject);
     
      private
     
      public
        LaForm2: TForm2;      // Un pointeur sur la Form2.
      end;
     
    ...
     
    procedure TForm3.Button1Click(Sender: TObject);
    begin
       LaForm2.DBGrid.Refresh;     // <-- Je peux accéder à la Form2.
       Close;
    end;
    Bon, c'est juste pour te donner une idée, et t'aider à comprendre la solution de retwas.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/01/2009, 00h28
  2. Réponses: 5
    Dernier message: 20/09/2007, 17h53
  3. [Excel] Charger une form créée dynamiquement dans un autre classeur
    Par spileo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/02/2007, 11h58
  4. [C#] Comment accéder aux données d'une Form ?
    Par cjacquel dans le forum Windows Forms
    Réponses: 5
    Dernier message: 28/07/2006, 11h55

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