Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.016 c
1-51248
vlgrig1961
2003-10-03 08:12
2003.10.16
Как у TEdit поменять цвет и стиль рамки?


1-51219
Руслан Гиричев
2003-10-03 23:44
2003.10.16
TRichEdit


3-51063
Maxio
2003-09-26 15:56
2003.10.16
Сложение столбца


3-51108
diokant
2003-09-24 13:27
2003.10.16
Как обеспечить отображение значения поля, измененного триггером


1-51178
Андрей Б.
2003-10-05 02:34
2003.10.16
Вопрос по Битмапам...




   Наверх