sender as

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Azaza
новенький
Сообщения: 13
Зарегистрирован: 27.09.2015 17:01:20

sender as

Сообщение Azaza »

Здравствуйте.
Для edit1 написана процедура OnСhange , как сделать с помощью sender as ,чтобы эта процедура выполнялась для всех других edit?
Аватара пользователя
Verx0Laz
постоялец
Сообщения: 125
Зарегистрирован: 11.09.2007 11:24:07

Сообщение Verx0Laz »

А написать процедуру отдельно и назначить её на все OnChange всех нужных Edit-ов - никак? Или они динамически создаваемые? Подробнее вопрос, пожалуйста
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3069
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Просто прописать в остальных OnChange эту же процедуру, а в ней проверять, кто вызывает.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Azaza писал(а):Для edit1 написана процедура OnСhange

Её надо бы написать отдельно. А в обработчике edit1 вызвать её через sender as. Тогда и для остальных edit можно уже выбрать обработчик edit1 в инспекторе объектов (писать код для остальных edit не нужно, просто выбрать мышкой в инспекторе).

Код: Выделить всё

procedure MyChange(ed: TEdit);
  var
    i: integer;
    s: string;
  begin
    s := ed.Text;
    for i := 1 to Length(s) do
      if s[i] = '-' then s[i] := '+';
    ed.Text := s;
  end;

procedure TForm1.Edit1Change(Sender: TObject);
  begin
    MyChange(Sender as TEdit);
  end;   
stanilar
постоялец
Сообщения: 289
Зарегистрирован: 09.03.2010 18:09:02

Сообщение stanilar »

Azaza писал(а):чтобы эта процедура выполнялась для всех других edit?

Может написать класс-хелпер для TEdit?
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

stanilar писал(а):Может написать класс-хелпер для TEdit?

Это как?
stanilar
постоялец
Сообщения: 289
Зарегистрирован: 09.03.2010 18:09:02

Сообщение stanilar »

resident писал(а):Это как?


В делфи писал бы как-то так(не помню теперь уже точно паскалевский синтаксис):

Код: Выделить всё

unit MyEditUnit;
uses Cntrls;
type
TMyEdit = class(TEdit)
protected
  procedure OnChange(Sender: TObject); override;
// Обычно значимые методы в вкл объявлены как виртуал
...

unit MainFormUnit;

uses Cntrls, Forms, MyEditUnit;

type

  TEdit = class (MyEditUnit.TMyEdit);

TMainForm = class(TForm)
  Edit1: TEdit;
  Edit2: TEdit;
  Edit3: TEdit;
...
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Ok, красиво и без всяких sender as :)
з.ы. Только там получилось

Код: Выделить всё

TMyEdit = class(TEdit)
  protected
   procedure Change; override;
  end;
Аватара пользователя
Verx0Laz
постоялец
Сообщения: 125
Зарегистрирован: 11.09.2007 11:24:07

Сообщение Verx0Laz »

Жаль, что так и не удалось услышать начальника транспортного цеха

Ибо вопрос "как" понятен, а вопрос "нафига" остается открытым...
Azaza
новенький
Сообщения: 13
Зарегистрирован: 27.09.2015 17:01:20

Сообщение Azaza »

Спасибо за ответы.
Я думал , что есть метод, с помощью которого можно даже не выбирать в инспекторе объектов процедуру для других edit.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Azaza писал(а):Я думал , что есть метод, с помощью которого можно даже не выбирать в инспекторе объектов процедуру для других edit.

Вы читать умеете, я уж не говорю о попробовать?
Метод stanilar как раз и позволяет "даже не выбирать в инспекторе объектов процедуру для других edit".
stanilar
постоялец
Сообщения: 289
Зарегистрирован: 09.03.2010 18:09:02

Сообщение stanilar »

resident писал(а):Метод stanilar


У метода есть официальное название, но не могу вспомнить как он назывался у Marco Cantu. На королевстве дельфи этот прием назывался метод Geo.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

stanilar, resident
это ерунда какаято а не метод. разве что самому потом эти TEdit = class (MyEditUnit.TMyEdit) динамически создавать. Но если всеравно самому создавать, то зачем путаница с одинаковым названием разных классов?

зы.
Удивлен что такой хак работает. кто объяснит на каком этапе происходит подмена классов?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zub писал(а):зы.
Удивлен что такой хак работает. кто объяснит на каком этапе происходит подмена классов?


Ничего удивительного. Nакое же проделывается для integer в самом FPC.


На вот этом...

Код: Выделить всё

type

  TEdit = class (MyEditUnit.TMyEdit);


Грубо говоря, здесь указыва6ется, что тип TEdit это псевдоним для TMyEdit.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Ничего удивительного. Nакое же проделывается для integer в самом FPC.
Да нет, удивительно и совсем не тоже самое.Тоже самое было бы если это происходило при обращении к невиртуальным методам TEdit = class (MyEditUnit.TMyEdit) из TForm - да, ничего удивительного, а то что при создании формы из ресурса (создается она гдето в глубине lcl\fpc, в месте в котором о нашем TEdit = class (MyEditUnit.TMyEdit) ничего неизвестно) вызывается именно конструктор TEdit = class (MyEditUnit.TMyEdit) и работают и виртуальные методы и объявления данных класса отсутствующих в штатном TEdit меня удивляет.

Причем если на разных формах создать разные TEdit = class (MyEditUnit.TMyEdit) вызваны будут именно их конструкторы, а не какойто один информация о имени которого будет найдена первой в потрохах rtti. Т.е. поиск rtti инфы организован с учетом порядка видимости из создаваемого в данный момент TForm, а не просто поиск в списке всех идентификаторов и нахождение первого совпадения по имени.
Ответить