Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как работать с Data (Pointer) в компоненте TreeView? [D7, XP]


Страницы:   1 2 3

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.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо