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 :

Tpanel - parentForm - childForm


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Points : 25
    Points
    25
    Par défaut Tpanel - parentForm - childForm
    Bonjour à tous,

    J'utilise le principe du panel dans lequel je charge un autre form.
    Donc j'ai mon formulaire d'entrée. Dedans j'ai une procédure qui va charger le formulaire TStudent, Le parent était mon Tpanel du nom de pnl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TMySplitView.actStudentExecute(Sender: TObject);
    var
      Student: TStudent;
    begin
      Student := TStudent.Create(self);
      Student.Parent := pnl;
      Student.name := 'myStudent';
      Student.BorderStyle := bsNone;
      Student.Show();
    end;
    Jusque là tout va bien.
    Dans mon Tstudent j'ai un bouton qui va m'ouvrir en showModal un autre formulaire TStudentChild
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TStudent.btn_openStudentChildClick(Sender: TObject);
    var
    StudentChildFm: TStudentChild;
    begin
      StudentChildFm := TStudentChild.Create(self);
      StudentChildFm.name := 'myStudentChild';
      StudentChild.ShowModal();
      StudentChildFm.Release;
    end;
    Encore une fois là tout va bien.
    Et là où je bloque, dans mon TStudentChild je veux atteindre plusieurs procédures et une variable de TStudent.
    J'ai déjà essayé plusieurs solutions mais rien ne passe.

    Comment faire pour accéder au formulaire parent ?

    Merci pour votre aide

    Bertrand

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    sans conviction je dirais que c'est par owner.<untrucpublicdeTStudent>
    Sans conviction car j'ai un doute sur le self de la construction StudentChildFm := TStudentChild.Create(self); logiquement ce devrait être TStudent mais ce genre d'imbrication m'échappe
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Points : 25
    Points
    25
    Par défaut
    Bonjour SergioMaster,

    J'aimerais pouvoir dire que je comprends ta réponse : owner.<untrucpublicdeTStudent>, je vais chercher.
    Oui honnêtement pour le self j'essayais, j'utilise plus vite nil. Mais je n'ai jamais vraiment vu la différence. ll faudrait que je lise la doc.

    Merci pour ta réponse

    Bertrand

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par beletot Voir le message
    J'aimerais pouvoir dire que je comprends ta réponse : owner.<untrucpublicdeTStudent>, je vais chercher.
    Justement le fait que tu indiques Self au lieu de nil c'est mieux. Le constructeur de forme ne contient qu'un seul argument : Owner, différent de parent faut-il le préciser
    La logique voudrait donc que si tu utilises StudentChildFm := TStudentChild.Create(self); self soit égal à la forme qui à fait la création c'est-à-dire Student
    Donc toute variable, procédure ou fonction ainsi que les divers composants de TStudent sont accessibles, avec peut-être un besoin de faire un cast TStudent(owner). pour faire bonne mesure
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 502
    Points : 2 769
    Points
    2 769
    Billets dans le blog
    10
    Par défaut
    Ci joint un extrait de mon manuel qui parle des MdiForm et d'une autre approche dans l'exemple ci-joint
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Perso, depuis que j'avais lu que microsoft ne recommandait plus le MDI, pour une fois que je les écoute, je suis plus porté vers la technique de docking
    cf mon tutoriel
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Points : 25
    Points
    25
    Par défaut
    Bonjour ALWEBER, SergioMaster,

    Merci pour vos réponses et tuto.
    ALWEBER - tu utilises les pointer, je ne me suis jamais intéressé au sujet.Un chose à rajouter sur ma liste de TODO
    SergioMaster - de ce que je vois le système de docking semble assez intéressant. J'ai des utilisateurs en mono et double écrans.

    Pour le moment j'essaye juste de trouver une solution sans devoir à nouveau modifier mon application.
    J'ai pu faire une avancée.
    Je suis dans mon dernier formulaire, 3ième niveau donc : TMySplitView -> TStudent -> TStudentChild
    Dans le construct j'arrive à avoir le contenu de ma variable du formulaire parent -> TStudent(owner).studentText
    Je dois lui laisser le inherited -> oui pourquoi pas
    Par contre dans ma procédure formShow là ça craque. Access violation

    Point étonnant de Ustudent (2 ième niveau) j'arrive sans difficulté à lire une variable de TMySplitView (1 er niveau)
    Je suis donc Tpanel, je charge dedans mon Tsudent et mon studentChild lui est affiché en show modal donc pas dans le panel.

    Une idée ?

    Bertrand

    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
     
    uses uStudent;
    constructor TStudentChild.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
       //studentFm := AOwner;
      //OutputDebugString('TStudentChild.Create');
      OutputDebugString(PChar('construct | ' + TStudent(owner).studentText));
    end;
     
    procedure TStudentChild.FormShow(Sender: TObject);
    begin
      // lbl_debug.Caption := Student.studentText;
      OutputDebugString('FormShow');
      OutputDebugString(PChar('formShow | ' + TStudent(owner).studentText));
      // lbl_debug.Caption := TStudent(owner).studentText;
    end;

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Bonjour

    le inherited Create(AOwner); me choque, il n'a, AMHA, aucune raison de le faire.

    En tout cas le Owner fonctionne je n'y crois qu'à moitié
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Points : 25
    Points
    25
    Par défaut
    Sergio,

    Je me suis mal exprimé. Je dois laisser le inherited Create(AOwner) sinon il crash.
    Une idée de comment également récupérer la valeur TStudent(owner).studentText) dans le onFormShow ?

    Bertrand

  10. #10
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 502
    Points : 2 769
    Points
    2 769
    Billets dans le blog
    10
    Par défaut
    Essayes de nous envoyer un petit exemple on va regarder. je pense que ton problème est peut-être ailleurs

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Points : 25
    Points
    25
    Par défaut
    Okay,

    Voici le projet.
    Il faut télécharger le zip

    Dans l'exe, il faut aller en haut à gauche sur les petites barres pour ouvrir le menu
    choisir l'option student.
    et le bouton openStudentChild

    Il est clair que je dois faire une soupe. C'est mon premier essai avec le composant TPanel.

    Un grand merci pour le coup de main. J'ai bien essayé mais là j'ai le cerveau qui chauffe.

    Bertrand

  12. #12
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 502
    Points : 2 769
    Points
    2 769
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par beletot Voir le message
    Okay,

    Il est clair que je dois faire une soupe. C'est mon premier essai avec le composant TPanel.

    Un grand merci pour le coup de main. J'ai bien essayé mais là j'ai le cerveau qui chauffe.

    Bertrand
    ci joint version modifiée. Tu dois passer les deux variables en global pour pouvoir les réutiliser
    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
     
    var
      MySplitView: TMySplitView;
      Student: TStudent;
      Teacher: TTeacher;
     
    implementation
     
    {$R *.dfm}
     
    procedure TMySplitView.actHomeExecute(Sender: TObject);
    begin
      Log(actHome.Caption + ' Clicked');
      SV.Close;
    end;
     
    procedure TMySplitView.actStudentCloseExecute(Sender: TObject);
    begin
      if (Student <> Nil) then
      FreeAndNil(Student);
    end;
     
    procedure TMySplitView.actStudentExecute(Sender: TObject);
    begin
      if (Student <> Nil) or (Teacher <> Nil) then
        exit;
      Student := TStudent.Create(self);
      Student.Parent := pnl;
      Student.name := 'myStudent';
      Student.BorderStyle := bsNone;
      Student.Show();
    end;
    Fichiers attachés Fichiers attachés

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Citation Envoyé par beletot Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TStudent.btn_openStudentChildClick(Sender: TObject);
    var
    StudentChildFm: TStudentChild;
    begin
      StudentChildFm := TStudentChild.Create(self);
      StudentChildFm.name := 'myStudentChild';
      StudentChild.ShowModal();
      StudentChildFm.Release;
    end;
    No comment

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Points : 25
    Points
    25
    Par défaut
    Rebonjour à tous.

    Effectivement le StudentChild.ShowModal(); n'a pas aidé.
    Mais vu qu'il m'ouvrait quand même une fenêtre je n'y ai pas plus prêté attention.
    Là cela semble tellement simple.

    Merci pour votre temps. C'est bête à dire mais je ne voyais pas l'erreur pourtant tellement simple.

    Bertrand

  15. #15
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Si tu avais supprimé cette fiche des auto-créées, tu t'en serais rendu compte plus tôt.

    Et si tu crées manuellement les fiches sans utiliser les variables automatiquement ajoutées par Delphi, supprime-les

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Points : 25
    Points
    25
    Par défaut
    Rebonjour,

    Comme proposé j'ai regardé pour supprimer l'auto création de form.
    Elle devrait être dans les options mais je ne la trouve pas, pourtant la recherche me la propose mais rien dans le panneau.
    Nom : autoCreate.PNG
Affichages : 135
Taille : 166,6 Ko

    Il y a une astuce ?

    Bertrand

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 330
    Points
    11 330
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    N'est-ce pas dans les options du projet, plutôt, que l'on a accès aux fiches à création automatique ?
    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 !

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par beletot Voir le message
    Il y a une astuce ?
    Aucune sinon qu'il faut aller au bon endroit Projet/options/application/fiche
    Nom : Capture.PNG
Affichages : 107
Taille : 21,7 Ko
    ou Projet/voir le source et dans ce dernier supprimer la création des formes non souhaitées (les lignes Application.CreateForm(TFormxxxx, Formxxx);)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Points : 25
    Points
    25
    Par défaut
    J'avais trouvé cette option dans la doc de rio. La dernière option dans le tableau.
    http://docwiki.embarcadero.com/RADSt...signer_Options

    Il me la propose donc dans la recherche mais plus dans les options.

    je voulais éviter de devoir supprimer manuellement la création automatique.

    Bertrand

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Points : 25
    Points
    25
    Par défaut
    J'ai eu connaissance qui a l'option
    Nom : autoCreateExist.png
Affichages : 108
Taille : 34,1 Ko

    Reste à savoir pourquoi je ne la voie pas.

    Bertrand

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

Discussions similaires

  1. [DLL] Afficher le contenu d'une dll dans un Tpanel
    Par Fabs dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/08/2007, 14h30
  2. Comment mettre de la couleur à un TPanel ?
    Par bertrand_declerck dans le forum Composants VCL
    Réponses: 11
    Dernier message: 21/08/2005, 12h11
  3. affichage d'un plan issu d'une vidéo dans un tpanel
    Par gerardTar dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/07/2005, 16h11
  4. TPanel et Docking
    Par kwuy dans le forum Composants VCL
    Réponses: 3
    Dernier message: 15/09/2003, 15h16
  5. [c++ builder] creation de surface sur TPanel
    Par JEG dans le forum DirectX
    Réponses: 7
    Dernier message: 23/09/2002, 22h41

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