| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Наследники TEdit |
| Автор: RinOSpro 25.10.2007, 09:43 | ||
| Здравствуйте. Я делаю проверку длинны строки. Конечно можнобы было писать на каждый компанент проверку длинны. Например TEdit, TDBEdit, TMaskEdit и т.д, но надо для всех наследников TEdit. Вот мой код
Тут будет работать только для TEdit, а для TDBEdit, TMaskEdit придется писать другой код. Скажите пожалуста как написать код который будет охватывать все дочерние компаненты? |
| Автор: Alexeis 25.10.2007, 09:51 |
| Мож просто назначить им один общий обработчик OnChange ? |
| Автор: RinOSpro 25.10.2007, 10:23 | ||
Alexeis я вот как выпоняю процедуру
|
| Автор: Alexeis 25.10.2007, 10:46 |
| А кажись понял суть вопроса. Приводи их всех к общему предку TCustomEdit и у него проверяй свойство Text. Тогда не нужно будет дублировать код. |
| Автор: RinOSpro 25.10.2007, 11:07 |
| Спасибо!!! Значит TCustomEdit является родителем. А я думал TEdit Мне кажется свойство Text проверять не надо. Оно есть в TCustomEdit значит по идее дожно наследоваться и дочерними компанентами. Или надо как думаешь? |
| Автор: RinOSpro 25.10.2007, 12:03 |
| Млин... Свойство техт у них есть а вот свойства фонт нету. Что делать? |
| Автор: RinOSpro 25.10.2007, 12:37 | ||
| Помогите!!!!!! Добавлено через 2 минуты и 13 секунд Может как нибудь можно так
Хотя именно так не работает. |
| Автор: Rennigth 25.10.2007, 12:56 | ||
| RinOSpro, В начале модуля пропиши:
|
| Автор: Alexeis 25.10.2007, 13:32 | ||||
| Лан, тады пойдем небезопасным путем Короч. тут дело такое. Font есть у всех контролов, он появляется у TControl, но в разделе protected. Объекты так устроены, что у всех наследников поля идут в том же порядке. Это позволит правильно обратиться к нужному полю, даже если объект приведен не к своему классу, главное чтобы уних был общий предок, protected свойство которого нужно достать. Например, даже такое будет отлично работать
Хотя (Edit1 as TButton) даже компилятор не пропустит. Тут главное трогать только поля их общего предка, в данном случае это TControl, потому если нужно у них установить только фонт и текст, то не заморачивайся и приводи Сендера к TEdit.
Только не забудь, что нельзя обращаться к специфическим полям TEdit, только к тем что есть у TCustomEdit или предков TCustomEdit. Добавлено через 3 минуты и 15 секунд Упс. Rennigth, нашел более грамотное решение. |
| Автор: RinOSpro 25.10.2007, 15:19 |
| Rennigth а это правильно что мы немного подправили класс? |
| Автор: Alexeis 25.10.2007, 15:25 |
| RinOSpro, это не правка старого, а фактически создание нового с таким же именем (не ясно зачем было сохранять имя). Его можно было назвать хоть TDeadeaVasea. Исходные модули как использовали родной класс, так и будут использовать. |
| Автор: RinOSpro 25.10.2007, 15:27 | ||
Что то это не работает.
|
| Автор: Alexeis 25.10.2007, 15:29 |
| Отчего же? Я сам проверял. Все ОК. |
| Автор: Rennigth 25.10.2007, 15:48 | ||
Твоя первоначальная процедура будет выглядеть примерно так:
|
| Автор: Alexeis 25.10.2007, 16:13 | ||
Rennigth, не, вот как раз так работать не будет, потому что не выполниться условие Sender is TCustomEdit. Зачем было делать одинаковые имена у наследника и предка? Только путает! Вот так работает.
|
| Автор: Rennigth 25.10.2007, 16:37 | ||
Alexeis, виноват...
|