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

Composants VCL Delphi Discussion :

composant créé dynamiquement invisible


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Par défaut composant créé dynamiquement invisible
    Bonjour
    Dans une petite appli, je dois gérer dynamiquement (donc pas à la conception), des tlistview dans les différentes pages d'un tpagecontrol...
    Selon les cas, la listview doit apparaître :
    - soit directement dans une page du tpagecontrol principal (de 1er niveau)
    - soit dans une page d'un tpagecontrol de 2ème niveau, c'est à dire lui-même dans une page de mon tpagecontrole de 1er niveau

    On peut l'illustrer comme ça

    pagecontrol "principal" (2 pages)
    __page1
    ____listview1 plantage ici
    __page2
    ____pagecontrol2 (2 pages)
    ______page1
    ________listview2
    ______page2
    ________listview3
    ...etc.

    Cette "structure" est codifiée dans un .txt (pour être conservée, modifiée...)

    Ca plante à l'exécution avec le message "le contrôle n'a pas de fenêtre parente"
    Pourquoi ?
    Je ne me suis pas souvent lancé dans la création de composant à l'exécution
    Voici le code
    La partie incriminée est en rouge

    Merci à ceux qui auront le courage de s'y plonger

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    procedure Tpal.FormCreate(Sender: TObject);
    var
      c:integer;
    begin
      listadr:=tstringlist.Create;
      chemin:=extractfilepath(paramstr(0));//y compris le dernier antislash
      try
      listadr.LoadFromFile(chemin+'listadresses.txt');
      except
      showmessage('le fichier '+chemin+'listadresses.txt'+' n''existe pas!');
      end;
    
      //création des onglets principaux
      for c:=0 to listadr.Count-1 do
        if lowercase(leftstr(listadr[c],4))='pal_'
        then
        try
          onglet:=TTabSheet.Create(pagepal);
          with onglet do
          begin
            _1:=pos('_',listadr[c]);
            _2:=_1+pos('_',rightstr(listadr[c],length(listadr[c])-pos('_',listadr[c])-1));
            if _2>_1
            then begin name:=leftstr(listadr[c],_2);
                       caption:=midstr(listadr[c],_1+1,_2-_1);end
            else begin name:=listadr[c];
                       caption:=rightstr(listadr[c],length(listadr[c])-_1);
                       liste:=tlistview.Create(onglet);
                       with liste do
                       begin
                         name:='list_'+listadr[c];
                         parent:=onglet;
                         width:=parent.ClientWidth;
                         height:=parent.ClientHeight;
                       end;
                 end;
            PageControl:=pagepal;
    
            //création des tpagecontrol de niveau inférieur
            if lowercase(leftstr(listadr[c],length('pal_'+onglet.Caption)+1))='pal_'+onglet.Caption+'_'
            then
            try
              souspage:=tpagecontrol.Create(onglet);
              with souspage do
              begin
                parent:=onglet;
                width:=parent.ClientWidth;
                height:=parent.ClientHeight;
                if leftstr(listadr[c],length(name))=name
                then
                try
                  creasousonglet(listadr[c]);
                except
                  on ecomponenterror do sousonglet.Free;
                end;
              end;
            except
              on ecomponenterror do
              begin
                souspage.Free;
              end;
            end;
          end;
        except
          on ecomponenterror do
          //échec de création  d'un onglet (le nom existe déjà)
          //il faut créer un sousonglet dans la souspage
          begin
            creasousonglet(listadr[c]);
            onglet.Free;
          end;
        end;
    end;
    
    procedure creasousonglet(chaine:string);
    begin
      sousonglet:=TTabSheet.Create(souspage);
      with sousonglet do
      begin
        name:=chaine;
        caption:=rightstr(chaine,length(chaine)-_2-1);
        pagecontrol:=souspage;
      end;
      liste:=tlistview.Create(sousonglet);
      with liste do
      begin
        name:='list_'+chaine;
        parent:=sousonglet;
        width:=parent.ClientWidth;
        height:=parent.ClientHeight;
      end;
    end;

  2. #2
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    salut

    Peut être ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    onglet:=TTabSheet.Create(Self);
    onglet.PageControl := PagePal; 
    Avant l'utilisation de Onglet en tant que Propriétaire et Parent des autres compo. créés dynamiquement.
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  3. #3
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Je viens de vérifier

    c'est effectivement ca, j'ai reproduit ton cas.

    Correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button1Click(Sender: TObject);
    var
       TS: TTabSheet;
       TL: TListView;
    begin
         TS := TTabSheet.Create( PageControl1 );
         TS.Caption := 'toto';
         TL := TListView.Create( TS );
         TL.Parent := TS;
         TS.PageControl := PageControl1;
         TL.Width := TS.ClientWidth;
    end;
    Pas correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button1Click(Sender: TObject);
    var
       TS: TTabSheet;
       TL: TListView;
    begin
         TS := TTabSheet.Create( PageControl1 );
         TS.Caption := 'toto';
         TL := TListView.Create( TS );
         TL.Parent := TS;
         TL.Width := TS.ClientWidth;
         TS.PageControl := PageControl1;
    end;
    ps: Fais attention au Owner des composants , si le owner n'est pas la form, c'est à toi de les libérer...
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  4. #4
    Membre éclairé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Par défaut
    J'ai remplacé...
    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
          onglet:=TTabSheet.Create(pagepal);
          with onglet do
          begin
            _1:=pos('_',listadr[c]);
            _2:=_1+pos('_',rightstr(listadr[c],length(listadr[c])-pos('_',listadr[c])-1));
            if _2>_1
            then begin name:=leftstr(listadr[c],_2);
                       caption:=midstr(listadr[c],_1+1,_2-_1);end
            else begin name:=listadr[c];
                       caption:=rightstr(listadr[c],length(listadr[c])-_1);
                       liste:=tlistview.Create(onglet);
                       with liste do
                       begin
                         name:='list_'+listadr[c];
                         parent:=onglet;
                         width:=parent.ClientWidth;
                         height:=parent.ClientHeight;
                       end;
                 end;
            PageControl:=pagepal;
    par...
    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
          onglet:=TTabSheet.Create(pagepal);
          with onglet do
          begin
            pagecontrol:=pagepal;
            _1:=pos('_',listadr[c]);
            _2:=_1+pos('_',rightstr(listadr[c],length(listadr[c])-pos('_',listadr[c])-1));
            if _2>_1
            then begin name:=leftstr(listadr[c],_2);
                       caption:=midstr(listadr[c],_1+1,_2-_1);end
            else begin name:=listadr[c];
                       caption:=rightstr(listadr[c],length(listadr[c])-_1);
                       liste:=tlistview.Create(onglet);
                       with liste do
                       begin
                         name:='list_'+listadr[c];
                         showmessage(name);
                         parent:=onglet;
                         width:=parent.ClientWidth;
                         height:=parent.ClientHeight;
                       end;
                 end;
    Et là, ça marche au poil
    Mon ttabsheet n'avait pas de contenant, d'où l'erreur

    Merci pour ton aide TicTacToe... ce n'est pas toujours évident de décortiquer le code d'un autre!

    Au fait,
    Citation Envoyé par TicTacToe
    ps: Fais attention au Owner des composants , si le owner n'est pas la form, c'est à toi de les libérer...
    Et si j'oublie de le faire, quel est le risque ?
    (je coche résolu sans attendre ta réponse )

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

Discussions similaires

  1. effacer des composants crée dynamiquement
    Par forzaxelah dans le forum Delphi
    Réponses: 7
    Dernier message: 29/06/2006, 15h14
  2. Recherche composant tableau dynamique
    Par nikhil dans le forum Composants VCL
    Réponses: 4
    Dernier message: 28/07/2005, 15h02
  3. Gestion séparée de composants créés dynamiquement
    Par anarpunk dans le forum Composants VCL
    Réponses: 8
    Dernier message: 15/06/2005, 11h57
  4. Composant crée dynamiquement & Access in invalid memory
    Par Sunchaser dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/02/2005, 02h03
  5. Réponses: 7
    Dernier message: 08/08/2003, 19h09

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