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

Вниз

Опасное приведение типов   Найти похожие ветки 

 
Sandman25 ©   (2003-10-03 17:04) [0]

Доброе время суток.

У меня есть процедура
function TfAddUpdComp.CheckEdit(Edit: TEdit; const MessageStr: string): boolean;
begin
with Edit do
begin
Text := Trim(Text);
Result := Text = "";
if Result then
begin
ShowMessage(MessageStr);
SetFocus;
end;
end
end;


Но мне необходимо вызывать ее не только с TEdit в качестве параметра, но и с TCombobox. У TCombobox тоже есть Text и SetFocus, но у общего предка TWinControl эти свойство и метод protected. Поэтому я при вызове TCombobox преобразовываю к TEdit. Вроде работает, но мне кажется, что это некорректно и ненадежно. Есть ли другой способ?


 
Владислав ©   (2003-10-03 17:10) [1]

Приводи к TWinControl.
Надежно до тех пор, пока не приведешь что-то не TWinControl к TEdit.


 
Palladin ©   (2003-10-03 17:10) [2]

это не то что бы не корректно, но этим способом ЮЗ учит людей "обманывать" компилятор и получать доступ к protected и private полям... другого способа доступа к такого рода полям, думаю, нет...


 
Skier ©   (2003-10-03 17:13) [3]


> . Вроде работает, но мне кажется, что это некорректно и
> ненадежно.

Способ вполне нормальный. Пользуйся и не бойся...


 
Юрий Федоров ©   (2003-10-03 17:14) [4]

корректнее вроде так

Type
TWinControlAccess = class(TWinControl);

function TfAddUpdComp.CheckEdit(Edit: TWinControl; const MessageStr: string): boolean;
begin
with TWinControlAccess(Edit) do
...


 
Song ©   (2003-10-03 17:17) [5]

Передавай в процедуру не TEdit, а TComponent или TWinControl, а потом приведи к нужному типу.


 
Nikolay M. ©   (2003-10-03 17:23) [6]


> Palladin © (03.10.03 17:10) [2]

Позвольте внести скромное имхо.
К protected-полю легко получить доступ, написав наследника и вынеся в нем нужное поле в public-секцию.
К private-секции можно получить доступ только хакерским методом через указатель на объект.

Что касается сабжа, то достаточно объявить функцию как
function TfAddUpdComp.CheckEdit(Control : TWinControl; const MessageStr: string): boolean;
У компонента Control будут свойства Text и Handle, причем последний можно использовать при вызове windows.SetFocus (Control.Handle). Имхо, проще не бывает.


 
Sandman25 ©   (2003-10-03 17:26) [7]

Значит, пока не изменят иерархию, будет безопасно.
Понятно, всем спасибо. Воспользуюсь советом by Юрий Федоров.
Владислав и Song - если я передаю TWinControl, то у меня нет доступа к Text. Но метод компилируется и даже в некоторой мере работает - вызывалось присваивание TfAddUpdComp.Text, то есть заголовка формы. Сразу даже не мог понять, в чем дело :)


 
Skier ©   (2003-10-03 17:28) [8]

Я имел в виду конструкцию типа
THackWinControl = class(TWinControl) и последующий кастинг...


 
Владислав ©   (2003-10-03 17:31) [9]

> Sandman25 © (03.10.03 17:26) [7]

"Владислав и Song - если я передаю TWinControl, то у меня нет доступа к Text."

См. Skier © (03.10.03 17:28) [8]


 
Юрий Федоров ©   (2003-10-03 17:33) [10]

>>Sandman25 ©
Первоначальный вариант почти корректен...
он будет некорректен, если окажется, что в версии (например)Delphi13
TComboBox не будет наследоваться от TWinControl :-)))


 
Sandman25 ©   (2003-10-03 17:34) [11]

Немного пришлось изменить. Вот так работает.
TWinControlAccess = class(TWinControl)
public
property Text;
end;


 
Sandman25 ©   (2003-10-03 17:36) [12]

Спасибо, понял :)



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

Текущий архив: 2003.10.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
1-51270
Chlavik
2003-10-06 19:07
2003.10.16
Проблемы с AllocateHWnd


1-51230
Val
2003-10-03 14:55
2003.10.16
Error while setting a property in Automation object


1-51201
Михаааааааааа
2003-10-04 15:25
2003.10.16
Глумимся над Windows


6-51375
frost
2003-08-13 11:40
2003.10.16
Outlook and itc.


1-51235
Alexious
2003-10-02 19:40
2003.10.16
Перевод систем исчисления