![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюки с вызовом процедуры по ссылке [D7, XP]
yantar92 © (2009-11-02 13:29:00)Проблема в том, что при передаче ссылки на процедуру как параметр функции начинаются глюки с методами глобального класса.
Код:
...
type
Tpaint=procedure (const x:extended; const y:extended; var series:Tlineseries);
...
procedure paint(const x:extended; const y:extended; var series:Tlineseries);
begin
series.AddXY(x,y);
series.ParentChart.Parent.Repaint;
end;
...
function dc_A_st(... var paint:Tpaint;var series:Tlineseries ...):extended;
...
begin
...
paint(x,y,series);
...
end;
При исполнении процедуры paint выбивает "Ivalid pointer operation", а при дебаге пишет, что метод Repaint класса series.ParentChart.Parent - не определён, тогда как сам класс является определенным.
yantar92 (2009-11-02 14:02:00) [61]ну во первых, это работает если вызывать иную ф-цию.
во-вторых paint об"явлен в implementation а раньше нигде не оговорен.
Сергей М. (2009-11-02 14:00:00) [62]
> ну private метод
Ну так а какого тогда лешего прототип Tpaint у тебя прототип функции, а не прототип метода?
yantar92 (2009-11-02 13:58:00) [63]>Сергей М. © (02.11.09 13:56) [14]
>
>
>> определена она в той же форме
>
>
>В форме нет функций.
>Там есть методы
ну private метод.
yantar92 (2009-11-02 13:56:00) [64]>RWolf © (02.11.09 13:55) [12]
>вероятно, баг не в вызове процедуры по указателю, а в методе Repaint класса >series.ParentChart.Parent
нет, если убрать это, но после вызова paint написать application.processmassages, то вылетает именно на application.processmassages.
Сергей М. (2009-11-02 13:56:00) [65]
> определена она в той же форме
В форме нетфункций.
Там есть методы
yantar92 (2009-11-02 13:55:00) [66]procedure paint(const x:extended; const y:extended; var series:Tlineseries);
begin
series.AddXY(x,y);
series.ParentChart.Parent.Repaint;
end;
RWolf (2009-11-02 13:55:00) [67]вероятно, баг не в вызове процедуры по указателю, а в методе Repaint класса series.ParentChart.Parent
yantar92 (2009-11-02 13:55:00) [68]а определена она в той же форме
Сергей М. (2009-11-02 13:54:00) [69]
> равно ссылке на функцию paint
>
А где функция-то определена и реализована ?
yantar92 (2009-11-02 13:52:00) [70]фактическое значение параметра paint, передаваемое в функцию dc_A_s равно ссылке на функцию paint
yantar92 (2009-11-02 13:50:00) [71]Удалено модератором
yantar92 (2009-11-02 13:50:00) [72]Удалено модератором
yantar92 (2009-11-02 13:50:00) [73]убирание var и const не помогает
RWolf (2009-11-02 13:45:00) [74]и да, все const-ы и var-ы в этом коде не нужны.
RWolf (2009-11-02 13:43:00) [75]чему равно фактическое значение параметра paint, передаваемое в функцию dc_A_st?
Leonid Troyanovsky (2009-11-02 13:39:00) [76]
> yantar92 (02.11.09 13:29)
> Проблема в том, что при передаче ссылки на процедуру как
> параметр функции начинаются глюки с методами глобального
> класса.
Не надо извращений, давай ее закопаем.
--
Regards, LVT.
Сергей М. (2009-11-02 13:37:00) [77]
> varpaint:Tpaint
Ну и зачем тут var?
Демо (2009-11-02 13:36:00) [78]
> yantar92 (02.11.09 13:29)
1. Ты бы функции назвал отличными от методов класса хотя бы.
2. Ссылки на объекты и указатели передаются как var-параметры только в том случае, если ты собираешься менять их значение. Для того, чтобы изменять объекты, ссылки на них не нужно передавать как var-параметр.