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

Вниз

свойство "Parent"   Найти похожие ветки 

 
Alex7   (2005-10-29 20:56) [0]

Подскажите, пожалуйста ! Как из компонента обратиться
к свойству формы с использованием "Parent"?
Например:
procedure TForm1.Button1Click(Sender: TObject);
begin
FrmTiz.Color := clred;   // Этот оператор работает  
//Parent.Color := clred;    А здесь
//компилятор выдает "Необъявленный "Color"
end;
В то же время  "Parent.Name" работает.
Чем "Name" лучше "Color"?


 
tesseract ©   (2005-10-29 21:28) [1]


> Чем "Name" лучше "Color"?


Возможно он не объявлен в parent. Хотя он почти во всех компонетах объявлен.Так же возможно нужно указать класс parent TClassOfParent.Color=clred.


 
Zeqfreed ©   (2005-10-29 23:06) [2]

Alex7   (29.10.05 20:56)
А FrmTix - объект какого класса? И от какого наследован этот класс?


 
Alex7   (2005-10-30 04:40) [3]

Прошу прощения. В примере описка.
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Color := clred;   // Этот оператор работает  
//Parent.Color := clred;    А здесь
//компилятор выдает "Необъявленный "Color"
end;


 
Юрий Зотов ©   (2005-10-30 05:35) [4]

> Alex7

Parent"ом может быть не только форма. Если нужно обратиться именно к форме, используйте не Parent, а GetParentForm.


 
Alex7   (2005-10-30 06:16) [5]

Я что-то запутался. На форме есть кнопка. Из этой кнопки я хочу
братиться к свойству родителя. Но называть его не по имени (Form1),
а "Parent".
Так вот. Когда я пишу "Form1.Color" все работает, а когда
"Parent.Color" - нет. Почему? Особенно если учесть,
что "Parent.Name" дает верный ответ.
 Это пример. В принципе неважно кто родитель. Я хочу понять,
как можно использовать "Parent".


 
Юрий Зотов ©   (2005-10-30 06:37) [6]

> Alex7   (30.10.05 06:16) [5]

> Из этой кнопки я хочу обратиться

Поясните, что значит "обратиться из кнопки"? Вы же обращаетесь из кода метода Button1Click, а это метод формы, а никакой не кнопки.

> Когда я пишу "Form1.Color" все работает, а когда
> "Parent.Color" - нет. Почему?

Потому что у форм свойство Color опубликовано и потому доступно. А Parent имеет тип TWinControl, у которого свойство Color НЕ опубликовано и потому напрямую недоступно.

> "Parent.Name" дает верный ответ.

Класс TWinControl наследует свойство Name от TComponent, у которого оно опубликовано - потому и доступно.

> как можно использовать "Parent".

Опубликованные у TWinControl свойства и методы можно использовать напрямую. А непубликованные (находящиеся в секции protected) можно использовать, объявив сначала вспомогательный класс:
type
 TFriendWinControl = class(TWinControl);
Теперь ниже этого объявления можно получить доступ к неопубликованным свойствам и методам путем приведения типа:
TFriendWinControl(Parent).Color := clRed;


 
Alex7   (2005-10-30 07:47) [7]

Вот теперь, кажется, прояснилось. Попробую. Большое спасибо!


 
Alex7   (2005-10-30 09:05) [8]

Прошу прощения, но объявив
type
TFriendWinControl = class(TWinControl);
и вставив
TFriendWinControl(Parent)
при выполнении получил ошибку
"access Violation".
Где мог еще напортачить?


 
Anatoly Podgoretsky ©   (2005-10-30 11:02) [9]

Первое ты решил - это приведение, а второе связано с тем, что не проверен тип и значение Sender


 
Юрий Зотов ©   (2005-10-30 14:10) [10]

> Alex7   (30.10.05 09:05) [8]

Итак, в методе формы Вы написали следующее:
TFriendWinControl(Parent)

Внимание, вопрос: Parent чего здесь будет использован?

Внимание, ответ: Parent формы, конечно.

Вы же не указали перед Parent никакого объекта - значит, будет автоматически подставлено Self.Parent. А в методе формы Self - это сама форма и есть.

Ну и какой же у формы Parent? Никакого. У формы есть родительское окно (это десктоп), но оно не не имееет к VCL никакого отношения и поэтому Parent формы равен nil.

То есть, Вы попытались представить nil, как TFriendWinControl - вот и получили Access Violation. А правильно так:

if Sender is TControl then
 TFriendWinControl(TControl(Sender).Parent).Color := clRed;

Здесь мы сначала проверяем класс Sender"а (в Вашем случае это будет кнопка, а кнопки относятся к TControl), а потом, если операция допустима, то используем двойное приведение типа и меняем цвет.

Еще можно было бы сделать и так:
var
 W: TWinControl;
begin
 if Sender is TControl then
 begin
   W := TControl(Sender).Parent;
   if W <> nil then
     TFriendWinControl(W).Color := clRed;
 end
end;

P.S.
Совет: Вам срочно нужна хорошая книжка по Delphi. Рекомендую книгу Тейксейры и Пачеко, она хоть и недешевая, но зато это уж точно не получатся деньги выброшенные впустую.



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

Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.039 c
2-1130956076
floxi
2005-11-02 21:27
2005.11.20
Умножение матриц


8-1120050434
sinful
2005-06-29 17:07
2005.11.20
Непересекающиеся окружности


14-1130681845
lookin
2005-10-30 17:17
2005.11.20
Как понять такую ошибку?


14-1130307967
stone
2005-10-26 10:26
2005.11.20
Всех москвичей с первым снегом!


2-1130578543
Agi
2005-10-29 13:35
2005.11.20
В чем дело?





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