Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.17;
Скачать: CL | DM;

Вниз

Процедура - обработчик события...   Найти похожие ветки 

 
MXA   (2003-02-10 16:16) [0]

procedure DateField_SetText(Sender: TField; const Text: string);
var
s :string;
begin // сдесь Sender правильный, а Text - левый какой-то!
s:=Text;
if (s="")or MaskInput(s, "D2")
then Sender.AsString:=s
else Abort;
end;

procedure AssignTimeStampHandler(Sender: TObject; ADataSet :TDataSet);
var
n :integer;
AMethod :TMethod;
begin
AMethod.Code:=@DateField_SetText;
AMethod.Data:=Sender;
for n:=0 to ADataSet.FieldCount-1 do
if ADataSet.Fields[n] is TSQLTimeStampField then
ADataSet.Fields[n].OnSetText:=TFieldSetTextEvent(AMethod);
end;


DateField_SetText вызывается когда нужно, но в нее
не передается параметр Text почему-то ?!


 
MBo ©   (2003-02-10 16:27) [1]

что-то мешает сделать DateField_SetText методом объекта и обращаться к ней, как положено, а не подпольными методами?


 
viajero   (2003-02-10 16:52) [2]

2MXA (10.02.03 16:16)
Естественно - первым агрументом каждого метода должен идти Self,
и именно он должен лежать в TMethod.Data

procedure DateField_SetText( Self: TObject; Sender: TField; const Text: string);

А по существу, послушай совета MBo © (10.02.03 16:27).

PS Беда с этим простеньким трюком в том, что те,
кто понимает, как он работает, его не используют,
а те, кто используют - не понимают.
И он с завидной регулярностью приводит к этой ошибке.


 
MXA   (2003-02-10 16:56) [3]

да не хотелось, но пришлось так и сделать.

но осталось непонятным, почему так не работает,
ведь не такой уж и "подпольный" это метод ???


 
viajero   (2003-02-10 17:38) [4]

Это самый что ни на есть подпольный метод,
который предполагает знакомство с внутренней реализацией
методов объектов и ссылок на них.

А не работает он по той простой причине,
что ты с этой реализацией не знаком.


 
MXA   (2003-02-10 18:00) [5]

2 viajero
спасибо... и все-таки, ведь
TFieldSetTextEvent = procedure(Sender: TField; const Text: string) of object;
почему в одних случаях обработчики объявляются с Self:TObject, в других - нет, и для методов отсутствие Self:TObject прокатывает???

и если не секрет, почему "кто понимает, как он работает, его не используют"


 
icWasya ©   (2003-02-10 18:12) [6]

в отличие от твоего описания
TDateField_SetText = procedure (Sender: TField; const Text: string);

здесь
TFieldSetTextEvent = procedure(Sender: TField; const Text: string) of object;

используется волшебное слово of object
и поэтому TDateField_SetText<>TFieldSetTextEvent


 
viajero   (2003-02-10 18:46) [7]

MXA (10.02.03 18:00)

В методах Self проходит как неявный первый параметр
и подставляется компилятором самостоятельно,
а когда ты хочешь обмануть компьютер и подсунуть
вместо метода процедуру, ты должен объявить его явно.

>и если не секрет, почему "кто понимает, как он работает, его не >используют"

Да потому что баловство всё это.
Какие проблемы сделать его методом класса?


 
MXA   (2003-02-10 19:43) [8]

2 icWasya
все еще в волшебство верите :)

2 viajero
ok, в принципе сам должен был догадаться...

>Какие проблемы сделать его методом класса?
вопросом было - методом какого класса его сделать,
если предполагается использовать в разых формах,
разных проектах.. вот и начал ковырять.


 
Владислав ©   (2003-02-10 19:45) [9]

Во первых,
procedure TМояФорма.DateField_SetText(Sender: TField; const Text: string);
Во вторых,
AMethod.Code:=@DateField_SetText;
AMethod.Data:=Sender; //Вот здесь должен быть не Sender, а ссылка на экземпляр TМояФорма, в котором создан экземпляр ADataSet. Из твоего кусочка кода - это не факт. Но и это еще не все условия.


Короче, если нужна помощь, пиши на мыло.


 
viajero   (2003-02-10 21:15) [10]

>вопросом было - методом какого класса его сделать

Создай специальный класс в отдельном юните и не мучайся:
(Чтобы не создавать экземпляр - можно сделать DateField_SetText классовым методом - классовые методы совместимы с обычными и
тоже имеют неявный аргумент Self, в который передаётся
ссылка на класс.)

TDummy = class
procedure DateField_SetText(Sender: TField; const Text: string);
//или
class procedure DateField_SetText2(Sender: TField; const Text: string);
end;

{...}.OnSetText := GlobalDummyExemplar.DateField_SetText;
или
{...}.OnSetText := TDummy.DateField_SetText2;


 
MXA   (2003-02-10 22:22) [11]

всем спасибо.



Страницы: 1 вся ветка

Текущий архив: 2003.02.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
1-52990
An-Na
2003-02-06 10:49
2003.02.17
TEdit


1-53018
Юрий Федоров
2003-02-10 16:44
2003.02.17
Не сталкивался ранее с ActiveX, поэтому у меня 2 вопроса:


3-52724
MasterHelpMe
2003-01-29 18:57
2003.02.17
Create Table(Virtual)


1-53096
esa
2003-02-07 04:57
2003.02.17
Потоки - закрытие


14-53188
Феликс
2003-01-31 00:20
2003.02.17
Бою с Кличко Льюис предпочел матч-реванш с Тайсоном