Bonjour,
Comment peut on sauvegarder plusieurs colonnes d'un virtualtreeview?
Merci d'avance
Version imprimable
Bonjour,
Comment peut on sauvegarder plusieurs colonnes d'un virtualtreeview?
Merci d'avance
Salut :D
Qu'entends-tu par "sauvegarder" ?
Si c'est les données de chaque colonne, si tu as codé correctement, il suffit d'enregistrer les données sur lesquelles chacun des noeuds pointent ;)
salut,
explique toi un peu, car il est un peu nul le garçon a qui tu t'adresse...
eh oui, je sais je sais mais autodidact et quand il a le temp..
ce que je veux dire: [sauvegarder les donnees (nodes) du tableau qui est sur plusieurs colonnes.]
cette commande ne me sauvegarde que la premiere colonne:
Code:vst2.SaveToFile(c:\sauvegarde.dat);
Mon code d'origine :
cordialementCode:
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216 procedure TForm1.ListeMusiqueClick(Sender: TObject); var Repertoire : string; savartiste,savtitre, savalbum: string; minute, seconde : integer; DureeMp3 : string; begin NombreMp3 :=0; fillchar(TableauMP3,sizeof(TableauMP3),0); // vider tout le tableau {determine le repertoire à scruter} Repertoire := FolderList.Directory; // On recupere le repertoire selectionné if CompareStr(copy(Repertoire,length(Repertoire),1),'\')<>0 then Repertoire := Repertoire + '\'; TrouverRepertoire(Repertoire); // appel de la procedure TrouverRepertoire NombreMp3:=0; while NombreMp3<=strtoint(edit5.Text) do begin MPEGaudio := TMPEGaudio.Create; if MPEGaudio.ReadFromFile(TableauMP3[NombreMp3].Chemin)then begin minute:= (trunc(MPEGaudio.Duration/60)); seconde:= (trunc(((MPEGaudio.Duration/60)-(minute))*60)); if seconde>=10 then DureeMp3:=inttostr(minute) + ':' + inttostr(seconde) else DureeMp3:=inttostr(minute) + ':' + '0'+ inttostr(seconde); end; MPEGaudio.Free; FileTag := TID3v2.Create; FileTag.ReadFromFile (TableauMP3[NombreMp3].Chemin); if Filetag.Exists then begin if filetag.Artist=savartiste then begin if VST2.HasChildren[Node] then begin node:=vst2.AddChild(nil); Data:=vst2.GetNodeData(Node); Data.ARTISTE:=FileTag.ARTIST; Data.Genre:=FileTag.Genre; if filetag.Title<>savtitre then begin node:=vst2.AddChild(node); Data:=vst2.GetNodedata(Node); Data.Album:=FileTag.Album; Data.Genre:=FileTag.Genre; Data.Piste:=FileTag.Track; Data.titre:=FileTag.Title; data.Chemin:= TableauMP3[NombreMp3].Chemin; Data.Duree:=DureeMp3; end; end else begin node:=node.Parent; node:=vst2.AddChild(node); Data:=vst2.GetNodeData(node); Data.Album:=FileTag.Album; Data.Genre:=FileTag.Genre; Data.Piste:=FileTag.Track; Data.titre:=FileTag.Title; data.Chemin:= TableauMP3[NombreMp3].Chemin; Data.Duree:=DureeMp3; end; end else begin node:=vst2.AddChild(nil); Data:=vst2.GetNodeData(Node); Data.ARTISTE:=FileTag.ARTIST; Data.Genre:=FileTag.Genre; data.Chemin:= TableauMP3[NombreMp3].Chemin; Node:=VST2.AddChild(Node); Data:=vst2.GetNodedata(Node); Data.Album:=FileTag.Album; Data.Genre:=FileTag.Genre; Data.Piste:=FileTag.Track; Data.titre:=FileTag.Title; data.Chemin:= TableauMP3[NombreMp3].Chemin; Data.Duree:=DureeMp3; end; end; savartiste:= filetag.Artist; savtitre:= filetag.title; savalbum:= FileTag.Album; inc(NombreMp3); // connaitre le nombre de MP3 trouvés VST2.Header.SortColumn:=4; VST2.Header.SortDirection := sdAscending; VST2.Header.SortColumn:=1; VST2.Header.SortDirection := sdAscending; VST2.Header.SortColumn:=0; VST2.Header.SortDirection := sdAscending; FileTag.Free; end; end; procedure TForm1.TrouverRepertoire(Chemin : String); var Recherche : TSearchRec ; Trouver : Boolean; begin {On arrive dans un repertoire, on cherche tous les mp3 puis on cherche les repertoires. Si on trouve un repertoire, on "rentre dedans" et on recommence le processus...} TrouverFichier(Chemin,'*.mp3'); // Permet de lister tous les fichiers determinés d'un repertoire Try Trouver := (FindFirst(Chemin+'*.*',faDirectory,Recherche) = 0) ; while (Trouver) do begin {"." étant le meme repertoire (evite une boucle), ".." étant le repertoire pere} If (Recherche.Name <> '.') and (Recherche.Name <> '..') and ((Recherche.Attr and faDirectory) <> 0) Then Begin TrouverRepertoire(Chemin+Recherche.Name+'\'); Trouver := (FindNext(Recherche) = 0) ; end else Trouver := (FindNext(Recherche) = 0); end; Finally FindClose(Recherche) ; { <= IMPERATIF pour libérer ressources Win32 } end; end; {Trouve tout les fichier d'un répertoire} Procedure TForm1.TrouverFichier(Chemin : String ; Masque : String); var Recherche : TSearchRec ; Trouver : Boolean; begin Try Trouver := (FindFirst(Chemin+Masque,FaAnyFile,Recherche) = 0) ; while (Trouver) do begin setlength(TableauMP3,NombreMp3+1); // tableau dynamique car on ne connait pas le nombre de MP3 TableauMP3[NombreMp3].Chemin := (Chemin+Recherche.Name); // chemin + le nom TableauMP3[NombreMp3].MP3 := copy(Recherche.Name,1,Length(Recherche.Name)-4); // le nom sans ".mp3" inc(NombreMp3); // connaitre le nombre de MP3 trouvés edit5.Text:= inttostr(NombreMp3-1); Trouver := (FindNext(Recherche) = 0) ; end; Finally FindClose(Recherche) ; { <= IMPERATIF pour libérer ressources Win32 } end; end; procedure TForm1.SuppSelClick(Sender: TObject); begin vst2.BeginUpdate; vst2.DeleteSelectedNodes; vst2.EndUpdate; end; procedure TForm1.SuppToutClick(Sender: TObject); begin vst2.OnFreeNode := nil; vst2.Clear; SetLength(TableauMP3,0); vst2.OnFreeNode := vst2FreeNode end; procedure TForm1.SaveListClick(Sender: TObject); begin vst2.SaveToFile(drivecombobox1.text + '\' + edit1.text); end; procedure TForm1.LoadListClick(Sender: TObject); begin vst2.LoadFromFile(drivecombobox1.text + '\' + edit1.text); end; procedure TForm1.VST2SaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); var Len: integer; begin Data := vst2.GetNodeData(node); Len := Length ( data.ARTISTE + data.TITRE); Stream.Write(Len, Sizeof (Len)); Stream.Write(PChar( data.ARTISTE + data.TITRE )^, Len); end; procedure TForm1.VST2LoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); var Len: integer; begin Data := vst2.GetNodeData(node); Stream.Read(Len, Sizeof (Len)); SetLength(data.ARTISTE, Len); Stream.read(PChar( data.ARTISTE)^, Len); end; procedure TForm1.VST2Click(Sender: TObject); var minute, seconde : integer; begin FileTag := TID3v2.Create; ClearAll; if data.Chemin = '' then exit; if FileExists(data.Chemin) then if FileTag.ReadFromFile(data.Chemin) then if FileTag.Exists then begin TagExistsValue.Text := 'Oui'; VersionValue.Text := '2.' + IntToStr(FileTag.VersionID); SizeValue.Text := IntToStr(FileTag.Size) + ' octets'; TitleEdit.Text := FileTag.Title; ArtistEdit.Text := FileTag.Artist; AlbumEdit.Text := FileTag.Album; if FileTag.Track > 0 then TrackEdit.Text := IntToStr(FileTag.Track); YearEdit.Text := FileTag.Year; GenreEdit.Text := FileTag.Genre; CommentEdit.Text := FileTag.Comment; edit6.Text := ''; end else TagExistsValue.Text := 'Non' else ShowMessage('Erreur lors de la lecture de: ' + Data.TITRE) else ShowMessage('Le fichier n''existe pas: ' + Data.TITRE); FileTag.Free; MPEGaudio := TMPEGaudio.Create; if MPEGaudio.ReadFromFile(data.Chemin)then begin minute:= (trunc(MPEGaudio.Duration/60)); seconde:= (trunc(((MPEGaudio.Duration/60)-(minute))*60)); if MPEGaudio.Valid then edit6.text := inttostr(minute)+ ':'+ inttostr(seconde);//FormatDateTime ('h:nn:ss', minute / (24.0 * 60 * 60 * 1000));//FormatFloat('.0', MPEGaudio.Duration) + ' sec.' end else edit6.text := ''; MPEGaudio.Free; end;
Ouch :? ....
Edite ton post et mets les balises code ainsi que l'indentation de ton code... Avant de te faire hurler dessus ;)
merci,
Est-ce que j'ai bien tout compris ce que tu viens de me dire?
excuse moi c'est la premiere fois que je post quelque chose dans le forum. Je n'ais pas encors tout bien compris.
Cordialement
Salut :D
Je me demandais un truc:
pourquoi tu fais SaveToFile sur ton TVirtualTreeView alors que tu as une structure de données? Au lieu de passer par le TVirtualTreeView, fait une méthode SaveToFile qui enregistre le tableau TableauMP3... ;)
Sinon, il semble que tu fasses un amalgame avec les pointeurs dans VST2SaveNode... Donne les déclarations de Data...
bonsoir,
enregistrer le tableau c'est bien, mais avec 30 000 morceaux de musiques c'est long a traiter après.
d'ailleur j'ai un autre souci, au bout de 11500 morceau traiter le systeme me dit gentillement: not enough Memory!!!!!
cordialement