Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-51200
plyaznik
2003-10-04 15:40
2003.10.16
работа с текстовыми файлами


14-51434
Dmitriy O.
2003-09-29 16:13
2003.10.16
Вопрос только для самых умных (тест интеллекта)


1-51267
kaif
2003-09-30 00:25
2003.10.16
SelectDirectory + CreateDirButton


6-51394
Аноним
2003-08-20 22:25
2003.10.16
DNS запрос


4-51552
Legafor
2003-08-12 16:39
2003.10.16
Как определить язык





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский