Форум: "Начинающим";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];
ВнизВызов функции из функции Найти похожие ветки
← →
sniknik © (2011-01-17 02:09) [40]> Self-ом не являющийся.
или имеется в виду второй случай с Memo? ну так бысмысленным сделал его тот кто вручную составлял и составил неправильно, дал Mem-У Edit. ССЗБ.
← →
Servy © (2011-01-17 02:33) [41]
> Ega23 © (17.01.11 01:10) [33]
> Он будет показывать ровно то, что должен показывать. Задачи,
> чтобы это был полноценный TNotifyEvent не было.
Конечно, задача ведь была "сделайте мне как можно более неполноценный TNotifyEvent".
> sniknik © (17.01.11 02:09) [40]
> или имеется в виду второй случай с Memo? ну так бысмысленным
> сделал его тот кто вручную составлял и составил неправильно,
> дал Mem-У Edit. ССЗБ.
Я правильно вас обоих понял: то, что явный параметр TNotifyEvent - Sender - потерян и не доступен из процедуры, а неявный параметр - Self - переименован в Sender не является ошибкой в коде [22], а, напротив, является отличным примером написания кода для начинающих? Тогда будет замечательно, если вы потрудитесь обосновать это нелепое с моей точки зрения утверждение.
← →
Германн © (2011-01-17 02:36) [42]
> Германн © (17.01.11 01:58) [37]
>
>
> > Вообще-то, если решать задачу
>
> А нужно ли решать эту задачу в "Начинающим"?
> Да ещё и разводить теоретический спор на тему этой задачи?
>
> Сам сабж - бредовый. X-Y-Z
>
← →
Servy © (2011-01-17 02:44) [43]
> Сам сабж - бредовый.
Да. Однако на обсуждаемую спорную ошибку в [22] это никак не влияет, негоже сделать вид, что там все окей, позволив возможным неопытным читателям этой ветки обмануться, не так ли?
← →
Германн © (2011-01-17 03:16) [44]
> Да. Однако на обсуждаемую спорную ошибку в [22] это никак
> не влияет, негоже сделать вид, что там все окей, позволив
> возможным неопытным читателям этой ветки обмануться, не
> так ли?
Вы скачали пример по ссылке в Юрий Зотов © (16.01.11 20:08) [26]?
Вы его проверили? Он работает?
Однако, не стоит обсуждать тут пост [22], если у вас нет намерения "поспорить с ЮЗ".
← →
Servy © (2011-01-17 03:38) [45]
> Вы скачали пример по ссылке в Юрий Зотов © (16.01.11 20:
> 08) [26]?
> Вы его проверили? Он работает?
Да, он работает. Как это подтверждает отсутствие в нем обсуждаемой ошибки, явно сформулированной мной в [41]?
> Однако, не стоит обсуждать тут пост [22], если у вас нет
> намерения "поспорить с ЮЗ".
Я не пониманию, исходя из чего единственным допустимым поводом обсуждения поста является намерение "поспорить с ЮЗ". Я против него в целом ничего не имею, все люди ошибаются. Другое дело, что тут почему-то появились люди, упорно утверждающие, что так и надо.
← →
Leonid Troyanovsky © (2011-01-17 04:06) [46]
> Servy © (17.01.11 02:44) [43]
> Да. Однако на обсуждаемую спорную ошибку в [22] это никак
> не влияет, негоже сделать вид, что там все окей, позволив
> возможным неопытным читателям этой ветки обмануться, не
> так ли?
По ходу обсуждения я заметил не одну неточность в формулировках,
но не спешил их уточнять, бо поведение ТС к тому не располагало.
ЮЗ, IMHO, имел в этом случае право и на умышленную неточность.
Ну, а так, конечно, да - все люди ошибаются, и указывать на ошибки
святое форумное дело.
--
Regards, LVT.
← →
Сергей (2011-01-17 04:29) [47]
> sniknik © (15.01.11 20:50) [17]
> замени
> EvChange.Code := @EvOnChange;
> OnChange := TNotifyEvent(EvChange);
> на
> OnChange := TNotifyEvent(OnGetMy); (сохраним переменную
> собственно в объекте)
> и все будет работать
Опять не то. Задача вызвать функции OnGetMy из функции MyFunc1, а не просто прописать её в OnChange.
> Юрий Зотов © (16.01.11 08:46) [20]
>
> А ответ на вопрос "как правильно осуществить вызов из примера
> в первом постинге" все же имеется.
>
> Отвечаю: правильно - никак.
Ничего. Все эти личностные оценки правильно или не правильно давайте оставим в стороне.
← →
Германн © (2011-01-17 05:15) [48]
> Задача вызвать функции OnGetMy из функции MyFunc1, а не
> просто прописать её в OnChange.
А ТС продолжает настаивать на своём бреде. :(
← →
Servy © (2011-01-17 05:45) [49]
> Опять не то. Задача вызвать функции OnGetMy из функции MyFunc1,
> а не просто прописать её в OnChange.
Это невозможно. Указатели на локальные процедуры и функции не положено сохранять. Если вы попробуете скомпилировать следующий код:procedure Test;
procedure Local;
begin
ShowMessage("I am local");
end;
var
P: TProcedure;
begin
P := Local;
end;
То увидите вполне закономерное сообщение об ошибке:
E2094 Local procedure/function "Local" assigned to procedure variable
Однако, операцию взятия адреса у локальных процедур разработчики компилятора почему-то не запретили (вероятно напрасно). Однако, при таком вызове (через сохраненный указатель) по вполне объективным причинам обращаться к локальным переменным (включая параметры, такие как OnGetMy) родительской функции вы не сможете.
Решение вам предлагалось еще в [15]:
> в данной конкретной ситуации способ простой, не использовать
> локальную (стековую) переменную при вызове ее в кода в другом
> месте. а сохранить ее где нибудь в доступном из обоих мест
> месте, например.
> (говорил же просто)
Если оно вас по каким-то причинам не устраивает, то, судя по всему, у задачи в вашей постановке решения нет (так как по постановке задачи нельзя отменить локальность функции, а жестокая реальность не дает обращаться к стековым переменным родительской функции, если дочерняя вызывается черт знает откуда).
← →
sniknik © (2011-01-17 08:14) [50]> Опять не то. Задача вызвать функции OnGetMy из функции MyFunc1, а не просто прописать её в OnChange.
тебе же объяснили причину, она локальная(/адрес), сделай ее глобальной и сможешь указать, и ее (а переменную сохранять рядом как в [4] например).
или опять не то? т.е. уперся в один, невозможный вариант, и "решаешь" его. а нужно решать задачу. а варианты менять, а лучше изначально использовать правильные.
... есть еще возможность ..., переходи на яву, хотя, нет, точно за нее не скажу, на яваскрипт, вот там точно, такое в порядке вещей. неважно где описана процедура ее можно назначить любому событию (там это даже используется сделать "типа объекта со своим списком переменных").
← →
KSergey © (2011-01-17 08:53) [51]> Сергей (17.01.11 04:29) [47]
> Все эти личностные оценки правильно или не правильно давайте оставим в стороне.
Где здесь личностные оценки?!
← →
Сергей (2011-01-18 18:40) [52]
> Servy © (17.01.11 05:45) [49]
>
> > Опять не то. Задача вызвать функции OnGetMy из функции
> MyFunc1,
> > а не просто прописать её в OnChange.
>
> Это невозможно. Указатели на локальные процедуры и функции
> не положено сохранять.
"Не положено" и "невозможно" - это разные вещи.
← →
Плохиш © (2011-01-18 18:43) [53]
> ... есть еще возможность ..., переходи на яву, хотя, нет,
> точно за нее не скажу, на яваскрипт, вот там точно, такое
> в порядке вещей.
Разве в ява или яваскрипте есть вложенные функции?
← →
sniknik © (2011-01-18 19:14) [54]> Разве в ява или яваскрипте есть вложенные функции?
в яве не уверен, не писал на ней, а вот в яваскрипте... вот про что говорил
http://javascript.ru/basic/closure
думаю примеров там для ответа на этот вопрос достаточно.
← →
DiamondShark © (2011-01-18 20:19) [55]
> Сергей (18.01.11 18:40) [52]
> "Не положено" и "невозможно" - это разные вещи.
Не положено сохранять (вне контекста определения) указатель на локальную функцию, потому что невозможно (вне контекста определения) её вызвать.
Так понятнее?
Отсюда следует, что для того, чтобы её-таки вызвать, тебе понадобится сделать захват и восстановление контекста.
Для захвата тебе понадобится какая-нибудь структура, которая будет жить не меньше указателя на функцию (а контроль над ним ты теряешь прямо вот не одходя от кассы, хе-хе).
А для восстановления тебе придётся проэмулировать стековый фрейм.
Вот простого надёжного решения ты не хочешь, а хитроподвыперднутое глюкалово ты хочешь.
Тебе больше делать нехер? Времени свободного много? Ну сходи с тёлками потуси.
← →
Leonid Troyanovsky © (2011-01-18 22:22) [56]
> DiamondShark © (18.01.11 20:19) [55]
> Вот простого надёжного решения ты не хочешь, а хитроподвыперднутое
> глюкалово ты хочешь.
Так понятней.
Хорошо описано.
--
Regards, LVT.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.005 c