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;