Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.20;
Скачать: CL | DM;

Вниз

Глюки с вызовом процедуры по ссылке   Найти похожие ветки 

 
yantar92   (2009-11-02 13:29) [0]

Проблема в том, что при передаче ссылки на процедуру как параметр функции начинаются глюки с методами глобального класса.
Код:

...
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 - не определён, тогда как сам класс является определенным.


 
Демо ©   (2009-11-02 13:36) [1]


> yantar92   (02.11.09 13:29) 


1. Ты бы функции назвал отличными от методов класса хотя бы.
2. Ссылки на объекты и указатели передаются как var-параметры только в том случае, если ты собираешься менять их значение. Для того, чтобы изменять объекты, ссылки на них не нужно передавать как var-параметр.


 
Сергей М. ©   (2009-11-02 13:37) [2]


> var paint:Tpaint


Ну и зачем тут var ?


 
Leonid Troyanovsky ©   (2009-11-02 13:39) [3]


> yantar92   (02.11.09 13:29)

> Проблема в том, что при передаче ссылки на процедуру как
> параметр функции начинаются глюки с методами глобального
> класса.

Не надо извращений, давай ее закопаем.

--
Regards, LVT.


 
RWolf ©   (2009-11-02 13:43) [4]

чему равно фактическое значение параметра paint, передаваемое в функцию dc_A_st?


 
RWolf ©   (2009-11-02 13:45) [5]

и да, все const-ы и var-ы в этом коде не нужны.


 
yantar92   (2009-11-02 13:50) [6]

убирание var и const не помогает


 
yantar92   (2009-11-02 13:50) [7]

Удалено модератором


 
yantar92   (2009-11-02 13:50) [8]

Удалено модератором


 
yantar92   (2009-11-02 13:52) [9]

фактическое значение параметра paint, передаваемое в функцию dc_A_s равно ссылке на функцию paint


 
Сергей М. ©   (2009-11-02 13:54) [10]


> равно ссылке на функцию paint
>


А где функция-то определена и реализована ?


 
yantar92   (2009-11-02 13:55) [11]

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) [12]

вероятно, баг не в вызове процедуры  по указателю, а в методе Repaint класса series.ParentChart.Parent


 
yantar92   (2009-11-02 13:55) [13]

а определена она в той же форме


 
Сергей М. ©   (2009-11-02 13:56) [14]


> определена она в той же форме


В форме нет функций.
Там есть методы


 
yantar92   (2009-11-02 13:56) [15]

>RWolf ©   (02.11.09 13:55) [12]

>вероятно, баг не в вызове процедуры  по указателю, а в методе Repaint класса >series.ParentChart.Parent
нет, если убрать это, но после вызова paint написать application.processmassages, то вылетает именно на application.processmassages.


 
yantar92   (2009-11-02 13:58) [16]

>Сергей М. ©   (02.11.09 13:56) [14]
>
>
>> определена она в той же форме
>
>
>В форме нет функций.
>Там есть методы

ну private метод.


 
Сергей М. ©   (2009-11-02 14:00) [17]


> ну private метод


Ну так а какого тогда лешего прототип Tpaint у тебя прототип функции, а не прототип метода ?


 
yantar92   (2009-11-02 14:02) [18]

ну во первых, это работает если вызывать иную ф-цию.
во-вторых paint об"явлен в implementation а раньше нигде не оговорен.


 
Сергей М. ©   (2009-11-02 14:03) [19]


> paint об"явлен в implementation а раньше нигде не оговорен.


А причем тут тогда private ?


 
yantar92   (2009-11-02 14:04) [20]

ну если єто метод, как ті говоришь, то он может біть исключительно private, либо я чего-то не понимаю


 
Сергей М. ©   (2009-11-02 14:05) [21]


> то он может біть исключительно private


С чего бы вдруг ?

Если это метод, то он м.б. и приватный, и защищенный, и публичный


 
yantar92   (2009-11-02 14:07) [22]

