Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глюки с вызовом процедуры по ссылке [D7, XP]


Страницы:   1 2 3 4

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-параметр.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо