![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процедура - обработчик события... [D7, Win95/98]
MXA © (2003-02-10 16:16:00)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 почему-то ?!
MXA (2003-02-10 22:22:00) [1]всем спасибо.
viajero (2003-02-10 21:15:00) [2]>вопросом было - методом какого класса его сделать
Создай специальный класс в отдельном юните и не мучайся:
(Чтобы не создавать экземпляр - можно сделать 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;
Владислав (2003-02-10 19:45:00) [3]Во первых,
procedure TМояФорма.DateField_SetText(Sender: TField; const Text: string);
Во вторых,
AMethod.Code:=@DateField_SetText;
AMethod.Data:=Sender; //Вот здесь должен быть не Sender, а ссылка на экземпляр TМояФорма, в котором создан экземпляр ADataSet. Из твоего кусочка кода - это не факт. Но и это еще не все условия.
Короче, если нужна помощь, пиши на мыло.
MXA (2003-02-10 19:43:00) [4]2 icWasya
все еще в волшебство верите :)
2 viajero
ok, в принципе сам должен был догадаться...
>Какие проблемы сделать его методом класса?
вопросом было - методом какого класса его сделать,
если предполагается использовать в разых формах,
разных проектах.. вот и начал ковырять.
viajero (2003-02-10 18:46:00) [5]MXA (10.02.03 18:00)
В методах Self проходит как неявный первый параметр
и подставляется компилятором самостоятельно,
а когда ты хочешь обмануть компьютер и подсунуть
вместо метода процедуру, ты должен объявить его явно.
>и если не секрет, почему "кто понимает, как он работает, его не >используют"
Да потому что баловство всё это.
Какие проблемы сделать его методом класса?
icWasya (2003-02-10 18:12:00) [6]в отличие от твоего описания
TDateField_SetText = procedure (Sender: TField; const Text: string);
здесь
TFieldSetTextEvent = procedure(Sender: TField; const Text: string) of object;
используется волшебное слово of object
и поэтому TDateField_SetText<>TFieldSetTextEvent
MXA (2003-02-10 18:00:00) [7]2 viajero
спасибо... и все-таки, ведь
TFieldSetTextEvent = procedure(Sender: TField; const Text: string) of object;
почему в одних случаях обработчики объявляются с Self:TObject, в других - нет, и для методов отсутствие Self:TObject прокатывает???
и если не секрет, почему "кто понимает, как он работает, его не используют"
viajero (2003-02-10 17:38:00) [8]Это самый что ни на есть подпольныйметод,
который предполагает знакомство с внутренней реализацией
методов объектов и ссылок на них.
А не работает он по той простой причине,
что ты с этой реализацией не знаком.
MXA (2003-02-10 16:56:00) [9]да не хотелось, но пришлось так и сделать.
но осталось непонятным, почему так не работает,
ведь не такой уж и "подпольный" это метод ???
viajero (2003-02-10 16:52:00) [10]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 Беда с этим простеньким трюком в том, что те,
кто понимает, как он работает, его не используют,
а те, кто используют - не понимают.
И он с завидной регулярностью приводит к этой ошибке.
MBo (2003-02-10 16:27:00) [11]что-то мешает сделать DateField_SetText методом объекта и обращаться к ней, как положено, а не подпольными методами?