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

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

данные в 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


Наверх

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