Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследники TEdit, проверка длинны строки 
:(
    Опции темы
RinOSpro
Дата 25.10.2007, 09:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте. Я делаю проверку длинны строки. Конечно можнобы было писать на каждый компанент проверку длинны.
Например TEdit, TDBEdit, TMaskEdit и т.д, но надо для всех наследников TEdit.

Вот мой код

Код

procedure TForm1.RedSignal(Sender: TObject; LenG : integer);
begin
if (Sender is TEdit) then
  if Length((Sender as TDBEdit).Text) < LenG then
  ShowMessage(IntToStr(Length((Sender as TEdit).Text)))
    (Sender as TEdit).Font.Color := clRed
  else
    (Sender as TEdit).Font.Color := clBlack;
end;


Тут будет работать только для TEdit, а для TDBEdit, TMaskEdit придется писать другой код. 

Скажите пожалуста как написать код который будет охватывать все дочерние компаненты?

Это сообщение отредактировал(а) Alexeis - 25.10.2007, 09:49
  Вверх
Alexeis
Дата 25.10.2007, 09:51 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Мож просто назначить им один общий обработчик OnChange ?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RinOSpro
Дата 25.10.2007, 10:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Alexeis  я вот как выпоняю процедуру 

Код

procedure TForm1.DBEdit19KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  RedSignal(Sender,20);
end;


Это сообщение отредактировал(а) RinOSpro - 25.10.2007, 10:24
  Вверх
Alexeis
Дата 25.10.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  А кажись понял суть вопроса. Приводи их всех к общему предку TCustomEdit и у него проверяй свойство Text. Тогда не нужно будет дублировать код.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RinOSpro
Дата 25.10.2007, 11:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо!!! Значит TCustomEdit является родителем. А я думал TEdit smile   А как привести их к общему предку?

Мне кажется свойство Text проверять не надо. Оно есть в TCustomEdit значит по идее дожно наследоваться и дочерними компанентами. Или надо как думаешь?
  Вверх
Alexeis
Дата 25.10.2007, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(RinOSpro @  25.10.2007,  11:07 Найти цитируемый пост)
А как привести их к общему предку?

  Как обычно (Sender as TCustomEdit).Text 

Цитата(RinOSpro @  25.10.2007,  11:07 Найти цитируемый пост)
Мне кажется свойство Text проверять не надо. Оно есть в TCustomEdit значит по идее дожно наследоваться и дочерними компанентами. Или надо как думаешь? 

  Так ты ж сам не хотел писать разный код для 3х классов, чтобы этого не делать, применяй действия к наследнику приводя его к предку, т.е. как я показал.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RinOSpro
Дата 25.10.2007, 12:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Млин... Свойство техт у них есть а вот свойства фонт нету. Что делать?
  Вверх
RinOSpro
Дата 25.10.2007, 12:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите!!!!!!

Добавлено через 2 минуты и 13 секунд
Может как нибудь можно так 

Код

(Sender as (TDBEdit or TEdit or TMaskEdit)).font


Хотя именно так не работает.
  Вверх
Rennigth
Дата 25.10.2007, 12:56 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



RinOSpro, 
В начале модуля пропиши:
Код

  TCustomEdit = class(StdCtrls.TCustomEdit)
  published
    property Font;
  end;




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexeis
Дата 25.10.2007, 13:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Лан, тады пойдем небезопасным путем  smile 
Короч. тут дело такое. Font есть у всех контролов, он появляется у TControl, но в разделе protected. Объекты так устроены, что у всех наследников поля идут в том же порядке. Это позволит правильно обратиться к нужному полю, даже если объект приведен не к своему классу, главное чтобы уних был общий предок, protected свойство которого нужно достать. Например, даже такое будет отлично работать
Код

  TButton(Edit1).Font.Color := clRed;


Хотя (Edit1 as TButton) даже компилятор не пропустит. Тут главное трогать только поля их общего предка, в данном случае это TControl, потому если нужно у них установить только фонт и текст, то не заморачивайся и приводи Сендера к TEdit. 
Код

 TEdit(Sender).Font.Color := clRed;

Только не забудь, что нельзя обращаться к специфическим полям TEdit, только к тем что есть у TCustomEdit или предков TCustomEdit.

Добавлено через 3 минуты и 15 секунд
  Упс. Rennigth, нашел более грамотное решение. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RinOSpro
Дата 25.10.2007, 15:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Rennigth а это правильно что мы немного подправили класс?
  Вверх
Alexeis
Дата 25.10.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



RinOSpro, это не правка старого, а фактически создание нового с таким же именем (не ясно зачем было сохранять имя). Его можно было назвать хоть TDeadeaVasea. Исходные модули как использовали родной класс, так и будут использовать.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RinOSpro
Дата 25.10.2007, 15:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Что то это не работает.
Код

  TCustomEdit = class(StdCtrls.TCustomEdit)
  published
    property Font;
  end;

  Вверх
Alexeis
Дата 25.10.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Отчего же? Я сам проверял. Все ОК.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 25.10.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Цитата(RinOSpro @  25.10.2007,  15:27 Найти цитируемый пост)
Что то это не работает.

Твоя первоначальная процедура будет выглядеть примерно так:
Код

interface
type

  TCustomEdit = class(StdCtrls.TCustomEdit)
  published
    property Font;
  end;
//...


implementation

procedure TForm1.RedSignal(Sender: TObject; LenG : integer);
begin
  if (Sender is TCustomEdit) then
  begin
    if Length(TCustomEdit(Sender).Text) < LenG then
      TCustomEdit(Sender).Font.Color := clRed
    else
       TCustomEdit(Sender).Font.Color := clBlack;
  end;
end;



Это сообщение отредактировал(а) Rennigth - 25.10.2007, 15:51


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.