Главная страница
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.034 c
3-51118
widoms
2003-09-25 05:08
2003.10.16
Фильтр по дате.


1-51173
Сергей Резников
2003-10-05 15:38
2003.10.16
Иконка по хэндлу


1-51261
SuperKot
2003-10-06 03:50
2003.10.16
Программирование для WWW


1-51255
ghost_by
2003-10-03 13:20
2003.10.16
TStringGrid - как запретить редактирование отдельных ячеек?


3-51060
Smashich
2003-09-26 17:35
2003.10.16
Grant