Cum se lucrează cu datele (pointer) în componenta de vizualizare a copacilor

Cum să lucrați cu datele (pointer) în componenta TreeView?

procedura TreeView_OnDeletion (expeditor: TObject; nod: TTreeNode)
începe
# xA0; StrDispose (Node.Data);

Aici am să experimentez asta într-un astfel de spirit. Dar nu arata.






Uită-te la ce sa întâmplat.

procedura TForm1.Button1Click (expeditor: TObject);
începe
# xA0; form1.TreeView1.Items.Add (nul, edita1.Text);
se încheie;

procedura TForm1.Button2Click (expeditor: TObject);
începe
# xA0; form1.TreeView1.Items.AddChild (form1.TreeView1.Selectat, "document");
# xA0; form1.TreeView1.Items [2] .Data: = strnew ("C: \\ 1.txt");
se încheie;

procedura TForm1.TreeView1Click (expeditor: TObject);
începe
# xA0; shellapi.ShellExecute (aplicație.Handle, "deschis", form1.TreeView1.Items [1] .Data, zero, zero, sw_show);
se încheie;

Indexarea elementelor de la ce valoare începe? # xA0; :)

Observații generale pentru cod: codul este plin g. Dar. # xA0; Ne pare rău.


> Indexarea elementelor de la care începe valoarea? # xA0; :)

Înțeleg. Aceasta este greșeala mea :) Indexarea de la zero.


> Considerații generale pentru cod: codul este plin

Dar nu înțeleg tehnologia de a lucra cu această proprietate (datele în sine). Te rog spune-mi cum să lucrez cu el corect?

Poate, tot așa?

Nod: = TreeView1.Items.AddChild (TreeView1.Selected, "document");
Node.Data:=strnew("C:\\1.txt ");

este bine să verificați TreeView1.Selectat pe zero, dacă butonul nu este explicit interzis


> Dar nu înțeleg tehnologia de lucru cu aceste date
> proprietate (adică date). Prompt vă rog, ca și cu ea
> Pentru a lucra corect?

Da, cum să lucrezi. Datele sunt doar un indicator. Puteți indica orice. Pe un obiect, pe o linie, pe o structură și așa mai departe.
Lucrați - creați "ceva", obțineți un pointer la acest "ceva", echivalați proprietatea Date cu acest pointer, după ce devine inutil - ștergeți "ceva".

Mi-am găsit greșelile, am corectat totul și totul a mers.


procedura TForm1.Button1Click (expeditor: TObject);
începe
# xA0; form1.TreeView1.Items.Add (nul, edita1.Text);
se încheie;

procedura TForm1.Button2Click (expeditor: TObject);
începe
# xA0; form1.TreeView1.Items.AddChild (form1.TreeView1.Selectat, "document");
# xA0; form1.TreeView1.Items [0] .Data: = strnew ("C: \\ 1.txt");
se încheie;

procedura TForm1.Button3Click (expeditor: TObject);
începe
# xA0; shellapi.ShellExecute (application.Handle, "open", form1.TreeView1.Items [0] .Data, zero, zero, sw_show);
se încheie;

Numai acum nu înțeleg cum să salvez toate acestea într-un fișier și apoi să-l descarc pentru o muncă ulterioară.
Pot folosi fir?


> Pot folosi fluxul?

Puteți, de asemenea, curge. Și chiar necesar.

M-am gândit să stochez datele ambelor noduri și valorile lor de date într-un fișier separat. Se pare că funcționează.


var
FS: TFileStream; // thread
SL: TStringList; # xA0; // lista de șir pentru descărcare
i: Integer; # xA0; # xA0; # xA0; # xA0; // pentru o alergare într-o buclă
începe
FS: = TFileStream.Create ("c: \ verificare.dat", fmCreate); // creat.
SL: = TStringList.Create; // pune-l.
încerca
# xA0; TreeView1.SaveToStream (FS); # xA0; // alerg prin întreaga listă și imediat în fișier
# xA0; pentru i: = 0 la treeview1.Items.Count - 1 face
# xA0; # xA0; SL.Add (PChar (treeview1.Items [i] .Data)); // proprietățile nodurilor.
# xA0; SL.SaveToStream (FS);
în cele din urmă
# xA0; SL.Free; # xA0; // Voi închide.
# xA0; FS.Free;
se încheie;