ладно, суть вопроса не в этом заключалась. Я же говорю, что оно прекрасно работает если вызывать не paint а например некий paint2 код которого иной


 
Сергей М. ©   (2009-11-02 14:09) [23]


> суть вопроса не в этом заключалась


А никакого вопроса и не было.
Была констатация некоего факта, не более того.


 
yantar92   (2009-11-02 14:11) [24]

ну вопрос как от этого избавится


 
Сергей М. ©   (2009-11-02 14:12) [25]

Ну ты же сам сказал как избавиться - вызывать не paint а например некий paint2 код которого иной)


 
yantar92   (2009-11-02 14:14) [26]

нет, не в имени дело. А в том чтобы именно этот код можно было вызывать без глюков


 
Сергей М. ©   (2009-11-02 14:15) [27]


> чтобы именно этот код можно было вызывать без глюков


Для этого нужно понять, что у тебя там на самом деле  private, а что не имеет ни малейшего отношения к методу класса


 
yantar92   (2009-11-02 14:16) [28]

и, кстати, "paint2" не решает проблему с application.processmassages


 
clickmaker ©   (2009-11-02 14:17) [29]

> проблему с application.processmassages

а с ней-то какие проблемы?
и почему именно paint2 призван ее решить?


 
yantar92   (2009-11-02 14:18) [30]

>Сергей М. ©   (02.11.09 14:15) [27]
>
>
>> чтобы именно этот код можно было вызывать без глюков
>
>
>Для этого нужно понять, что у тебя там на самом деле  private, а что не имеет >ни малейшего отношения к методу класса

оно то так, но совсем загадочно почему series.addXY - работает, а series.parentchart.parent.repaint - нет


 
Сергей М. ©   (2009-11-02 14:18) [31]


> не решает проблему с application.processmassages


Надо же ! Проблемы плодятся как кролики)


 
yantar92   (2009-11-02 14:19) [32]

>clickmaker ©   (02.11.09 14:17) [29]
>
>> проблему с application.processmassages
>
>а с ней-то какие проблемы?
>и почему именно paint2 призван ее решить?
если вызывать другую процедуру по ссылке, то это не помогает


 
clickmaker ©   (2009-11-02 14:19) [33]

> processmassages

надо массажиста менять. адназначна


 
yantar92   (2009-11-02 14:22) [34]

если вызывать процедуру по ссылке, то выходит что application.processmessages перестает работать


 
Сергей М. ©   (2009-11-02 14:23) [35]


> если вызывать


Да нихрена ты ничего не вызываешь !
Где в приведенном фрагменте хоть что-либо напоминающее вызов ф-ции dc_A_st ?


 
yantar92   (2009-11-02 14:28) [36]

вызвать не dc_A_st а в
function dc_A_st(... var paint:Tpaint;var series:Tlineseries ...):extended;
...
begin
...
paint(x,y,series);
application.processmessages //[b]НЕ ПАШЕТ[/b]
...
end;


 
Медвежонок Пятачок ©   (2009-11-02 14:30) [37]

а может пашет, но неглубоко?


 
yantar92   (2009-11-02 14:32) [38]

application.processmessages - при дебаге не определен


 
RWolf ©   (2009-11-02 14:36) [39]

особых проблем в коде не видно, надо выше смотреть — как вызывают, что передают, как данные хранятся.


 
Медвежонок Пятачок ©   (2009-11-02 14:37) [40]

отключи оптимизацию кода



Страницы: 1 2 вся ветка

Текущий архив: 2009.12.20;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.018 c
15-1255897809
Юрий
2009-10-19 00:30
2009.12.20
С днем рождения ! 19 октября 2009 понедельник


15-1256014607
@!!ex
2009-10-20 08:56
2009.12.20
Как сделать движущуюся линию на Flash?


1-1228671974
vaBRAMYAK
2008-12-07 20:46
2009.12.20
Вызов функции из DLL и конвертация типов


2-1257362090
bagi
2009-11-04 22:14
2009.12.20
создание профилей настроек


15-1256128035
interrup+
2009-10-21 16:27
2009.12.20
The New York Times на русском.