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

Вниз

В чем я ошибаюсь? Создание и просмотр значения TTreeNode.Data   Найти похожие ветки 

 
3asys   (2003-01-23 12:38) [0]

Создаю в 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 13:02) [1]

?


 
Skier ©   (2003-01-23 13:25) [2]

>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 16:05) [3]

>> Skier ©
БОЛЬШОЕ СПАСИБО!


 
3asys   (2003-01-23 16:32) [4]

>> 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:38) [5]

Это связано со строкой Dispose(TreeView.Selected.Data);


 
3asys   (2003-01-23 16:42) [6]

Нашел решение!

При закрытии формы:
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;

Теперь ошибки не возникает. -)


 
Skier ©   (2003-01-23 16:45) [7]

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

>> Skier ©
БОЛЬШОЕ СПАСИБО!

С Уважением, 3asys



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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
3-4717
Big_Rom
2003-01-18 13:42
2003.02.03
Вот такой странный вопрос?


7-5297
eddy2
2002-11-23 17:37
2003.02.03
При максимизации формы скрывается панель задач, как не допустить?


4-5330
Someone
2002-12-18 13:31
2003.02.03
Where are constants LVM_********** situated ?


3-4757
Valeris
2003-01-16 11:19
2003.02.03
Разработка косольного приложения


4-5358
Vasily Terekhov
2002-12-17 17:40
2003.02.03
Как послать окну сочетание клавиш Ctrl+C?