Форум: "Начинающим";
Текущий архив: 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