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

Вниз

В чем я ошибаюсь? Создание и просмотр значения 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
14-5149
nikulin
2003-01-17 12:44
2003.02.03
Размер проги?


8-5086
Алексей
2002-10-21 15:15
2003.02.03
Мультимедия


8-5072
Е.М. Саша
2002-10-18 22:50
2003.02.03
Компонент для проигрывания MIDI


7-5293
Borys
2002-11-22 16:59
2003.02.03
LPT (COM) под Windows


1-4952
Shicoy
2003-01-26 21:48
2003.02.03
Преобразование строки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский