Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.04.12;
Скачать: [xml.tar.bz2];

Вниз

Как работать с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.006 c
2-1234868786
b@v
2009-02-17 14:06
2009.04.12
Вывод изображения


2-1235672125
privett
2009-02-26 21:15
2009.04.12
Помогите разобраться с поинтэрами


15-1234272793
dreamse
2009-02-10 16:33
2009.04.12
Проблема показа Hint на windows Vista


1-1207860252
S7r
2008-04-11 00:44
2009.04.12
События OnEnter и OnExit.


2-1235554543
Strate
2009-02-25 12:35
2009.04.12
Отрисовать средствами Delphi иконку в трее





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский