Treeview et image

Résolu
yannba Messages postés 133 Date d'inscription mercredi 4 janvier 2006 Statut Membre Dernière intervention 7 septembre 2010 - 27 janv. 2006 à 16:14
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 1 févr. 2006 à 14:22
Bonjour,

J'utilise un fichier *.ini pour sauvegarder mes noeuds de mon Treeview.
Lorsqu'il remplit mon treeview, je voudrais qu'il affiche également une image rcupérée par un combobox.
Avez-vous une idée ?

procedure TreeFromIni(TreeView2: TTreeView; INI: TIniFile; Section: string;Expand: Boolean);
var
n: Integer;
MS: TMemoryStream;
tTv: TStringList;
begin
tTv := TStringList.Create;
MS := TMemoryStream.Create;
try
INI.ReadSection(Section, tTv);
for n := 0 to tTv.Count - 1 do
tTv[n] := StringReplace(INI.ReadString(Section, tTv[n], ''), '#', #9,[rfReplaceAll]);
tTv.SaveToStream(MS);
MS.Position := 0;
TreeView2.LoadFromStream(MS);
if (Expand = True) and (TreeView2.Items.Count > 0) then TreeView2.Items[0].Expand(True);
finally
tTv.Free;
MS.Free;
end;
end;
A voir également:

13 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 janv. 2006 à 10:48
Je trouve que tu te compliques bien la vie pour rien !
A la place, il est si facile d'utiliser les fonctions WriteComponentResFile et ReadComponentResFile :

procedure TMainFormDemo.Button1Click(Sender: TObject);
begin
//Sauvegarde le TTreeView en flux sur disque
  WriteComponentResFile('tv1.dat', Treeview1);
end;

procedure TMainFormDemo.Button2Click(Sender: TObject);
begin
//Efface le contenu du TTreeView
  TreeView1.Items.Clear;
  //Recharge le contenu du TTreeView à partir du fichier
  ReadComponentResFile('tv1.dat', Treeview1);

end;
C'est simple, rapide et terriblement efficace.

<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
yannba Messages postés 133 Date d'inscription mercredi 4 janvier 2006 Statut Membre Dernière intervention 7 septembre 2010
28 janv. 2006 à 14:21
Encore fallait-il connaitre cette instruction.
Effectivement, y a pas photo ...
Et sais tu comment on fait pour ensuite mettre une image récupérée à partir d'une "ImageList1" et evidemment la récupérer dans l'autre instruction?
merci.

procedure TMainFormDemo.Button1Click(Sender: TObject);
begin
TreeView1.Images:=ImageList1;
//Sauvegarde le TTreeView en flux sur disque
WriteComponentResFile('tv1.dat', Treeview1);
end;
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 janv. 2006 à 21:02
Toutes les propriétés publiées sont sauvegardées dans le flux. C'est un principe de base.
Or, ImageIndex est une propriété publiée.
Mais peut-être ai-je mal compris la question ?
<hr color="#008000">Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
yannba Messages postés 133 Date d'inscription mercredi 4 janvier 2006 Statut Membre Dernière intervention 7 septembre 2010
29 janv. 2006 à 11:34
Non ca y est ca marche, le probleme est que je voulais recuperer les valeurs du form1.treeview1 pour les mettre dans un autre form2.treeview2 ... (je croyais que c'etait les images qui bugaient !) et c'est pas possible. Connais-tu l'astuce ?

procedure TMainFormDemo.Button1Click(Sender: TObject);
begin
form1.TreeView1.Images:=form1.ImageList1;
//Sauvegarde le TTreeView en flux sur disque
WriteComponentResFile('tv1.dat', form1.Treeview1);
end;

procedure TMainFormDemo.Button2Click(Sender: TObject);
begin
//Efface le contenu du TTreeView
form2.TreeView2.Items.Clear;
//Recharge le contenu du TTreeView à partir du fichier
ReadComponentResFile('tv1.dat', form2.Treeview2);
end;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
29 janv. 2006 à 12:48
S'il 'agit uniquement d'affecter les valeurs d'un TTreeView à un autre TTreeView, utilise la méthode Assign :
Form2.TreeView2.Assign(Form1.TreeView1);


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
yannba Messages postés 133 Date d'inscription mercredi 4 janvier 2006 Statut Membre Dernière intervention 7 septembre 2010
30 janv. 2006 à 00:30
Decidemment, je suis vraiment pas bon avec les treeview ...
Sur Form3 : voila ce que j'ai :

Pour sauvegarder :
procedure TForm3.Button4Click(Sender: TObject);
begin
iniFile := TiniFile.Create('c:\test.ini');
//Sauvegarde le TTreeView en flux sur disque
WriteComponentResFile('c:\test.ini', Treeview1);
end;
---------
Lorsque j'ouvre mon appli, je clique :
procedure TForm3.Button5Click(Sender: TObject);
begin
//Efface le contenu du TTreeView
TreeView1.Items.Clear;
//Recharge le contenu du TTreeView à partir du fichier
ReadComponentResFile('c:\test.ini',Treeview1);
Form4.showmodal;
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
form4.TreeView5.Assign(form3.TreeView1);
end;

Lorsque je compile j'ai le message d'erreur suivant :

Exception déclenchée à $7C81EB33. Classe d'exception EConvertError avec message 'Impossible d'affecter TTreeView à TTreeView'. Processus Project1.exe (224)
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 janv. 2006 à 19:26
Attention au code en rouge ci-après :
procedure TForm3.Button4Click(Sender: TObject);
begin
iniFile := TiniFile.Create('c:\test.ini');
//Sauvegarde le TTreeView en flux sur disque
WriteComponentResFile('c:\test.ini', Treeview1);
end;
Le fichier .ini porte le même nom.
La structure du fichier dans lequel le composant est sauvegardé n'a rien à voir avec un fichier .ini. Il est préférable d'utiliser une autre extension.

Pour le reste, mea culpa , je m'ai gourré un tantinet !
Le bon code est :
procedure TForm4.FormCreate(Sender: TObject);
begin
TreeView5. Items .Assign(form3.TreeView1.Items);
end;


<HR color =#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
yannba Messages postés 133 Date d'inscription mercredi 4 janvier 2006 Statut Membre Dernière intervention 7 septembre 2010
30 janv. 2006 à 20:17
1 - Le fichier .ini porte le même nom. Il est préférable d'utiliser une autre extension. Pourquoi ? Ceci dit, j'ai pris note et j'ai modifié l'extension.

2 - TreeView5.Items.Assign(form3.TreeView1.Items); Ca marche à condition que j'utilise un bouton. Pourquoi ?
procedure TForm4.Button1Click(Sender: TObject);
begin
TreeView5.Items.Assign(form3.TreeView1.Items);
end;
D'autre part, j'ai bien l'affichage du treeview mais ... sans les icones !! Connais-tu l'astuce ? Effectivement, je voudrais mettre sur le site, les deux pages avec le code pour en faire bénéficier tout le monde.

3 - Je permets à l'utilisateur de modifier par un combobx l'icone du noeud mais comment fait on pour choisir à partir d'un combobx l'icone pour l"'indice sélectionné" ?
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 janv. 2006 à 23:27
Oulà, que de questions
1- Pour éviter les confusions malencontreuses, rien de plus. Une habitude consiste à donner l'extension .dat ou .bin pour indiquer un contenu binaire du fichier. Mais ce n'est pas une obligation.

2- "Ca marche à condition que j'utilise un bouton". Non, le bouton déclanche l'affichage de Form4, rien de plus.Cela dit, il serait préférable d'utiliser l'évènement OnShow pour qu'à chaque appel, le contenu du TreeView de Form4 soit réactualisé. Pour avoir les mêmes icones, il faut que les deux treeviews pointent sur la même liste d'images.

3- Si les propriétés ItemIndex de la combobox et ImageIndex du composant TImageList sont en phase, il suffit alors d'affecter la valeur de ItemIndex du combobox à la propriété ImageIndex des noeuds du TreeView. En faisant comme cela, tu peux alors obtenir une navigation bidirectionnelle entre le combobox (OnClick) et le treeview (onClick) très facilement.

<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
yannba Messages postés 133 Date d'inscription mercredi 4 janvier 2006 Statut Membre Dernière intervention 7 septembre 2010
31 janv. 2006 à 12:25
OK pour 1 et 2.
Concernant 3, je suis d'accord.
Mais, ma question n'était pas comment affecter une image pour creer un noeud ...

(voici ma ligne de code : Arbre:=TreeView1.Selected;
procedure TForm3.Button1Click(Sender: TObject);
begin
Arbre:=TreeView1.Items.Add(Arbre,edit1.text); // Ajoute un nouveau noeud
Arbre.ImageIndex:=ComboBox1.ItemIndex;// Image représentée pour le noeud sélectionné
end;)

... mais lorsque l'utilisateur selectionne le noeud, l'icone change et prend la valeur que l'utilisateur lui a affecté (dans delphi, lorsque tu cliques sur le treeview, l'image est "indice sélectionné").
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
31 janv. 2006 à 23:35
Voici un exemple basique pour illustrer la solution possible :

type
  TForm1 =   class (TForm)
    TreeView1: TTreeView;
    ComboBoxEx1: TComboBoxEx;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1Click(Sender: TObject);
    procedure ComboBoxEx1Change(Sender: TObject);
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  Item: TComboExItem;
begin
//Remplissage du comboBoxEx
for i : = 0to ImageList1.Count - 1do
begin
{Cr&#233;e autant de lignes que d'images dans ImageList1}
    Item :=  ComboBoxEx1.ItemsEx.Add;
    //Lettres de l'alphabet en partant de A
    Item.Caption := Chr(65 + i);
    {Chaque ligne du ComboBoxEx se voit attribuer}
    Item.ImageIndex := i;
   end ;

  ComboBoxEx1.ItemIndex : = 0;
end;

procedure TForm1.TreeView1Click(Sender: TObject);
begin
{S&#233;lectionner la ligne correspondant &#224; l'image
  du noeud s&#233;lectionn&#233; dans le TTreeView}
if Assigned(Treeview1.Selected) then
    ComboBoxEx1.ItemIndex :=  Treeview1.Selected.SelectedIndex;
 end ;

procedure TForm1.ComboBoxEx1Change(Sender: TObject);
begin
with TreeView1 do
//toujours v&#233;rifier qu'un &#233;l&#233;ment est s&#233;lectionn&#233;
if Assigned(Selected) then
begin
{Affectations des index d'images correspondant
      &#224; l'&#233;l&#233;ment s&#233;lectionn&#233; dans le TComboBoxEx}
      Selected.SelectedIndex : = ComboBoxEx1.ItemIndex;
      Selected.ImageIndex :=  ComboBoxEx1.ItemIndex;
      //forcer un refresh du TTreeView
      Repaint;
     end ;
end;

Pour visualiser la concordance entre la liste d&#233;roulante des images et celle affich&#233;e par un noeud, j'ai employ&#233; un TComboBoxEx (onglet Win32, Delphi 6 et +) et en affectant les propri&#233;t&#233;s ImageList des deux composants visuels &#224; ImageList1.


<HR color =#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
yannba Messages postés 133 Date d'inscription mercredi 4 janvier 2006 Statut Membre Dernière intervention 7 septembre 2010
1 févr. 2006 à 11:03
Je m'exprime mal :
Quand tu es dans l'onglet code, "CONCEPTION", tu cliques 2 fois sur le treeview.
A ce moment, tu as une fenetre qui apparait et qui te permet de creer visuellement ton treeview :
Tu remplis les champs dans :
- Propriété élément :
* Texte : nom du noeud
* Indice image : image recupérée dans le imagelist pour le noeud
* Indice sélectionné : image recupérée dans le imagelist. Lorsque l'utilisateur, lors de l'execution, choisit le noeud, l'image change. C'est cette propriété là que j'aimerais savoir comment on fait.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
1 févr. 2006 à 14:22
Il s'agit bien de la propriété SelectedIndex, non ?
Dans le dernier code que j'ai posté ci-dessus, ne sachant pas quelle image tu voulais modifier, j'ai affecté les propriétés ImageIndex et SelectedIndex. Après, c'est à toi de voir quelle image tu souhaites changer.


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Rejoignez-nous