Текущий архив: 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