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

Вниз

Как обратиться к объекту, если еасть его имя.   Найти похожие ветки 

 
tazik ©   (2005-01-25 21:01) [0]

Здравствуйте!

Пишу такую прогу. Есть уменя на форме объекты определенных типов. Хочу составить дерево этих объектов, подобно Object Explorer

пример кода:

procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
var Comp: TComponent;
begin
       Comp := TComponent(FindComponent(node.Text));
       if Assigned(Comp) then
       begin
          if Comp.ClassName = "TTabSheet" then      (*)
           showMessage(comp.name);
       ...

Но когда выполяется (*) выскакивает Access violation. Что делать?


 
Gero ©   (2005-01-25 21:08) [1]

Вероятно Comp = nil.


 
tazik ©   (2005-01-25 21:10) [2]

Но почему, ведь я переменной comp явно назначаю значение. Может с помощью указателя?


 
Gero ©   (2005-01-25 21:11) [3]


> Но почему, ведь я переменной comp явно назначаю значение

Вероятно FindComponent(node.Text) возвращает nil.


 
begin...end ©   (2005-01-25 21:12) [4]

> [3] Gero ©   (25.01.05 21:11)

Хм, но ведь тогда не выполнилась бы ветка if Assigned(Comp) then ...


 
tazik ©   (2005-01-25 21:13) [5]

И как этого избежать?


 
tazik ©   (2005-01-25 21:14) [6]

to begin...end

Вот и я про тоже! Может есть в АПИ какая-то ф-я&


 
begin...end ©   (2005-01-25 21:17) [7]

> tazik ©   (25.01.05 21:01)

> Comp := TComponent(FindComponent(node.Text));

Кстати, а зачем здесь приведение типа к TComponent?
Можно ведь и попроще: Comp := FindComponent(node.Text).


 
Gero ©   (2005-01-25 21:17) [8]

А ты уверен, что AV выскакивает именно на этой строчке?


 
tazik ©   (2005-01-25 21:21) [9]

Дело в том, что если убрать проверку

if Assigned(Comp) then
,
то AV выскакивает именно в строке (*)


 
tazik ©   (2005-01-25 21:22) [10]

пробовал и так:

Comp := FindComponent(node.Text)

Разницы нет. Всеравно AV!


 
begin...end ©   (2005-01-25 21:23) [11]

> [9] tazik ©   (25.01.05 21:21)

Т.е. что с проверкой, что без проверки - AV на одной и той же строчке?


 
tazik ©   (2005-01-25 21:24) [12]

Нет, не совсем. Если поставить проверку, то AV не возникает.


 
Gero ©   (2005-01-25 21:26) [13]


> Если поставить проверку, то AV не возникает.

На мысли не наталкивает?
Смотри [1] в общем.


 
Gero ©   (2005-01-25 21:26) [14]

Проще говоря, скажи чему у тебя равно node.Text.


 
begin...end ©   (2005-01-25 21:27) [15]

> [12] tazik ©   (25.01.05 21:24)

Теперь уже я ничего не понимаю. Сначала (Ваш первый пост) Вы говорили, что AV в строке "*" возникает, если есть проверка на Assigned. Теперь говорите, что в случае наличия проверки AV не возникает. Как это понимать?


 
tazik ©   (2005-01-25 21:28) [16]

Node.text - имя объекта.


 
tazik ©   (2005-01-25 21:30) [17]

> to begin...end

Ситуация изначально такая. Если проверку поставить, то av не возникает. Если не поставить, то возникает.


 
Gero ©   (2005-01-25 21:30) [18]


