sender as

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

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

sender as

Сообщение Azaza » 08.02.2016 19:11:33

Здравствуйте.
Для edit1 написана процедура OnСhange , как сделать с помощью sender as ,чтобы эта процедура выполнялась для всех других edit?
Azaza
новенький
 
Сообщения: 13
Зарегистрирован: 27.09.2015 18:01:20

Re: sender as

Сообщение Verx0Laz » 08.02.2016 21:02:07

А написать процедуру отдельно и назначить её на все OnChange всех нужных Edit-ов - никак? Или они динамически создаваемые? Подробнее вопрос, пожалуйста
Аватара пользователя
Verx0Laz
постоялец
 
Сообщения: 125
Зарегистрирован: 11.09.2007 11:24:07

Re: sender as

Сообщение Снег Север » 08.02.2016 22:08:40

Просто прописать в остальных OnChange эту же процедуру, а в ней проверять, кто вызывает.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: sender as

Сообщение resident » 08.02.2016 22:22:17

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;   
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: sender as

Сообщение stanilar » 08.02.2016 22:51:50

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

Может написать класс-хелпер для TEdit?
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: sender as

Сообщение resident » 08.02.2016 22:54:39

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

Это как?
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: sender as

Сообщение stanilar » 08.02.2016 23:20:13

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;
...
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: sender as

Сообщение resident » 08.02.2016 23:27:41

Ok, красиво и без всяких sender as :)
з.ы. Только там получилось
Код: Выделить всё
TMyEdit = class(TEdit)
  protected
   procedure Change; override;
  end;
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: sender as

Сообщение Verx0Laz » 08.02.2016 23:53:12

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

Ибо вопрос "как" понятен, а вопрос "нафига" остается открытым...
Аватара пользователя
Verx0Laz
постоялец
 
Сообщения: 125
Зарегистрирован: 11.09.2007 11:24:07

Re: sender as

Сообщение Azaza » 09.02.2016 17:34:56

Спасибо за ответы.
Я думал , что есть метод, с помощью которого можно даже не выбирать в инспекторе объектов процедуру для других edit.
Azaza
новенький
 
Сообщения: 13
Зарегистрирован: 27.09.2015 18:01:20

Re: sender as

Сообщение resident » 09.02.2016 18:50:05

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

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

Re: sender as

Сообщение stanilar » 09.02.2016 23:36:43

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


У метода есть официальное название, но не могу вспомнить как он назывался у Marco Cantu. На королевстве дельфи этот прием назывался метод Geo.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: sender as

Сообщение zub » 10.02.2016 00:36:44

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

зы.
Удивлен что такой хак работает. кто объяснит на каком этапе происходит подмена классов?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: sender as

Сообщение Лекс Айрин » 10.02.2016 10:17:42

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


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


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

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

  TEdit = class (MyEditUnit.TMyEdit);


Грубо говоря, здесь указыва6ется, что тип TEdit это псевдоним для TMyEdit.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: sender as

Сообщение zub » 10.02.2016 10:54:32

>>Ничего удивительного. 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, а не просто поиск в списке всех идентификаторов и нахождение первого совпадения по имени.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 253

Рейтинг@Mail.ru