Текущий архив: 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.47 MB
Время: 0.018 c