Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.051 c
2-1138868039
alexus
2006-02-02 11:13
2006.02.19
передать команду другому приложению


15-1138106652
Prospect
2006-01-24 15:44
2006.02.19
Дайте рекомендации, плз.


4-1133760007
Andron.Ru
2005-12-05 08:20
2006.02.19
Горячая клавиша на создание папки в активном окне


2-1138731187
Arazel
2006-01-31 21:13
2006.02.19
Error: Ambiguous colum name C_Cost (ADOTable.SQL)


2-1138912973
Bogdan1024
2006-02-02 23:42
2006.02.19
Не читает ini-файлы!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский