Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Наследники TEdit


Автор: RinOSpro 25.10.2007, 09:43
Здравствуйте. Я делаю проверку длинны строки. Конечно можнобы было писать на каждый компанент проверку длинны.
Например 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:51
  Мож просто назначить им один общий обработчик OnChange ?

Автор: RinOSpro 25.10.2007, 10:23
Alexeis  я вот как выпоняю процедуру 

Код

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

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

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

Мне кажется свойство Text проверять не надо. Оно есть в TCustomEdit значит по идее дожно наследоваться и дочерними компанентами. Или надо как думаешь?

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

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

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

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

Автор: RinOSpro 25.10.2007, 12:03
Млин... Свойство техт у них есть а вот свойства фонт нету. Что делать?

Автор: RinOSpro 25.10.2007, 12:37
Помогите!!!!!!

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

Код

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


Хотя именно так не работает.

Автор: Rennigth 25.10.2007, 12:56
RinOSpro, 
В начале модуля пропиши:
Код

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


Автор: Alexeis 25.10.2007, 13:32
Лан, тады пойдем небезопасным путем  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, нашел более грамотное решение. 

Автор: RinOSpro 25.10.2007, 15:19
Rennigth а это правильно что мы немного подправили класс?

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

Автор: RinOSpro 25.10.2007, 15:27
Что то это не работает.
Код

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

Автор: Alexeis 25.10.2007, 15:29
Отчего же? Я сам проверял. Все ОК.

Автор: Rennigth 25.10.2007, 15:48
Цитата(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;


Автор: Alexeis 25.10.2007, 16:13
Цитата(Rennigth @  25.10.2007,  15:48 Найти цитируемый пост)
Твоя первоначальная процедура будет выглядеть примерно так:

  
Rennigth, не, вот как раз так работать не будет, потому что не выполниться условие Sender is TCustomEdit.
Зачем было делать одинаковые имена у наследника и предка? Только путает! 
Вот так работает.
Код

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


var
  Form1: TForm1;

implementation

{$R *.dfm}

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


Автор: Rennigth 25.10.2007, 16:37
Alexeis, виноват... smile Но дядю Васю  не лублу... упрямый я...
Код

  if (Sender is StdCtrls.TCustomEdit) then
  begin
    if Length(TCustomEdit(Sender).Text) < 10 then
      TCustomEdit(Sender).Font.Color := clRed
    else
      TCustomEdit(Sender).Font.Color := clBlack;
  end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)