Форум: "Основная";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
ВнизОпасное приведение типов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c