Як працювати з data (pointer) в компоненті treeview

Як працювати з Data (Pointer) в компоненті TreeView?

procedure TreeView_OnDeletion (Sender: TObject; Node: TTreeNode)
begin
# XA0; StrDispose (Node.Data);

Я ось струму що експериментую в такому дусі. Але не оре.
Подивіться, що не так.

procedure TForm1.Button1Click (Sender: TObject);
begin
# XA0; form1.TreeView1.Items.Add (nil, edit1.Text);
end;

procedure TForm1.Button2Click (Sender: TObject);
begin
# XA0; form1.TreeView1.Items.AddChild (form1.TreeView1.Selected, "document");
# XA0; form1.TreeView1.Items [2] .Data: = strnew ( "C: \\ 1.txt");
end;

procedure TForm1.TreeView1Click (Sender: TObject);
begin
# XA0; shellapi.ShellExecute (application.Handle, "open", form1.TreeView1.Items [1] .Data, nil, nil, sw_show);
end;

Індексація Items з якого значення починається? # XA0; :)

Загальні міркування за кодом: код повне р але. # XA0; Вибачте.


> Індексація Items з якого значення починається? # XA0; :)

Розумію. Це моя помилка :) Індексація з нуля.


> Загальні міркування за кодом: код повне р але

Але мені трохи незрозуміла сама технологія роботи з даними властивістю (тобто data). Підкажіть будь ласка, як з ним правильно працювати?

може, все-так так?

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

ще непогано перевіряти TreeView1.Selected на nil, якщо контроль не забороняється явно


> Але мені трохи незрозуміла сама технологія роботи з даними
> Властивістю (тобто data). Підкажіть будь ласка, як з ним
> Правильно працювати?

Так як працювати. Data - це просто покажчик. Вказувати може на що завгодно. На об'єкт, на рядок, на структуру і т.п.
Працювати - створити "щось", отримати покажчик на це "щось", прирівняти властивість Data цього вказівником, після того, як стане непотрібно - видалити "щось".

Знайшов свої помилки, все виправив і все запрацювало.


procedure TForm1.Button1Click (Sender: TObject);
begin
# XA0; form1.TreeView1.Items.Add (nil, edit1.Text);
end;

procedure TForm1.Button2Click (Sender: TObject);
begin
# XA0; form1.TreeView1.Items.AddChild (form1.TreeView1.Selected, "document");
# XA0; form1.TreeView1.Items [0] .Data: = strnew ( "C: \\ 1.txt");
end;

procedure TForm1.Button3Click (Sender: TObject);
begin
# XA0; shellapi.ShellExecute (application.Handle, "open", form1.TreeView1.Items [0] .Data, nil, nil, sw_show);
end;

Тільки тепер не розумію, як це все зберегти в файл і потім завантажити для подальшої роботи.
Може використовувати потік?


> Може використовувати потік?

Можна і потік. І навіть потрібно.

Зрозумів збереження даних як самих вузлів так і їх значень data в окремий файл. Начебто працює.


var
FS: TFileStream; // потік
SL: TStringList; # XA0; // стрінгліст для завантаження
i: Integer; # XA0; # XA0; # XA0; # XA0; // для пробіжки в циклі
begin
FS: = TFileStream.Create ( "c: \ проверка.dat", fmCreate); // створив.
SL: = TStringList.Create; // помістив.
try
# XA0; TreeView1.SaveToStream (FS); # XA0; // пробігаю по всьому списку і відразу в файл
# XA0; for i: = 0 to treeview1.Items.Count - 1 do
# XA0; # XA0; SL.Add (PChar (treeview1.Items [i] .Data)); // занчение властивості вузлів.
# XA0; SL.SaveToStream (FS);
finally
# XA0; SL.Free; # XA0; // закрию.
# XA0; FS.Free;
end;

Якщо дерево порівняно невелике, то цілком зійде


> Якщо дерево порівняно невелике, то цілком зійде

Я планую завести в дереві приблизно близько 500 записів.

p.s. Сергій, я ніяк не можу збагнути зворотну процедуру - тобто завантажити назад в дерево записані часові в файл :(

Підкажіть будь ласка, куди далі копати?

Не зрозумію. Хлопці, детальніше можна?

Прибери всюди Form1 нафіг з обробників подій, поки стусанів НЕ надавали:

procedure TForm1.Button1Click (Sender: TObject);
begin
TreeView1.Items.Add (nil, edit1.Text);
end;

procedure TForm1.Button2Click (Sender: TObject);
begin
TreeView1.Items.AddChild (form1.TreeView1.Selected, "document");
TreeView1.Items [0] .Data: = strnew ( "C: \\ 1.txt");
en

А що незрозуміло?

Завантажив стрінгліст і біжиш по ньому в циклі, читаючи i-й рядок, роблячи її копію (StrNew) і привласнюючи покажчик на копію св-ву Data i-го ж елемента дерева.


> А що незрозуміло?
>
> Завантажив стрінгліст і біжиш по ньому в циклі, читаючи i-ю
> Рядок, роблячи її копію (StrNew) і привласнюючи покажчик на
> Копію св-ву Data i-го ж елемента дерева.

Я спробував так, але щось не так. У treeview потрапляє і те й інше і все це скопом.

procedure TForm1.Button2Click (Sender: TObject);
var
s: String;
pStr: PChar;
FS: TFileStream;
begin
FS: = TFileStream.Create ( "c: \ проверка.dat", fmOpenRead);
SL: = TStringList.Create; // стрінгліст
try
treeview1.LoadFromStream (FS);
SL.LoadFromStream (FS);
for i: = 0 to SL.Count-1 do // бігу в циклі.
treeview1.Items [0] .Data: = StrNew (PChar (SL [i]));
finally
SL.Free;
FS.Free;
end;

Шановні майстри, підкажіть будь ласка, де у мене помилка?
З повагою

а може не використовувати 0, а використовувати змінну?

А повинно бути

ветка1
ветка2

Де клікаючи по вузлах в строкової змінної повинно відображатися властивість data, тобто в моєму прикладі це

дата1
дата2

помилка в наведеному коді вказана.

що там у тебе насправді в реальному коді - ніхто вгадувати не збирається

Добре, я ще раз все поміняв. Замість 0 вказую змінну, тобто i


procedure TForm1.Button2Click (Sender: TObject);
var
s: String;
pStr: PChar;
FS: TFileStream;
begin
FS: = TFileStream.Create ( "c: \ проверка.dat", fmOpenRead);
SL: = TStringList.Create; // стрінгліст
try
treeview1.LoadFromStream (FS);
SL.LoadFromStream (FS);
for i: = 0 to SL.Count-1 do // бігу в циклі.
treeview1.Items [0] .Data: = StrNew (PChar (SL [i]));
finally
SL.Free;
FS.Free;
end;

Але результат не той, що хотілося б. (


procedure TForm1.Button2Click (Sender: TObject);
var
s: String;
pStr: PChar;
FS: TFileStream;
begin
FS: = TFileStream.Create ( "c: \ проверка.dat", fmOpenRead);
SL: = TStringList.Create; // стрінгліст
try
treeview1.LoadFromStream (FS);
SL.LoadFromStream (FS);
for i: = 0 to SL.Count-1 do // бігу в циклі.
treeview1.Items [i] .Data: = StrNew (PChar (SL [i]));
finally
SL.Free;
FS.Free;
end;

Ти не в розумі міняй, ти в исходнике міняй

treeview1.Items [i] .Data: = StrNew (PChar (SL [i]));

ну зашибісь. поміняв.
завантаження.
тепер правуй код відображення


> Тепер правуй код відображення

Ось про це і питаю.
Як?

приблизно так само як і код завантаження

Чи не доходить. Майстри підкажіть будь ласка!

Ти й справді тупий або прикидаєшся?
сказано ж


> Привласнюючи покажчик на копію св-ву Data i-го ж елемента
> дерева


> Ляж поспи

Це означає, я боягуз!
Чи не засну, поки не розберуся. Я це вибрав - значить повинен до останнього!
Я над цим проектом півдня копаю, зараз глухий кут і не знаю як з нього вилізти, де вихід шукати.
У коді всього кілька рядків, і для початківця це не завжди просто знайти помилку і усунути. Так само і думати. Ви з досвідом і до Вас звернувся за допомогою і консультацією, а не слухати, як все тут краще за інших знають delphi. Прикро дуже!

Сергій, я ж все написав так, як ви порадили і так само як розумів.


var
s: String;
pStr: PChar;
FS: TFileStream;
begin
FS: = TFileStream.Create ( "c: \ проверка.dat", fmOpenRead);
SL: = TStringList.Create; // стрінгліст
try
treeview1.LoadFromStream (FS);
SL.LoadFromStream (FS);
for i: = 0 to SL.Count-1 do // бігу в циклі.
treeview1.Items [i] .Data: = StrNew (PChar (SL [i]));
finally
SL.Free;
FS.Free;

TreeView заповнюється усім вмістом з файлу, тобто імена вузлів і значення властивості Data плюс до всього.
Давайте ще раз подивимося.


for i: = 0 to SL.Count-1 do // в циклі починаючи з першого елемента пробігаю по всьому стрінглісту.
treeview1.Items [i] .Data: = StrNew (PChar (SL [i])); // далі заповнюю компонент значеннями і додаючи властивість Data до вузлів.

Ви говорите що є помилка в коді. Я згоден, не сперечаюся, так як результат не той. Тоді в чому ж тоді помилка, або щось пропущено в коді?

крім коду завантаження є ще код відображення. його тут ніхто не бачив.


> Є ще код відображення

Я це вже зрозумів з постів вище.
Прошу підказати мені яка реалізація даного коду.
З чого почати, куди дивитися і на що спиратися.

реалізація повинна бути правильна.
вивчати основи программіованія.
спиратися на хелп.


> Реалізація повинна бути правильна.
> Вивчати основи программіованія.
> Спиратися на хелп.


> Реалізація повинна бути правильна.
> Вивчати основи программіованія.
> Спиратися на хелп.

Ну тоді ліземо в генофонд і бачимо там дійсний порядок обходу вузлів дерева при їх збереженні:


procedure TTreeStrings.SaveTreeToStream (Stream: TStream);
..
begin
..
# XA0; # XA0; ANode: = Owner [0]; // еквівалент TreeView.Items.GetFirstNode
# XA0; # XA0; while ANode <> nil do
# XA0; # XA0; begin
.
# XA0; # XA0; # XA0; ANode: = ANode.GetNext;
# XA0; # XA0; end;
# XA0; end;
end;

Звідси випливає, що при збереженні св-в Data вузлів з метою подальшого правильного відновлення необхідно дотримуватися саме такого порядку обходу.

Пам'ять: 0.81 MB
Час: 0.054 c

Схожі статті