Dacă pomul este relativ mic, acesta va coborî complet


> Dacă arborele este relativ mic, acesta va coborî complet

Am de gând să am aproximativ 500 de intrări în copac.

P.S. Serghei, nu-mi dau seama de procedura inversă - adică încărcați înapoi valorile salvate în fișier :(

Te rog, spune-mi unde să mai săpat?

Nu înțeleg. Băieți, mai multe detalii pot fi?

Eliminați pretutindeni Form1 nafig de la manipulatorii de evenimente, până când loviturile nu au lovit:







procedura TForm1.Button1Click (expeditor: TObject);
începe
TreeView1.Items.Add (nul, edita1.Text);
se încheie;

procedura TForm1.Button2Click (expeditor: TObject);
începe
TreeView1.Items.AddChild (form1.TreeView1.Selectat, "document");
TreeView1.Items [0] .Data: = strnew ("C: \\ 1.txt");
ro

Și ce nu este clar?

A încărcat lista de șir și a alerga de-a lungul acesteia într-o buclă, a citi linia i, a face copia (StrNew) și a atribui un pointer unei copii a elementului Data i-i-a arborelui.


> Și ce nu este clar?
>
> Încărcat lista de șir și alerga de-a lungul ei într-o buclă, citind i-lea
> șir, făcând copia sa (StrNew) și atribuind un pointer la
> o copie a datelor din elementul i al arborelui.

Am încercat așa, dar ceva nu este în regulă. În arborele de arbori se obține atât acest lucru cât și altul și toate acestea în grabă.

procedura TForm1.Button2Click (expeditor: TObject);
var
s: String;
pStr: PChar;
FS: TFileStream;
începe
FS: = TFileStream.Create ("c: \ check.dat", fmOpenRead);
SL: = TStringList.Create; // șirul de șir
încerca
treeview1.LoadFromStream (FS);
SL.LoadFromStream (FS);
pentru i: = 0 la SL.Count-1 nu // se execută în buclă.
arhitect.Items [0]. Date: = StrNew (PChar (SL [i]));
în cele din urmă
SL.Free;
FS.Free;
se încheie;

Dragi stăpâni, spune-mi rog, unde este greșeala mea?
Cu respect

Și nu pot folosi 0 și folosesc o variabilă?

Și ar trebui să fie

vetka1
vetka2

Atunci când faceți clic pe noduri într-o variabilă de șir, ar trebui să fie afișată proprietatea datelor, adică în exemplul meu acest lucru este

Date1
Date2

este specificată eroarea din codul de mai sus.

că acolo aveți de fapt în cod real - nimeni nu va ghici

Am schimbat totul din nou. În loc de 0, specificăm o variabilă, adică eu


procedura TForm1.Button2Click (expeditor: TObject);
var
s: String;
pStr: PChar;
FS: TFileStream;
începe
FS: = TFileStream.Create ("c: \ check.dat", fmOpenRead);
SL: = TStringList.Create; // șirul de șir
încerca
treeview1.LoadFromStream (FS);
SL.LoadFromStream (FS);
pentru i: = 0 la SL.Count-1 nu // se execută în buclă.
arhitect.Items [0]. Date: = StrNew (PChar (SL [i]));
în cele din urmă
SL.Free;
FS.Free;
se încheie;

Dar rezultatul nu este ceea ce aș vrea. (


procedura TForm1.Button2Click (expeditor: TObject);
var
s: String;
pStr: PChar;
FS: TFileStream;
începe
FS: = TFileStream.Create ("c: \ check.dat", fmOpenRead);
SL: = TStringList.Create; // șirul de șir
încerca
treeview1.LoadFromStream (FS);
SL.LoadFromStream (FS);
pentru i: = 0 la SL.Count-1 nu // se execută în buclă.
arhitectură.Items [i]. Date: = StrNew (PChar (SL [i]));
în cele din urmă
SL.Free;
FS.Free;
se încheie;

Nu vă răzgândiți, schimbați codul sursă

arhitectură.Items [i]. Date: = StrNew (PChar (SL [i]));

Ei bine zashibis. schimbat.
descărcare.
acum cod de afișare dreapta


> acum codul de afișare corect

E vorba despre asta și întreabă.
Cum?

aproximativ la fel ca și codul de boot

Nu ajunge. Maeștrii îmi spun, te rog!

Ești prost sau prefăcut?
Se spune la fel


> atribuirea unui pointer unei copii a datelor elementului i
> lemn


> du-te la culcare

Înseamnă că sunt un laș!
Nu voi adormi până nu-mi dau seama. Am ales-o - înseamnă că am trecut până la urmă!
Am sapat acest proiect de o jumatate de zi, acum este un impas si nu stiu cum sa ies din acesta, unde sa gasesc calea.
Există doar câteva linii în cod și pentru un începător nu este întotdeauna ușor să găsești o eroare și să o elimini. Așa că și gândiți-vă. Tu, cu experiență, te-ai întors pentru ajutor și sfat, și nu să asculți, așa cum toată lumea știe delphi mai bine decât oricine altcineva. Este insultător!

Serghei, am scris totul așa cum ai sfătuit și așa cum ai crezut.


var
s: String;
pStr: PChar;
FS: TFileStream;
începe
FS: = TFileStream.Create ("c: \ check.dat", fmOpenRead);
SL: = TStringList.Create; // șirul de șir
încerca
treeview1.LoadFromStream (FS);
SL.LoadFromStream (FS);
pentru i: = 0 la SL.Count-1 nu // se execută în buclă.
arhitectură.Items [i]. Date: = StrNew (PChar (SL [i]));
în cele din urmă
SL.Free;
FS.Free;

TreeView este populate cu tot conținutul din fișier, adică numele nodurilor și valorile proprietății de date plus tot.
Să ne uităm din nou.


pentru i: = 0 la SL.Count-1 do // în buclă, începând de la primul element, alerg prin întreaga listă de șir.
arhitectură.Items [i]. Date: = StrNew (PChar (SL [i])); // apoi completați componenta cu valori și adăugați proprietatea Date la noduri.

Spui că există o eroare în cod. Sunt de acord, nu mă cert, pentru că rezultatul nu este același. Atunci, care este eroarea sau care lipsește în cod?

În plus față de codul de descărcare, există și un cod de afișare. nimeni nu la văzut aici.


> există încă un cod de cartografiere

Am înțeles deja acest lucru din posturile de mai sus.
Vă rog să-mi spuneți ce este implementarea acestui cod.
De unde să începeți, unde să priviți și ce să vă sprijiniți.

implementarea trebuie să fie corectă.
aflați elementele de bază ale programării.
se bazează pe ajutor.


> implementarea trebuie să fie corectă.
> studiați elementele de bază ale programării.
> se bazează pe ajutor.


> implementarea trebuie să fie corectă.
> studiați elementele de bază ale programării.
> se bazează pe ajutor.

Ei bine, atunci ne urcăm în piscina genetică și vedem acolo ordinea reală de eludare a nodurilor copacului atunci când sunt conservate:


procedura TTreeStrings.SaveTreeToStream (Stream: TStream);
..
începe
..
# xA0; # xA0; ANode: = Proprietar [0]; // echivalent cu TreeView.Items.GetFirstNode
# xA0; # xA0; în timp ce ANode <> nil nu
# xA0; # xA0; începeți
.
# xA0; # xA0; # xA0; ANode: = ANode.GetNext;
# xA0; # xA0; sfârșitul;
# xA0; sfârșitul;
se încheie;

Rezultă că dacă salvați datele în nodurile de date în scopul recuperării corecte ulterioare, trebuie să respectați această ordine de eludare.

Memorie: 0,81 MB
Timp de timp: 0.054 sec







Articole similare

Trimiteți-le prietenilor: