Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

данные в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.054 c
15-1138446098
Хинт
2006-01-28 14:01
2006.02.19
Перевести с Visa илл Master card на WebMoney


10-1113893671
e-not
2005-04-19 10:54
2006.02.19
Помогите разобраться с вызовом функции на COM-сервере


15-1138713626
ПЛОВ
2006-01-31 16:20
2006.02.19
Возник такой вопрос интересный


15-1138180213
Red_imp
2006-01-25 12:10
2006.02.19
Народ посоветуйте программу для учета трафика


3-1135158279
yk
2005-12-21 12:44
2006.02.19
Проблемы с подключением udf