![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
данные в treenode
acer © (2006-01-29 10:48:00)как сделать так, чтобы в treenode (не в тексте) содержалось значение integer и как его получить из него обратно
Zeqfreed (2006-01-29 15:30:00) [1]begin...end © (29.01.06 15:26) [10]
Ну да, в общем-то логично производить приведение лишь один раз. Учту в следующий раз.
begin...end (2006-01-29 15:26:00) [2]> Zeqfreed © (29.01.06 14:37) [9]
> А что использовать, прямое приведение типов?
Нет, одно только прямое приведение типов здесь использовать опасно. Дело вот в чём: в [6] as последовательно применяется к одному и тому же объекту, причём объект приводится к одному и тому же типу. As отличается от прямого приведения тем, что перед обращением к объекту как к экземпляру указанного класса производится проверка, соответствует ли объект этому классу (т.е. является ли он экземпляром именно этого класса или его предка). В случае несоответствия возбуждается исключение. Так вот -- проверка требует времени, т.к. в run-time рекурсивно просматриваются сведения о ClassType всей цепочки классов (вверх -- от указанного до TObject) до тех пор, пока совпадение не будет обнаружено. И, хотя в [6] совпадение будет уже на первом проходе, проверку лучше делать один раз:
with (Sender as TTreeView).Selected do
if Assigned(Data) then
ShowMessage(Format('Selected node contains an integer value equal to %d', [Integer(Data)]))
и
with Sender as TTreeView do
if (Button = mbRight) and Assigned(Selected) then
Items.AddChildObject(Selected, 'Node', Pointer(Random(High(Integer)) + 1))
Zeqfreed (2006-01-29 14:37:00) [3]begin...end © (29.01.06 12:05) [8]
Спасибо за дружеский совет :) А что использовать, прямое приведение типов?
begin...end (2006-01-29 12:05:00) [4]> Zeqfreed © (29.01.06 11:29) [6]
Дружеский совет: не используйте оператор as без необходимости.
acer (2006-01-29 11:53:00) [5]благодарствую
Zeqfreed (2006-01-29 11:29:00) [6]acer (29.01.06 11:19) [5]
> node:=treeview1.items.addchildobject(nil, '...', @i);
Оператор @ возвращает адрес, по которому находится объект, над которым производится действие. Чтобы сохранить целое число в памяти, предназначенной для указателя, нужно использовать обычное приведение типов (Integer(PointerVariable)).
Могу предложить для рассмотрения следующий участок кода, наглядно показывающий хранение целого числа в поле Data узлов дерева:
procedure TForm1.TreeView1DblClick(Sender: TObject);
begin
if Assigned((Sender as TTreeView).Selected.Data) then
ShowMessage(Format('Selected node contains an integer value equal to %d', [Integer((Sender as TTreeView).Selected.Data)]));
end;
procedure TForm1.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbRight) then begin
if Assigned((Sender as TTreeView).Selected) then
(Sender as TTreeView).Items.AddChildObject((Sender as TTreeView).Selected, 'Node', Pointer(Random(High(Integer)) + 1));
end;
end;
acer (2006-01-29 11:19:00) [7]я ж сказал, записывал значение integer, в данном случае это переменная I, это ж пример, а не кусок программы, у меня не получается то ли записать, то ли получить записанное значение, кстати там ошибка
node:=treeview1.items.addchildobject(nil, '...', @i);
Zeqfreed (2006-01-29 11:13:00) [8]acer (29.01.06 11:07) [2]
>var
> node: ttreenode;
>i: integer;
>begin
>i:=5;
> node:=treeview1.items.addchildobject( node, '...', i);
>// это я добавил
>i:=integer(treeview.selected.data);
> //это я типа получил
Какой-то подозрительный код на первый взгляд.
Gero (2006-01-29 11:09:00) [9]> treeview.selected.data
А ты сюда что-то записывал?
acer (2006-01-29 11:07:00) [10]пробовал - не получилось, делал так
var
node: ttreenode;
i: integer;
begin
i:=5;
node:=treeview1.items.addchildobject(node, '...', i);
// это я добавил
i:=integer(treeview.selected.data);
//это я типа получил
но не вига не получается
Gero (2006-01-29 10:50:00) [11]TTreeNode.Data