Як працювати з 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