sender as
Модератор: Модераторы
sender as
Здравствуйте.
Для edit1 написана процедура OnСhange , как сделать с помощью sender as ,чтобы эта процедура выполнялась для всех других edit?
Для edit1 написана процедура OnСhange , как сделать с помощью sender as ,чтобы эта процедура выполнялась для всех других edit?
А написать процедуру отдельно и назначить её на все OnChange всех нужных Edit-ов - никак? Или они динамически создаваемые? Подробнее вопрос, пожалуйста
- Снег Север
- долгожитель
- Сообщения: 3069
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Просто прописать в остальных OnChange эту же процедуру, а в ней проверять, кто вызывает.
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; Azaza писал(а):чтобы эта процедура выполнялась для всех других edit?
Может написать класс-хелпер для TEdit?
stanilar писал(а):Может написать класс-хелпер для TEdit?
Это как?
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;
...
Ok, красиво и без всяких sender as 
з.ы. Только там получилось
з.ы. Только там получилось
Код: Выделить всё
TMyEdit = class(TEdit)
protected
procedure Change; override;
end;Жаль, что так и не удалось услышать начальника транспортного цеха
Ибо вопрос "как" понятен, а вопрос "нафига" остается открытым...
Спасибо за ответы.
Я думал , что есть метод, с помощью которого можно даже не выбирать в инспекторе объектов процедуру для других edit.
Я думал , что есть метод, с помощью которого можно даже не выбирать в инспекторе объектов процедуру для других edit.
Azaza писал(а):Я думал , что есть метод, с помощью которого можно даже не выбирать в инспекторе объектов процедуру для других edit.
Вы читать умеете, я уж не говорю о попробовать?
Метод stanilar как раз и позволяет "даже не выбирать в инспекторе объектов процедуру для других edit".
resident писал(а):Метод stanilar
У метода есть официальное название, но не могу вспомнить как он назывался у Marco Cantu. На королевстве дельфи этот прием назывался метод Geo.
stanilar, resident
это ерунда какаято а не метод. разве что самому потом эти TEdit = class (MyEditUnit.TMyEdit) динамически создавать. Но если всеравно самому создавать, то зачем путаница с одинаковым названием разных классов?
зы.
Удивлен что такой хак работает. кто объяснит на каком этапе происходит подмена классов?
это ерунда какаято а не метод. разве что самому потом эти TEdit = class (MyEditUnit.TMyEdit) динамически создавать. Но если всеравно самому создавать, то зачем путаница с одинаковым названием разных классов?
зы.
Удивлен что такой хак работает. кто объяснит на каком этапе происходит подмена классов?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zub писал(а):зы.
Удивлен что такой хак работает. кто объяснит на каком этапе происходит подмена классов?
Ничего удивительного. Nакое же проделывается для integer в самом FPC.
На вот этом...
Код: Выделить всё
type
TEdit = class (MyEditUnit.TMyEdit);Грубо говоря, здесь указыва6ется, что тип TEdit это псевдоним для TMyEdit.
>>Ничего удивительного. 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, а не просто поиск в списке всех идентификаторов и нахождение первого совпадения по имени.
Да нет, удивительно и совсем не тоже самое.Тоже самое было бы если это происходило при обращении к невиртуальным методам TEdit = class (MyEditUnit.TMyEdit) из TForm - да, ничего удивительного, а то что при создании формы из ресурса (создается она гдето в глубине lcl\fpc, в месте в котором о нашем TEdit = class (MyEditUnit.TMyEdit) ничего неизвестно) вызывается именно конструктор TEdit = class (MyEditUnit.TMyEdit) и работают и виртуальные методы и объявления данных класса отсутствующих в штатном TEdit меня удивляет.
Причем если на разных формах создать разные TEdit = class (MyEditUnit.TMyEdit) вызваны будут именно их конструкторы, а не какойто один информация о имени которого будет найдена первой в потрохах rtti. Т.е. поиск rtti инфы организован с учетом порядка видимости из создаваемого в данный момент TForm, а не просто поиск в списке всех идентификаторов и нахождение первого совпадения по имени.
