![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись и считывание ;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));