Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
1-53019
smok_er
2003-02-10 18:58
2003.02.17
ListView and inplace editors


3-52719
Sherbacov
2003-01-29 16:22
2003.02.17
Сетевой paradox


1-52833
super_alex
2003-02-07 12:35
2003.02.17
Как выйти из цикла?


1-52978
Артём К
2003-02-10 12:03
2003.02.17
Метод OnSelect для ListBox


1-52949
Konstantin
2003-02-09 16:37
2003.02.17
Нужен алгоритм сортировки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский