![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как работать с Data (Pointer) в компоненте TreeView? [D7, XP]
Yellow_D © (2009-02-19 14:59:00)Здравсьвуйте!
Уважаемый мастера, подскажите пожалуйста, как пользоваться Data в компоненте TreeView?
т.е. я хочу, чтобы к индексу была ссылка на документ C:\\1.txt.
Сохранить и загрузить?
p.s. Кода нет :( Поэтому куда копать с данным вопросом не знаю.
С Уважением.
Yellow_D (2009-02-19 22:25:00) [21]Хорошо, я еще раз все поменял. Вместо 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;
Но результат не тот, что хотелось бы.... :(
Медвежонок Пятачок (2009-02-19 22:23:00) [22]ошибка в приведенном коде указана.
что там у тебя на самом деле в реальном коде - никто угадывать не собирается
Yellow_D (2009-02-19 22:21:00) [23]Я уже и так и сяк все менял. В TreeView грузится просто содержимое файла.
т.е. такого содержание:
ветка1
ветка2
дата1
дата2
А должно быть
ветка1
ветка2
Где кликая по узлам в строковой переменной должно отображаться свойство data, т.е. в моем примере это
дата1
дата2
Медвежонок Пятачок (2009-02-19 22:16:00) [24]treeview1.Items[0].Data := StrNew(PChar(SL[i]));
а может не использовать 0, а использовать переменную?
Yellow_D (2009-02-19 22:13:00) [25]
> А что непонятно ?
>
> Загрузил стринглист и бежишь по нему в цикле, читая 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;
Уважаемые мастера, подскажите пожалуйста, где у меня ошибка?
С Уважением
Сергей М. (2009-02-19 16:46:00) [26]
> Yellow_D (19.02.09 16:31) [12]
А что непонятно ?
Загрузил стринглист и бежишь по нему в цикле, читая i-ю строку, делая ее копию (StrNew) и присваивая указатель на копию св-ву Data i-го же элемента дерева ..
Amoeba (2009-02-19 16:36:00) [27]Убери везде 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
Yellow_D (2009-02-19 16:33:00) [28]
> SL.Strings[i]
Не пойму. Ребята, поподробнее можно?
clickmaker (2009-02-19 16:32:00) [29]SL.Strings[i]
Yellow_D (2009-02-19 16:31:00) [30]
> Если дерево сравнительно небольшое, то вполне сойдет
Я планирую завести в дереве приблизительно около 500 записей.
p.s. Сергей, я никак не могу сообразить обратную процедуру - т.е. загрузить обратно в дерево сохраненные значения в файл :(
Подскажите пожалуйста, куда дальше копать?
Я начал так:
var
FS: TFileStream; //поток
SL: TStringList; //стринглист для загрузки
i: Integer;
begin
FS := TFileStream.Create('c:\проверка.dat', fmCreate); //создать
SL := TStringList.Create;
try
TreeView1.loadToStream(FS);
{мозги тормозят на этом участке, что дальше я не могу догадаться.}
{аж стыдно - задачка примитивная}
SL.LoadToStream(FS);
finally
SL.Free; //закрою после загрузки
FS.Free;
Сергей М. (2009-02-19 16:15:00) [31]
> Yellow_D (19.02.09 16:09) [10]
Если дерево сравнительно небольшое, то вполне сойдет
Yellow_D (2009-02-19 16:09:00) [32]Сообразил сохранение данных как самих узлов так и их значений data в отдельный файл. Вроде бы работает.
var
FS: TFileStream; //поток
SL: TStringList; //стринглист для загрузки
i: Integer; //для пробежки в цикле
begin
FS := TFileStream.Create('c:\проверка.dat', fmCreate); //создал...
SL := TStringList.Create; //поместил.
try
TreeView1.SaveToStream(FS); //пробегаю по всему списку и сразу в файл
for i:=0 to treeview1.Items.Count - 1 do
SL.Add(PChar(treeview1.Items[i].Data)); //занчения свойства узлов...
SL.SaveToStream(FS);
finally
SL.Free; //закрою...
FS.Free;
end;
Сергей М. (2009-02-19 16:01:00) [33]
> Может использовать поток?
Можно и поток. И даже нужно.
Ega23 (2009-02-19 15:59:00) [34]
> все исправил
Не всё.
Yellow_D (2009-02-19 15:49:00) [35]Нашел свои ошибки, все исправил и все заработало.
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.TreeView1.Items.Add(nil,edit1.Text);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.TreeView1.Items.AddChild (form1.TreeView1.Selected,'document');
form1.TreeView1.Items[0].Data:=strnew('C:\\1.txt');
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
shellapi.ShellExecute(application.Handle,'open', form1.TreeView1.Items[0].Data ,nil,nil,sw_show);
end;
Только теперь не понимаю, как это все сохранить в файл и потом загрузить для дальнейшей работы.
Может использовать поток?
Ega23 (2009-02-19 15:48:00) [36]
> Но мне немного не понятна сама технология работы с данным
> свойством (т.е. data). Подскажите пожалуйста, как с ним
> правильно работать?
Да как работать.... Data - это просто указатель. Указывать может на что угодно. На объект, на строку, на структуру и т.п.
Работать - создать "что-то", получить указатель на это "что-то", приравнять свойство Data этому указателю, после того, как станет ненужно - удалить "что-то".
clickmaker (2009-02-19 15:46:00) [37]может, все-так так?
Node := TreeView1.Items.AddChild (TreeView1.Selected,'document');
Node.Data:=strnew('C:\\1.txt');
еще неплохо проверять TreeView1.Selected на nil, если кнопка не запрещается явно
Yellow_D (2009-02-19 15:44:00) [38]
> Индексация Items с какого значения начинается? :)
Понимаю. Это моя ошибка :) Индексация с нуля.
> Общие соображения по коду: код полное г...но
:(
> Извините
Прощаю.
Но мне немного не понятна сама технология работы с данным свойством (т.е. data). Подскажите пожалуйста, как с ним правильно работать?
С УВАЖЕНИЕМ!
Ega23 (2009-02-19 15:38:00) [39]Индексация Items с какого значения начинается? :)
Общие соображения по коду: код полное г...но. Извините.
Yellow_D (2009-02-19 15:28:00) [40]Спасибо!
Я вот тока что экспериментирую в таком духе. Но не пашет.
Посмотрите, что не так.
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.TreeView1.Items.Add(nil,edit1.Text);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.TreeView1.Items.AddChild (form1.TreeView1.Selected,'document');
form1.TreeView1.Items[2].Data:=strnew('C:\\1.txt');
end;
procedure TForm1.TreeView1Click(Sender: TObject);
begin
shellapi.ShellExecute(application.Handle,'open', form1.TreeView1.Items[1].Data ,nil,nil,sw_show);
end;
end.