![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Интересные факты о TreeView [D7, WinXP]
tazik © (2004-12-18 19:13:00)Всем привет!
Я пишу такую штуку: Создаю на форме объекты и одновременно создаю Node'ы в TreeView. В качестве надписи для node я использую имя создаваемого объекта. Потом я хочу обратиться к объекту по его имени, используя дерево.
node := TreeView1.selected;
...
TButton(FindComponent(treeView1.items[node.index].text)).free;
Или
Edit1.text := Button(FindComponent(treeView1.items[node.index].text)).name;
Но возникает Access violation. Почему? как избежать этой ситуации?
tazik (2004-12-18 22:13:00) [1]Огромное спасибо, гуру!!!!!
begin...end (2004-12-18 21:50:00) [2]> tazik © (18.12.04 19:13)
> как избежать этой ситуации?
Писать с проверками, чтобы не допустить случаев, описанных в [1]. Например, так:
var
Node: TTreeNode;
begin
Node := TreeView.Selected;
if Assigned(Node) then
...
end.
Если находимый компонент нужно уничтожить (Free), то в этом случае, думаю, не обязательно проверять, нашёлся компонент или нет, т.к. метод Free сам делает проверку на NIL. Т.е. можно сразу написать:
FindComponent(TreeView.Items[Node.Index].Text).Free.
В случае, когда нужно обращаться к каким-нибудь свойствам или методам (НЕ методам класса) находимого компонента, то проверка необходима, например:
var
Comp: TComponent;
begin
...
Comp := FindComponent(TreeView.Items[Node.Index].Text);
if Assigned(Comp) then
if Comp is TButton then
TButton(Comp).Default := True
end.
Palladin (2004-12-18 19:42:00) [3]во первых selected может быть nil, во вторых компонент может быть не найден...
> как избежать этой ситуации?
думать иногда