|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
02.09.2019, 10:15 | #11 | |
Пользователь
Регистрация: 14.08.2019
Сообщений: 18
|
Цитата:
Предположил, что это функция API, забил в поисковик, но ничего, кроме Вашего сообщения выше, не нашел, следовательно, нет такой функции API, да если бы и была, разве не переопределил я ее в разделе interface? (к тому же, у меня процедура). Моя процедура прекрасно видит объявленные в interface имена, иначе, откуда она знает о функциях DirectoryExists() и CreateDir(), да и саму функцию Application.Terminate? К тому же она не только видит, но и изменяет объявленную мной глобальную переменную Bol типа boolean (о чем я писал в предыдущем сообщении). И еще, что такое Регулярная процедура? Не помню, чтобы раньше мне попадался такой термин, а если и попадался, то я считал, что это обычная процедура, всегда существующая, внутреннее содержимой которой может изменяться, но суть оставаться прежней, просто кому-то захотелось назвать ее регулярной. Как армия, вооружение и личный состав может меняться, но армия остается армией до тех пор, пока есть государство, не будет государства - не будет и армии. Не будет армии, не будет существовать и регулярной процедуры (поэтому и не отложилось в памяти). Мои рассуждения выше - суть полное непонимание видимости и локализации имен в процедурах и функциях? Подскажите, в чем я не прав, если нужно начинать с основ, то дайте ссылку на нужную литературу (на русском языке, желательно). Имеющиеся у меня источники (Архангельский, Фаронов...) не противоречат моим рассуждениям. (про регулярные процедуры - просто вообще не рассказывают, а если рассказывают, то используют другой термин) |
|
02.09.2019, 11:18 | #12 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
|
02.09.2019, 11:19 | #13 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
он выдается за какое-то количество сообщений автоматически
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
02.09.2019, 11:39 | #14 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
|
02.09.2019, 18:38 | #15 |
Пользователь
Регистрация: 14.08.2019
Сообщений: 18
|
Спасибо Serge_Bliznykov.
Объяснил все легко и просто! Регулярная функция существует вне всяких армий, как, скажем закон ома - если есть напряжение и сопротивление, то ток можно вычислить по закону ома. И все же, регулярные функции пишутся в некотором модуле (а может и нет?) и все известные модулю имена известны и функции. Во всех случаях, написанная мною, теперь я могу гордо сказать регулярная процедура, точно видит все имена, которые определены в модулях предложения uses. Больше того, я могу программно щелкнуть по кнопке, принадлежащей некоторой форме, если эта форма включена в предложение uses, то есть, использовать метод класса. Откликнитесь, если я опять не правильно понял и гоню пургу С уважением, Николай |
02.09.2019, 19:20 | #16 |
Пользователь
Регистрация: 14.08.2019
Сообщений: 18
|
И все же, вопрос был: "Почему сначала завершается тело вызывающей процедуры и лишь затем завершается приложение"
Сейчас мне это интересно не в практических целях, а в чисто познавательных. Почему нарушается последовательность действий? Причем здесь регулярная процедура? Если объявить эту процедуру как метод класса (формы), то последовательность действий не будет нарушаться? Ответите: "Возьми и объяви". Попробую конечно, но каков бы не был результат объяснить (самому себе) не смогу. Интересно, такое поведение возможно только если требуется закрыть приложение, или и в других случаях? Не могут ли возникать другие, не столь заметные ошибки? Я довольно часто вызываю из регулярных функций другие процедуры, как регулярные процедуры, так и методы, причем цепочка может быть довольно длинной. Ошибок не замечал, но могут ли они быть в принципе. Надо ли выполнять некоторые действия, чтобы избежать подобных ошибок. |
03.09.2019, 01:45 | #17 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,894
|
Отнюдь нет. У каждого имени есть своя область видимости. Регулярная функция прекрасно видит все переменные описанные в самом модуле в секциях interface и implementation. И для обращения к таким переменным ей достаточно только имени, ибо и у процедуры и у переменных одна и та же фамилия. Но поля формы описанной в этом модуле имеют "другую фамилию", а именно ссылку на экземпляр этой формы, который будет создан в realtime. Компилятор никак не может на этапе компиляции знать эту ссылку хотя бы потому, что экземпляров некоей конкретной формы может быть более чем один. В этом кстати и есть главная разница между переменными модуля и полями формы. Переменные модуля всегда имеют адреса, которые известны на этапе компиляции, в отличие от полей формы.
Последний раз редактировалось northener; 03.09.2019 в 02:14. |
03.09.2019, 01:58 | #18 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,894
|
Последовательность действий никак не нарушается. Просто вам стоит прочитать про "механизм сообщений" в Windows. Дело в том, что метод TForm.Close отнюдь не вызывает сразу "закрытия формы". Метод TForm.Close всего лишь помещает в очередь сообщений окна данной формы сообщение WM_CLOSE методом PostMessage. После чего выполнение данной процедуры продолжается пока она не завершится. После её завершения ОС Windows сама решит когда нужно/стоит обработать/дать время окну для обработки этого сообщения.
|
03.09.2019, 02:12 | #19 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,894
|
|
03.09.2019, 11:23 | #20 |
Пользователь
Регистрация: 14.08.2019
Сообщений: 18
|
Спасибо!
Сам же не так давно разбирал в ollydbg закрытие приложение и прекрасно помню, что посылалось сообщение. (Windows вообще общается с приложениями сообщениями, а может и между собственными модулями, так, чтобы никто не слышал, тоже, в отличии от DOS, где вызывались прерывания) Процедура или функция? - конечно функция. В данном случае она будет работать гораздо быстрей, поскольку в теле функции не надо будет изменять глобальную переменную, а это несколько строк кода ассемблера. В сообщениях я пишу "процедура", только чтобы не потерять связь с предыдущими сообщениями. И еще вопрос, раз пошла такая пьянка (халява), для Вас ответить - раз плюнуть, а мне ворошить интернет... Вопрос чисто познавательный У меня написан обработчик события OnClose - предлагает сохранить работу, очищает динамически выделенную память... Если закрывать приложение FormClose, то обработчик срабатывает, а если Application.Terminate - то нет. В то же время я откуда-то зная, что Application.Terminate посылает сообщение WM_CLOSE всем формам приложения. Почему не срабатывает обработчик? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как закрыть соединение с радио | Михаил Юрьевич | Общие вопросы Delphi | 0 | 03.04.2009 19:54 |
Закрыть чужое приложение | Михаил Юрьевич | Общие вопросы Delphi | 3 | 28.03.2009 21:26 |
Как изменить своё имя? | Манжосов Денис :) | О форуме и сайтах клуба | 11 | 22.07.2008 11:16 |
Своё окно в трее | Altera | Общие вопросы Delphi | 10 | 02.07.2008 10:17 |
как закрыть программу? | Alar | Общие вопросы Delphi | 0 | 29.10.2006 20:22 |