Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.055 c
14-1106672383
Бугага
2005-01-25 19:59
2005.02.13
Rover S2


9-1098104871
NightFire
2004-10-18 17:07
2005.02.13
Всем всем программистам игр и не только


3-1105536410
Junior
2005-01-12 16:26
2005.02.13
Где можно найти документацию по AccessApplication


3-1105698824
БареллО
2005-01-14 13:33
2005.02.13
Подстановка в DBGrid


1-1107077596
focor
2005-01-30 12:33
2005.02.13
Вскрыть кнопку





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский