Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Внизданные в treenode Найти похожие ветки
← →
acer (2006-01-29 10:48) [0]как сделать так, чтобы в treenode (не в тексте) содержалось значение integer и как его получить из него обратно
← →
Gero © (2006-01-29 10:50) [1]TTreeNode.Data
← →
acer (2006-01-29 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) [3]> treeview.selected.data
А ты сюда что-то записывал?
← →
Zeqfreed © (2006-01-29 11:13) [4]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);
> //это я типа получил
Какой-то подозрительный код на первый взгляд.
← →
acer (2006-01-29 11:19) [5]я ж сказал, записывал значение integer, в данном случае это переменная I, это ж пример, а не кусок программы, у меня не получается то ли записать, то ли получить записанное значение, кстати там ошибка
node:=treeview1.items.addchildobject(nil, "...", @i);
← →
Zeqfreed © (2006-01-29 11:29) [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:53) [7]благодарствую
← →
begin...end © (2006-01-29 12:05) [8]> Zeqfreed © (29.01.06 11:29) [6]
Дружеский совет: не используйте оператор as без необходимости.
← →
Zeqfreed © (2006-01-29 14:37) [9]begin...end © (29.01.06 12:05) [8]
Спасибо за дружеский совет :) А что использовать, прямое приведение типов?
← →
begin...end © (2006-01-29 15:26) [10]> 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 15:30) [11]begin...end © (29.01.06 15:26) [10]
Ну да, в общем-то логично производить приведение лишь один раз. Учту в следующий раз.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.052 c