4 pièce(s) jointe(s)
TShellTreeView et AddChild, comment générer une arborescence ?
Bonjour,
l'idée c'est de refaire ça (qui remonte à 20 ans en arrière avec un w2000, un Delphi7 et le composant DirectoryListBox (fourni avec D7 bien que remontant à Win 3.1) et qui fait ce que je veux, savoir, une jolie arborescence :
Pièce jointe 641922
Mais comme avec le TShellTreeView, je m'y perds (c'est effroyable la quantité d'informations proposée), alors déjà j'ai commencé par voir si j'arrivais à quelque chose avec un simple TreeView (souvenir de tout un tas d'essais sous Windows et D7 il y a une quinzaine d'années) et ma foi, avec juste cette poignée de lignes de code, ça fait exactement ce qu"il me faut (TODO: rajouter les images, pour avoir un peu de charme) :
Code:
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
| procedure TForm1.Button3Click(Sender: TObject);
const
// simulation arborescence
s = 'f:\4_2k\w2k\programmation\projets finis\loadfont\delphi\fonts\'; // 62
DirSep = '\';
var
t: string;
i: integer;
NodeText: string;
begin
t := '';
for i := 1 to length(s) do begin // récup des noms des dossiers de l'arbo
NodeText := '';
t := t + copy(s[i], 1);
if s[i] = DirSep then begin
NodeText := ExcludeTrailingPathDelimiter(t);// suppr du \ de fin
//ShowMessage(NodeText); // ok, 'f:' et les autres, un par un
aNode := TreeView1.Items.AddChild(aNode, NodeText); // du projet TreeView/tv_learning
aNode.GetLastChild; // 2 lignes pour avoir l'arbo ouverte
aNode.ExpandParents;
t := '';
end;
end;
end;
// sans oublier
...
private
{ private declarations }
aNode: TTreeNode; |
Ce bout de code (enfin, juste les 3 lignes centrales qui commencent par aNode) vient de là mais dommage, le lien est mort...
Et il donne ça, c'est exactement ce que je veux. EDIT : c'est mieux avec des images, hein :
Pièce jointe 641923 Pièce jointe 641925
(suffit d'avoir une ImageList et de rajouter 2 lignes sous les 3 commençant par aNode :
Code:
1 2
| aNode.ImageIndex := 1; // Image du noeud
aNode.SelectedIndex := 0; // Image du noeud sélectionné |
)
Mais comme je voudrais l'avoir avec un TShellTreeView dont il parait que c'est un dérivé du TTreeView, alors, n'écoutant que mon courage et n'ayant peur de rien, je prends la ligne active
Code:
aNode := TreeView1.Items.AddChild(aNode, NodeText);
et je la remplace par
Code:
aNode := stv.Items.AddChild(aNode, NodeText); // 'stv' = ShellTreeView
Je compile, sans erreur, F9 et... hang ! Programme bloqué, :aie:
Je reprends la main, je recommence en pas à pas et je constate tristement que la ligne ci-dessus bloque tout au troisième passage, sans message, sans rien, juste tout bloqué...
Pour essayer d'y voir clair, j'ai tenté 2 essais :
Code:
1 2 3
| //for i := 1 to length(s) do begin // original - ça bloque
//for i := 1 to 12 {length(s)} do begin // 3 premières entrées de la liste - ça bloque
for i := 1 to 8 {length(s)} do begin // 2 premières entrées, ça passe |
mais pas moyen d'ouvrir-fermer l'arbo, la construction en escalier ne s'est pas faite :
Pièce jointe 641924
En plus, la première entrée (le / sélectionné) n'est pas de moi.
Si quelqu'un a une idée, ça serait merveilleux.
Merci,
PS : et cette cochonnerie de ggl qui me fait perdre un temps dément à éliminer la quantité de pages qu'il me remonte SANS les mots-clé que je demande, ça, ça me laisse sans voix...