> tazik ©   (25.01.05 21:28

Значение свойства какое?


 
Gero ©   (2005-01-25 21:32) [19]


> tazik ©   (25.01.05 21:30)

У тебя нет объекта с именем Node.text, если ты еще не понял.


 
begin...end ©   (2005-01-25 21:32) [20]

> [17] tazik ©   (25.01.05 21:30)

Эта проверка НУЖНА, понимаете?


 
tazik ©   (2005-01-25 21:35) [21]

> to Gero.

Подождите, дерево я строю по имеющимся объектам. Потом, когда щелкаю по node в treeView, пытаясь получить инфу об объекте, получаю такие новости, типа AV.


 
Gero ©   (2005-01-25 21:39) [22]


> tazik ©   (25.01.05 21:35)

Я не знаю, как ты строишь дерево, зато вижу что FindComponent возвращает nil.


 
tazik ©   (2005-01-25 21:42) [23]

> Gero

Дерево строю посредством процедур, выписанных в отдельном файле.


 
Gero ©   (2005-01-25 21:43) [24]


> tazik ©   (25.01.05 21:42)

Ответь на [18].


 
tazik ©   (2005-01-25 21:44) [25]

> Gero
Значение какого свойства, вы хотете узнать?


 
Gero ©   (2005-01-25 21:46) [26]

Node.text


 
tazik ©   (2005-01-25 21:48) [27]

> Gero
У меня Node.text := TabSheet.name;
В конкретном случае Node.text := "Tab1";


 
Gero ©   (2005-01-25 21:50) [28]


> tazik ©   (25.01.05 21:48)

И ты уверен, что у тебя имеется компонент с именем Tab1?


 
Gero ©   (2005-01-25 21:51) [29]

> procedure TreeView1Change

Ты уверен, что в твоем исходнике все именно так?


 
begin...end ©   (2005-01-25 21:51) [30]

> [27] tazik ©   (25.01.05 21:48)

Чему равно свойство Owner для TabSheet?

Т.е. проверьте (ещё при создании дерева), чему равно Tab1.Owner.Name.


 
tazik ©   (2005-01-25 21:54) [31]

Ну а как же! Вот кусок процедуры по созданию TabSheet:

procedure CrtTab(Caption: string; ParentPC: TPageControl);
var Tab: TTabSheet;
begin
tab := TTabSheet.Create(ParentPC);
tab.PageControl := ParentPC;
tab.Caption := Caption;
tab.Name := Caption;
ParentPC.ActivePage := tab;
...


 
tazik ©   (2005-01-25 21:57) [32]

> [29] Gero

Абсолютно уверен. Дело в том, что у меня перед собой открытый исходник, я от туда все беру.


 
begin...end ©   (2005-01-25 21:57) [33]

> [31] tazik ©   (25.01.05 21:54)

> ParentPC: TPageControl

> tab := TTabSheet.Create(ParentPC)

А почему же Вы потом ищете этот компонент в списке Components формы, а не компонента-владельца - ParentPC?


 
tazik ©   (2005-01-25 22:00) [34]

> begin...end[33]

Дело в том, что у меня эта процедура выписана в отдельном файле.


 
begin...end ©   (2005-01-25 22:04) [35]

> [34] tazik ©   (25.01.05 22:00)

Ну и что?


 
tazik ©   (2005-01-25 22:09) [36]

>begin...end

Так ведь в качестве аргумента конструктора нужно списывать PageControl. и свойству PageControl тоже нужно указывать на PageControl

tab := TTabSheet.Create(ParentPC);
tab.PageControl := ParentPC;


 
tazik ©   (2005-01-25 22:11) [37]

>begin...end

Так ведь в качестве аргумента конструктора нужно списывать PageControl. и свойству PageControl тоже нужно указывать на PageControl

tab := TTabSheet.Create(ParentPC);
tab.PageControl := ParentPC;


 
begin...end ©   (2005-01-25 22:11) [38]

> [36] tazik ©   (25.01.05 22:09)

Почему же? Можно написать, например, так:

tab := TTabSheet.Create({имя формы, на которой находится ParentPC});
tab.PageControl := ParentPC;


 
tazik ©   (2005-01-25 22:17) [39]

>begin...end
Как это? Ведь TabSheet создается на PageCtrl!!!


 
tazik ©   (2005-01-25 22:27) [40]

ЛАДНО! ВСЕМ БОЛЬШОЕ СПАСИБО ЗА ВНИМАНИЕ!!!! МНЕ ПОРА!!!!!



Страницы: 1 2 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.062 c
14-1106705763
AndB
2005-01-26 05:16
2005.02.13
IT-шные рацпредложения


1-1106303408
Alexandr
2005-01-21 13:30
2005.02.13
заполнение Tpopup в runtime


8-1099063072
Никита
2004-10-29 19:17
2005.02.13
Ввод текста в TImage


1-1107037644
Dir
2005-01-30 01:27
2005.02.13
Перенос координат в центр Image...


6-1101665260
leprikon_ix
2004-11-28 21:07
2005.02.13
Просмотр файловой системы удаленного ПК