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

Вниз

свойство "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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
14-1130518782
Ксардас
2005-10-28 20:59
2005.11.20
Какова роль общества в политике?


3-1128048706
Извращенец2
2005-09-30 06:51
2005.11.20
Interbase 5.6 жрет память


14-1130254944
hi
2005-10-25 19:42
2005.11.20
Существует ли женский заговор?


14-1130428910
Gydvin
2005-10-27 20:01
2005.11.20
Помогите выбрать принтер


3-1128663171
dreamse
2005-10-07 09:32
2005.11.20
Проблема с созданием хранимой процедуры в MS SQL