Форум: "Начинающим";
Текущий архив: 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