![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В чем я ошибаюсь? Создание и просмотр значения TTreeNode.Data [D6, Win95/98, Win2k]
3asys © (2003-01-23 12:38:00)Создаю в TTreeView дерево. При создании узлов, присваиваю каждому уникальный идентификатор (ID).
После создания дерева, просматриваю значения ID отдельных узлов. Однако при этом всегда выдается последнее созданное значение ID.
Вот мой код:
var
Form1: TForm1;
ID : PString; //Уникальный идентификатор
i : Integer; //Счетчик служащий для формирования значения ID
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
New(ID);
i:=0;
end;
//Создаю узлы:
procedure TForm1.NewNodeClick(Sender: TObject);
begin
Inc(i);
ID^:=IntToStr(i);
If TreeView.Items.Count = 0 Then
TreeView.Items.AddObject(nil, "New"+IntToStr(i),ID)
else
TreeView.Items.AddChildObject(TreeView.Selected, "New"+IntToStr(i),ID);
end;
//Просматриваю значения ID узлов:
procedure TForm1.ShowIDClick(Sender: TObject);
begin
ShowMessage(PString(TreeView.Selected.Data)^);
end;
Что я делаю неправильно?
Что здесь можно сделать?
С Уважением, 3asys
3asys (2003-01-23 17:19:00) [1]>> Skier ©
БОЛЬШОЕ СПАСИБО!
С Уважением, 3asys
Skier (2003-01-23 16:45:00) [2]>3asys
Сложно отлаживать удалённо...:)
Ну... попробуй так:
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
end;
procedure TForm1.NewNodeClick(Sender: TObject);
var
ID : PString;
begin
Inc(i);
New(ID);
ID^:=IntToStr(i);
If TreeView.Items.Count = 0 Then
TreeView.Items.AddObject(nil, "New"+IntToStr(i),ID)
else
TreeView.Items.AddChildObject(TreeView.Selected, "New"+IntToStr(i),ID);
end;
procedure TForm1.ShowIDClick(Sender: TObject);
begin
if TreeView.Selected.Data <> nil then
ShowMessage(PString(TreeView.Selected.Data)^);
end;
procedure TForm1.TreeViewDeletion(Sender: TObject; Node: TTreeNode);
begin
if TreeView.Selected.Data <> nil then begin
Dispose(TreeView.Selected.Data);
TreeView.Selected.Data := nil;
end; //if
end;
И ещё посмотри может быть у тебя в каком-то случае TreeView.Selected = nil или TreeView = nil (?)
3asys (2003-01-23 16:42:00) [3]Нашел решение!
При закрытии формы:
procedure TForm1.Close1Click(Sender: TObject);
var
a : Integer;
begin
for a:=0 to TreeView.Items.Count-1 do
begin
Dispose(TreeView.Items[a].Data);
end;
Application.Terminate;
end;
Теперь ошибки не возникает. -)
3asys (2003-01-23 16:38:00) [4]Это связано со строкой Dispose(TreeView.Selected.Data);
3asys (2003-01-23 16:32:00) [5]>> Skier ©
Все работает отлично, но при закрытии программы, выдается сообщение:
"Invalid pointer operation"
Вот мой код:
var
Form1: TForm1;
i : Integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
end;
procedure TForm1.NewNodeClick(Sender: TObject);
var
ID : PString;
begin
Inc(i);
New(ID);
ID^:=IntToStr(i);
If TreeView.Items.Count = 0 Then
TreeView.Items.AddObject(nil, "New"+IntToStr(i),ID)
else
TreeView.Items.AddChildObject(TreeView.Selected, "New"+IntToStr(i),ID);
end;
procedure TForm1.ShowIDClick(Sender: TObject);
begin
ShowMessage(PString(TreeView.Selected.Data)^);
end;
procedure TForm1.TreeViewDeletion(Sender: TObject; Node: TTreeNode);
begin
Dispose(TreeView.Selected.Data);
end;
Что с этим можно сделать?
С Уважением, 3asys
3asys (2003-01-23 16:05:00) [6]>> Skier ©
БОЛЬШОЕ СПАСИБО!
Skier (2003-01-23 13:25:00) [7]>3asys
If TreeView.Items.Count = 0 Then
TreeView.Items.AddObject(nil, "New"+IntToStr(i), ID)
else
TreeView.Items.AddChildObject(TreeView.Selected, "New"+IntToStr(i), ID);
ID - один и тот же указатель на строку для всехузлов,
поэтому у тебя данные в строке будут равны данным для
узла, который был добавлен последним!
Чтобы это победить нужно выделять память для строки всякий раз
когда добавляешь узел...
Примерно вот так :
var
AStr : PString;
begin
Inc(i);
New(AStr);
AStr^:=IntToStr(i);
If TreeView.Items.Count = 0 Then
TreeView.Items.AddObject(nil, "New"+IntToStr(i),AStr)
else
TreeView.Items.AddChildObject(TreeView.Selected, "New"+IntToStr(i),AStr);
end;
Но потом не забудь освободить !
И ещё : у узла есть св-ва TTreeNode.ItemId и TTreeNode.AbsoluteIndex...
3asys (2003-01-23 13:02:00) [8]?