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 :

Retrouver/Controler une élément contenue dans un TabSheet crée dynamiquement


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Retrouver/Controler une élément contenue dans un TabSheet crée dynamiquement
    Bonjour,

    La question est dans le titre :

    Ma procédure qui crée mes TabSheet est la suivante

    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
     
    procedure CreTab(Chan : String);
    var
      tbs : TTabSheet;
    begin
      tbs := TTabSheet.Create(nil);
      with TFTab.Create(nil) do
      begin
        // Attention, chaque frame doit avoir un nom différent
        Name := Chan;
        Align := alClient;
        Parent := tbs;
      end;
      // Ajout de la page au TPageControl
      tbs.PageControl := MainForm.ChanControl;
      // Modification du titre de l'onglet
      tbs.Caption := '#'+Chan;
    end;
    Ma fiche qui est Instancié contient un Mémo1 ect...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      TFTab = class(TFrame)
        Memo1: TMemo;
        ListBox1: TListBox;
        Edit1: TEdit;
    J'ai déja essaié de retrouver le mémo de la manière suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
     tbs : TTabSheet;
     MonMemo : TMemo;
    begin
    tbs := TTabSheet(FindComponent('OK'));// 'OK' est le nom d'un de mes TabSheet
    MonMemo := TMemo(tbs.FindComponent('Memo1'));
    mais lors de MonMemo.Lines.Add('YAZERFSDFG'); j'ai une erreur de vilation d'accès :s

    Une idée?? Merci d'avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 147
    Points : 164
    Points
    164
    Par défaut
    J'ai testé et en effet cela ne marche pas du tout lol

    j'ai essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    tbs := TTabSheet.Create(PageControl1);
      tbs.Name := 'TABSHEET1';
      with TFrameOK.Create(tbs) do
      begin
        Name := 'FRAME_OK';
        Align := alClient;
        Parent := tbs;
        tbs.Caption := '#'+Name;
      end;
      // Ajout de la page au TPageControl
      tbs.PageControl := Form1.PageControl1;
    et donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      with TTabSheet(PageControl1.FindComponent('TABSHEET1')) do
        with FindComponent('FRAME_OK') do
          with TMemo(FindComponent('Memo1')) do
            Lines.Add('Bonjour');

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    La fiche est( par défaut ->voir Owner) propriétaire des composants TTabsheet et du TMemo.
    Il faut tester comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Form1.FindComponent('Memo1') <> nil then ...
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Assigned(Form1.FindComponent('Memo1')) then ...
    Dans ton code ici->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonMemo := TMemo(tbs.FindComponent('Memo1'));
    MonMemo = nil d'où l'erreur ensuite avec
    @+

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 147
    Points : 164
    Points
    164
    Par défaut
    Fabrice :
    J'ai testé ta solution : qui semblait tres simple (trop lol) marche pas...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    :s malheureusement dans mon cas ça ne marche pas (ou je transpose mal)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      with TTabSheet(ChanControl.FindComponent('OK')) do
        with FindComponent('TFTab') do
          with TMemo(FindComponent('Memo1')) do
            Lines.Add('Bonjour');
    Toujous l'erreur de violation de mémoire :s (j'ai aussi essaié d'inverser 'OK' et TFTab ... sans succès)

    Je ne comprend pas qui est propriétaire de qui dans mon code, qui descent de qui ... (d'ou le problème)

    Une proposition?

    Remarque : lors de la création de les TabSheet j'ai du modifier la valeur 'Self' par nil car le compilateur m'avertis que Self n'est pas définie ... ( cf http://www.developpez.com/delphi/faq/?page=pagecontrol )

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 147
    Points : 164
    Points
    164
    Par défaut
    oui mais moi j'ai remplacer nil pas le propriétaire logique

    tbs := TTabSheet.Create(nil);
    -> TTabSheet.Create(ChanControl); // tbs appartient au pagecontrol
    j'ai ajouté
    tbs.name =<nom de la tabsheet> sinon dans ton cas elle n'est pas nommée
    (j'ai essayé en remplacant findcomponent par une boucle qui me liste le nom de composant pour débugger ton code)

    with TFTab.Create(nil) do
    -> .Create(tbs) (l'owner de FTab c'est le tabsheet)

    et par propreté tu peux mettre un if tmemo(...)<>nil then pour eviter d'avoir une erreur si le memo n'existe pas... bien que pour l'instant cela ne soit pas trop ton problème car il ne trouve déja pas les composants par leur nom
    tu peux suivre ma démarche en faisant un
    for i:=0 to componentcount - 1 do
    showmessage(components[i].name)
    pour voir les composants de la fiche et ainsi de suite ...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 147
    Points : 164
    Points
    164
    Par défaut
    Self n'est pas déclaré car tu n'est pas dans une procédure de la fenetre
    soit tu mets

    tbs := TTabSheet.Create(MainForm); cela marche aussi

    soit tu integres la procedure dans la form

    procedure TMainForm.CreTab(....)
    et là tu peux mettre Self

    n'oublie pas le tbs.name sinon le premier findcomponent ne trouve rien

    et je l'ai testé donc cela marche...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 147
    Points : 164
    Points
    164
    Par défaut
    encore moi lol

    ta transposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    with TTabSheet(ChanControl.FindComponent('OK')) do
        with FindComponent('TFTab') do
          with TMemo(FindComponent('Memo1')) do
            Lines.Add('Bonjour');
    'OK' c'est tbs.name = 'OK' (que tu n'avais pas défini et pas Chan)
    'TFTab' c'est theoriquement ta variable Chan de la procédure

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Merci de votre aide j'ai trouvé les erreurs.

    Je post le code valide si ça peut servir a quelqu'un. (on ne sait jamais si un jour j'ai un trou de mémoire ... )

    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
    procedure TMainForm.CreTab(Chan : String); // premiere erreur < il faut déclarer la procedure dans TMainForm sinon ChanControl n'est pas reconnu ;) (erreur vraiment grossière de ma part désolé)
    var
      tbs : TTabSheet;
    begin
      // Création de la page
      tbs := TTabSheet.Create(ChanControl);
      tbs.name := Chan;
      // Création du contenu de la page
      with TFTab.Create(tbs) do
      begin
        // Attention, chaque frame doit avoir un nom différent
        Name := Chan;
        Align := alClient;
        Parent := tbs;
      end;
      // Ajout de la page au TPageControl
      tbs.PageControl := MainForm.ChanControl;
      // Modification du titre de l'onglet
      tbs.Caption := '#'+Chan;
    end;
    Pour l'appel des éléments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     with TTabSheet(ChanControl.FindComponent('OK')) do //Nom du TabSheet
        with FindComponent('OK') do //Nom De la fiche 
          with TMemo(FindComponent('Memo1')) do
           Lines.Add('Bonjour');
       end;
    Remarque : C'est surement pas malin d'avoir apelé par le même nom 2 objets différents ...

    Merci de votre aide

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/02/2013, 22h30
  2. Réponses: 4
    Dernier message: 08/01/2013, 15h53
  3. Réponses: 1
    Dernier message: 28/05/2011, 11h39
  4. Réponses: 4
    Dernier message: 08/02/2010, 23h10
  5. [JAR] instancier une Image contenue dans un jar
    Par celine31 dans le forum Général Java
    Réponses: 3
    Dernier message: 03/04/2005, 15h55

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