Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись и считывание ;TTreeNode.Data [D5, Win95/98, Win2k]


3asys ©   (2002-08-09 01:04:00) 

Как сохранить число (Integer) в свойстве Data узла TTreeNode дерева TTreeView, а потом считать его?

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


3asys   (2002-08-09 14:14:00) [1]

Огромное Спасибо ВСЕМ !

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


KSergey   (2002-08-09 11:29:00) [2]

sunwheel © (09.08.02 09:41)

Только не так, я вас умоляю!!!

Так можно делать только в рамках одного метода (если предполагать, что переменная I локальная для данного метода. Но надо ли это кому-то в рамках одного вызова одного метода? Можно и просто к I обращаться.

На момент же следующего вызова этого метода использовать ранее записанное значение в node.Data будет нельзя, равно как и вне данного метода, ведь объекта, на который ссылается укзатель, просто не существует за пределами этого метода.

Объявить же I как глобальную переменную - тоже нет смысла, т.к. данные-то для разных узлов наверняка должны быть разными. Так что так делать нельзя.

Теоретически эту идею можно развить на запись адресов элементов массива, но как отследить индексы соотв. элементов массива? Да и сколько этих самых элементов в массив напихать?

В общем надеюсь, что я убедил.


sunwheel   (2002-08-09 09:41:00) [3]

Можно сделать так:

Var I : Integer;
node : TTreeNode;
...

node.Data := @I;
...
I := Integer(node.Data^);


KSergey   (2002-08-09 08:11:00) [4]

Вообще-то, если надо сохранить просто число типа integer, думаю можно поступить и проще:

TreeNode.Data := Pointer (IntVar)
...
IntVar := Integer (TreeNode.Data)

Проверять лень, но думаю, что если не пойдет именно так, то поигравшись с преобразованием типов можно добиться нужного результата.

Только не надо потом никакую память освобождать ;)


_Александр_   (2002-08-09 05:07:00) [5]

Да, забыл написать как считывать:
В OnChange событии написать:

var
MNode : TTreeNode;
begin

MNode := TreeView1.Selected;
if MNode <> nil then begin
Edit1.Text := IntTostr(TPMyRec(MNode.Data)^.SomeInt);
Edit2.Text := IntTostr(TPMyRec(MNode.Data)^.SomeByte);
Edit3.Text := TPMyRec(MNode.Data)^.SomeString;
Edit4.Text := FloatTostr(TPMyRec(MNode.Data)^.SomeFloat);
end;

Думаю - всё :)


_Александр_   (2002-08-09 04:58:00) [6]

Думаю,одним integer-ом дело не обойдётся :)...
Так, что сразу такой ответик:

1. Создаёшь новый тип
type
...
TMyRec = record
SomeInt : integer;
SomeByte : byte;
SomeString : string[50];
SomeFloat : real;
end;

TPMyRec = ^TMyRec;
...


2. Запись в Data (а быть точнее - создаём переменную нужного нам типа и передаём её адрес полю Data):

var
P : TPMyRec;
begin
...
New(P);
P^.SomeInt := 123;
P^.SomeByte := 255;
P^.SomeString := "abceklmn";
P^.SomeFloat := 3.14;
Твой_3Ноде.Data := P;
...
end;



3. Раз переменные создавал - нужно их и прибивать:

В событии OnDeletion TreeView-а:

if TTreeNode.Data <> nil then
Dispose(TPMyRec(TTreeNode.Data));


Наверх

Титульная страница Поиск, карта сайта Написать письмо