Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

свойство "Parent"


Alex7 ©   (2005-10-29 20:56:00) 

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


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

> 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. Рекомендую книгу Тейксейры и Пачеко, она хоть и недешевая, но зато это уж точно не получатся деньги выброшенные впустую.


Anatoly Podgoretsky   (2005-10-30 11:02:00) [2]

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


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

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


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

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


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

> 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 06:16:00) [6]

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


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

> Alex7

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


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

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


Zeqfreed   (2005-10-29 23:06:00) [9]

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


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


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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо