Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.12;
Скачать: CL | DM;

Вниз

Как работать с Data (Pointer) в компоненте TreeView?   Найти похожие ветки 

 
Yellow_D   (2009-02-19 14:59) [0]

Здравсьвуйте!

Уважаемый мастера, подскажите пожалуйста, как пользоваться Data  в компоненте TreeView?
т.е. я хочу, чтобы к индексу была ссылка на документ C:\\1.txt.
Сохранить и загрузить?
p.s. Кода нет :( Поэтому куда копать с данным вопросом не знаю.

С Уважением.


 
clickmaker ©   (2009-02-19 15:15) [1]

.Data := StrNew("C:\\1.txt");

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


 
Yellow_D   (2009-02-19 15:28) [2]

Спасибо!

Я вот тока что экспериментирую в таком духе. Но не пашет.
Посмотрите, что не так.

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.


 
Ega23 ©   (2009-02-19 15:38) [3]

Индексация Items с какого значения начинается?  :)

Общие соображения по коду: код полное г...но.  Извините.


 
Yellow_D   (2009-02-19 15:44) [4]


> Индексация Items с какого значения начинается?  :)


Понимаю. Это моя ошибка :) Индексация с нуля.


> Общие соображения по коду: код полное г...но


:(


> Извините


Прощаю.

Но мне немного не понятна сама технология работы с данным свойством (т.е. data). Подскажите пожалуйста, как с ним правильно работать?

С УВАЖЕНИЕМ!


 
clickmaker ©   (2009-02-19 15:46) [5]

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

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

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


 
Ega23 ©   (2009-02-19 15:48) [6]


> Но мне немного не понятна сама технология работы с данным
> свойством (т.е. data). Подскажите пожалуйста, как с ним
> правильно работать?


Да как работать.... Data - это просто указатель. Указывать может на что угодно. На объект, на строку, на структуру и т.п.
Работать - создать "что-то", получить указатель на это "что-то", приравнять свойство Data этому указателю, после того, как станет ненужно - удалить "что-то".


 
Yellow_D   (2009-02-19 15:49) [7]

Нашел свои ошибки, все исправил и все заработало.


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:59) [8]


> все исправил


Не всё.


 
Сергей М. ©   (2009-02-19 16:01) [9]


> Может использовать поток?


Можно и поток. И даже нужно.


 
Yellow_D   (2009-02-19 16:09) [10]

Сообразил сохранение данных как самих узлов так и их значений 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:15) [11]


> Yellow_D   (19.02.09 16:09) [10]


Если дерево сравнительно небольшое, то вполне сойдет


 
Yellow_D   (2009-02-19 16:31) [12]


> Если дерево сравнительно небольшое, то вполне сойдет


Я планирую завести в дереве приблизительно около 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;


 
clickmaker ©   (2009-02-19 16:32) [13]

SL.Strings[i]


 
Yellow_D   (2009-02-19 16:33) [14]


> SL.Strings[i]


Не пойму. Ребята, поподробнее можно?


 
Amoeba ©   (2009-02-19 16:36) [15]

Убери везде 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


 
Сергей М. ©   (2009-02-19 16:46) [16]


> Yellow_D   (19.02.09 16:31) [12]


А что непонятно ?

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


 
Yellow_D   (2009-02-19 22:13) [17]


> А что непонятно ?
>
> Загрузил стринглист и бежишь по нему в цикле, читая 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 22:16) [18]

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

а может не использовать 0, а использовать переменную?


 
Yellow_D   (2009-02-19 22:21) [19]

Я уже и так и сяк все менял. В TreeView грузится просто содержимое файла.
т.е. такого содержание:

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


А должно быть

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


Где кликая по узлам в строковой переменной должно отображаться свойство data, т.е. в моем примере это

дата1
дата2


 
Медвежонок Пятачок ©   (2009-02-19 22:23) [20]

ошибка в приведенном коде указана.

что там у тебя на самом деле в реальном коде - никто угадывать не собирается


 
Yellow_D   (2009-02-19 22:25) [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;


Но результат не тот, что хотелось бы.... :(


 
Yellow_D   (2009-02-19 22:26) [22]

Извиняй! Ошибочка :)

Поправка


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;



 
Медвежонок Пятачок ©   (2009-02-19 22:27) [23]

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

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


 
Yellow_D   (2009-02-19 22:28) [24]

Исх выше.

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


 
Медвежонок Пятачок ©   (2009-02-19 22:30) [25]

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


 
Yellow_D   (2009-02-19 22:32) [26]


> теперь правь код отображения


Вот про это и спрашиваю.....
Как?


 
Медвежонок Пятачок ©   (2009-02-19 22:34) [27]

примерно так же как и код загрузки


 
Yellow_D   (2009-02-19 22:39) [28]

Не доходит. Мастера подскажите пожалуйста!


 
Медвежонок Пятачок ©   (2009-02-19 22:40) [29]

ляг поспи


 
Сергей М. ©   (2009-02-19 22:48) [30]


> Yellow_D   (19.02.09 22:39) [28]


Ты и вправду тупой или прикидываешься ?
Сказано же


> присваивая указатель на копию св-ву Data i-го же элемента
> дерева


Разницу сежду 0 и i видишь ?


 
Yellow_D   (2009-02-19 22:48) [31]


> ляг поспи

Это значит, я трус!
Не засну, пока не разберусь!!!! Я это выбрал - значит должен до последнего!
Я над этим проектом полдня копаю, сейчас тупик и не знаю как из него вылезти, где выход искать.
В коде всего несколько строк, и для начинающего это не всегда просто найти ошибку и устранить. Так же и думать. Вы с опытом и к Вам обратился за помощью и консультацией, а не слушать, как все здесь лучше других знают delphi. Обидно очень!


 
Yellow_D   (2009-02-19 22:50) [32]

Сергей, я же все написал так, как вы посоветовали и так же как соображал.


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;


 
Сергей М. ©   (2009-02-19 23:16) [33]


> бегу в цикле


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


И что наблюдаешь ?


 
Yellow_D   (2009-02-20 09:17) [34]


> И что наблюдаешь ?


TreeView заполняется всем содержимым из файла, т.е. имена узлов и значения свойства Data плюс ко всему.
Давайте еще раз посмотрим.


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


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


 
Медвежонок Пятачок ©   (2009-02-20 09:23) [35]

кроме кода загрузки есть еще код отображения. его здесь никто не видел.


 
Mozgan   (2009-02-20 09:41) [36]


> есть еще код отображения


Я это уже понял из постов выше.
Прошу подсказать мне какова реализация данного кода.
С чего начать, куда смотреть и на что опираться.


 
Медвежонок Пятачок ©   (2009-02-20 09:55) [37]

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


 
Yellow_D   (2009-02-20 14:00) [38]


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


И всё????


 
Yellow_D   (2009-02-20 14:00) [39]


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


И всё????


 
Сергей М. ©   (2009-02-20 14:20) [40]


> результат не тот


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


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


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



Страницы: 1 2 вся ветка

Текущий архив: 2009.04.12;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.014 c
2-1235433008
Biternieks
2009-02-24 02:50
2009.04.12
Как развернуть бит ?


15-1234172735
pasha_golub
2009-02-09 12:45
2009.04.12
OpenSSL: ssl.h перевод для Delphi


2-1235652014
антон1243232
2009-02-26 15:40
2009.04.12
Группировка


4-1208241010
Petrovich
2008-04-15 10:30
2009.04.12
0xc0000008 при подключении процедуры из DLL


2-1235503620
dmitry_12_08_73
2009-02-24 22:27
2009.04.12
Проверка на открытое окно в приложении