Treeview et image [Résolu]

yannba 139 Messages postés mercredi 4 janvier 2006Date d'inscription 7 septembre 2010 Dernière intervention - 27 janv. 2006 à 16:14 - Dernière réponse : yannba 139 Messages postés mercredi 4 janvier 2006Date d'inscription 7 septembre 2010 Dernière intervention
- 2 févr. 2006 à 13:40
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;
Afficher la suite 

14 réponses

Répondre au sujet
yannba 139 Messages postés mercredi 4 janvier 2006Date d'inscription 7 septembre 2010 Dernière intervention - 2 févr. 2006 à 13:40
+3
Utile
Pardon !!! J'ai lu trop vite ton code ... J'aurais du l'exécuter avant. Je l'ai mis sur le site :
http://www.delphifr.com/code.aspx?ID=35857MERCI BEAUCOUP
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de yannba
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 28 janv. 2006 à 10:48
0
Utile
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.
Commenter la réponse de cs_Delphiprog
yannba 139 Messages postés mercredi 4 janvier 2006Date d'inscription 7 septembre 2010 Dernière intervention - 28 janv. 2006 à 14:21
0
Utile
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;
Commenter la réponse de yannba
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 28 janv. 2006 à 21:02
0
Utile
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.
Commenter la réponse de cs_Delphiprog
yannba 139 Messages postés mercredi 4 janvier 2006Date d'inscription 7 septembre 2010 Dernière intervention - 29 janv. 2006 à 11:34
0
Utile
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;
Commenter la réponse de yannba
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 29 janv. 2006 à 12:48
0
Utile
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.
Commenter la réponse de cs_Delphiprog
yannba 139 Messages postés mercredi 4 janvier 2006Date d'inscription 7 septembre 2010 Dernière intervention - 30 janv. 2006 à 00:30
0
Utile
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)
Commenter la réponse de yannba
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 30 janv. 2006 à 19:26
0
Utile
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.
Commenter la réponse de cs_Delphiprog
yannba 139 Messages postés mercredi 4 janvier 2006Date d'inscription 7 septembre 2010 Dernière intervention - 30 janv. 2006 à 20:17
0
Utile
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é" ?
Commenter la réponse de yannba
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 30 janv. 2006 à 23:27
0
Utile
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.
Commenter la réponse de cs_Delphiprog
yannba 139 Messages postés mercredi 4 janvier 2006Date d'inscription 7 septembre 2010 Dernière intervention - 31 janv. 2006 à 12:25
0
Utile
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é").
Commenter la réponse de yannba
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 31 janv. 2006 à 23:35
0
Utile
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.
Commenter la réponse de cs_Delphiprog
yannba 139 Messages postés mercredi 4 janvier 2006Date d'inscription 7 septembre 2010 Dernière intervention - 1 févr. 2006 à 11:03
0
Utile
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.
Commenter la réponse de yannba
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 1 févr. 2006 à 14:22
0
Utile
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.
Commenter la réponse de cs_Delphiprog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.