Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - MainMenu и выход из программы

Ответить
Настройки темы
Delphi - MainMenu и выход из программы

Пользователь


Сообщения: 108
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


Добрый день. В проге имеется главное меню, и конечно же стандартная менюшка "Выход", все, что надо сделать при нажатии на эту клавишу, это выполнить Form.Close, но вот в чем проблема, если прописать в обработчике нажатия Close или Form.Close, то компилятор ругается, будто нет соответствующей процедуры и если запустить прогу вывалится AV.
Создавать же обработчик и в нем писать одну единственную команду Close бред... Как быть?

Отправлено: 05:25, 09-02-2013

 

Старожил


Сообщения: 295
Благодарности: 30

Профиль | Отправить PM | Цитировать


Цитата novashdima:
У меня в программах не бывает 100 форм, я обхожусь 5-10 и всегда использовал FormXXX.Close или FormXXX.Hide и все было нормально. »
Я же написал: если хочешь стать программистом.

Цитата novashdima:
Что дает Self передавая его в качестве параметра Sender и в таком варианте? »
Sender тут ни при чём, его роль обычно служебная и состоит в том, чтобы передать в обработчик информацию о любом объекте для дальнейшей обработки в коде, которая производится отнюдь не всегда. А в таком варианте Self позволяет закрыть именно тот экземпляр TForm, из которого вызывается метод.

Цитата novashdima:
Application.Terminate' is not a valid identifier. »
Точку с запятой в конце строки не поставил?
Если поставил - посмотри, что у тебя в списке модулей (uses). Наверняка там нет модуля Forms, в котором прописан идентификатор Application.

Отправлено: 17:10, 10-02-2013 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 108
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Любезный:
Я же написал: если хочешь стать программистом. »
Ок, ТС лох и опозорился и не хочу я стать программистом, довольны?
Цитата Любезный:
А в таком варианте Self позволяет закрыть именно тот экземпляр TForm, из которого вызывается метод. »
Тогда Self.Close ничем не отличается от Close, так?
Цитата Любезный:
Точку с запятой в конце строки не поставил? »
ЧТО??? Точка с запятой??? Это где вы видели, чтобы имя обработчика указывалось с точкой с запятой? Для уверенности, попробовал поставить точку с запятой, получил выщеуказанное мною сообщение об ошибке.
Цитата Любезный:
Если поставил - посмотри, что у тебя в списке модулей (uses). Наверняка там нет модуля Forms, в котором прописан идентификатор Application. »
На чем основаны ваши предположения? На том, что ТС нуб?
1. Если бы в uses не было Forms, то компилятор бы ругался даже на объявление моей формы.
2. Компилятор сам добавляет недостающие модули в uses.
3. Если бы модуля не было, то я получил бы Undeclared Identifier "Application.Terminate", а я получил "is not valid identifier" (для знатоков английского - не верный идентификатор)

Отправлено: 17:24, 10-02-2013 | #22


Старожил


Сообщения: 295
Благодарности: 30

Профиль | Отправить PM | Цитировать


Цитата novashdima:
Все, что было написано в хелпе я приложил, и теперь расскажите, где там написано о том, что можно писать Application.Terminate или о чем еще надо. »
Плохо приложил.

Цитата:
Forms.TApplication.Terminate
From RAD Studio VCL Reference
Delphi Information
From Forms.pas
procedure Terminate;
Unit: Forms
Type: method
Visibility: public
Member Of: TApplication
Description
Ends application execution.
Call Terminate to end the application programmatically. By calling Terminate rather than freeing the application object, you allow the application to shut down in an orderly fashion. Terminate calls the Windows API PostQuitMessage function to perform an orderly shutdown of the application. Terminate is not immediate. Terminate is called automatically on a WM_QUIT message and when the main form closes.
Цитата novashdima:
Ок, ТС лох и опозорился и не хочу я стать программистом, довольны? »
Зачем хамишь? Лучше бы прислушался и вник.

Цитата novashdima:
Тогда Self.Close ничем не отличается от Close, так? »
Можно сказать и так. Но лучше приучаться писать именно Self.Close. Причин много. Есть, например, блоки with Object do begin...end, в которых могут быть объекты со своими методами Close.

Цитата novashdima:
ЧТО??? Точка с запятой??? Это где вы видели, чтобы имя обработчика указывалось с точкой с запятой? Для уверенности, попробовал поставить точку с запятой, получил выщеуказанное мною сообщение об ошибке. »
Кто тебе сказал, что Application.Terminate - это имя обработчика? Это код, который нужно вставить в обработчик. Для чего, по твоему, в конце строки добавляют точку с запятой?

Цитата novashdima:
1. Если бы в uses не было Forms, то компилятор бы ругался даже на объявление моей формы. »
Не факт.

Цитата novashdima:
2. Компилятор сам добавляет недостающие модули в uses. »
Ничего подобного. Компилятор сам не добавляет ничего - это дело среды.

Цитата novashdima:
3. Если бы модуля не было, то я получил бы Undeclared Identifier "Application.Terminate", а я получил "is not valid identifier" (для знатоков английского - не верный идентификатор) »
Ну так прочитай в хелпе описание этой ошибки и сделай выводы.

Отправлено: 17:25, 10-02-2013 | #23


Пользователь


Сообщения: 108
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Любезный:
Плохо приложил. »
Расскажите теперь о категориях оценки хорошо/плохо приложил, а что что-то я таких не знаю.
Цитата Любезный:
Forms.TApplication.Terminate
From RAD Studio VCL Reference
Delphi Information
From Forms.pas
procedure Terminate;
Unit: Forms
Type: method
Visibility: public
Member Of: TApplication
Description
Ends application execution.
Call Terminate to end the application programmatically. By calling Terminate rather than freeing the application object, you allow the application to shut down in an orderly fashion. Terminate calls the Windows API PostQuitMessage function to perform an orderly shutdown of the application. Terminate is not immediate. Terminate is called automatically on a WM_QUIT message and when the main form closes. »
Я итак знал, что данная процедура находится в модуле Forms из Forms.pas и то, что она завершает приложение. Узнал, что данная процедура вызывает WinApi функцию PostQuitMessage. То, что WM_QUIT и закрытие главной формы вызывает Terminate я подозревал, как думаю терминейт вызывает и WM_EXIT|Halt. Но! как данная справка поможет мне в решении проблемы?

Цитата Любезный:
Зачем хамишь? Лучше бы прислушался и вник. »
Потому что каждый вновь прибывший уверенно говорит, что я полный лох и не могу одну строку кода написать.
К тому же, к чему я должен по вашему прислушиваться? как оказалось вы даже не поняли, что я хочу сделать! К тому же я до сих пор обращаюсь в кам на Вы, что вы почему то не делаете, видимо воспитание такое.
П.С. Спасибо за все новое, что я узнал в этой теме, а это пока из 24 комментов то, какую WinApi функцию вызывает terminate и какой вызывается он сам.
Цитата Любезный:
Кто тебе сказал, что Application.Terminate - это имя обработчика? Это код, который нужно вставить в обработчик. Для чего, по твоему, в конце строки добавляют точку с запятой? »
О БОГИ!!! Вы меня совсем не слушали? Я не спрашивал, как создать свой обработчик и написать туда одну из множества команд завершения приложения, я спрашивал, как можно вместо имени обработчика указать саму процедуру выхода из приложения (надеюсь теперь все поймут меня)
Цитата Любезный:
Не факт. »
Ну расскажите мне тогда, как без использования определенного модуля компилятор вытащит исходник и будет знать, что за функцию я написал?
Цитата Любезный:
Ничего подобного. Компилятор сам не добавляет ничего - это дело среды. »
Да, согласен, тут лоханулся, я хотел сказать, не компилятор добавляет, а среда добавляет автоматически (с версии 2009 вроде бы среда это делает)
Цитата Любезный:
Ну так прочитай в хелпе описание этой ошибки и сделай выводы. »
Хм... вы думаете я ни разу не встречался с такой ошибкой? ошибаетесь, и опять же привожу вырезку из хелпа, и тогда встречный вопрос, сделайте вывод из этой вырезки (кроме того, что означает сама ошибка - неверный идентификатор)
Код: Выделить весь код
<IDname> is not a valid identifierFrom RAD Studio XE2
Go Up to Error Messages Index 




The identifier name is invalid. Ensure that the first character is a letter or an underscore (_). The characters that follow must be letters, digits, or underscores, and there cannot be any spaces in the identifier. 

Retrieved from "http://docwiki.embarcadero.com/RADStudio/en/IDname_is_not_a_valid_identifier"

Отправлено: 17:37, 10-02-2013 | #24


Старожил


Сообщения: 295
Благодарности: 30

Профиль | Отправить PM | Цитировать


Хорошо, процитируем топик.

Цитата novashdima:
Создавать же обработчик и в нем писать одну единственную команду Close бред... Как быть? »
Обоснуй, почему бред.

Цитата novashdima:
я спрашивал, как можно вместо имени обработчика указать саму процедуру выхода из приложения (надеюсь теперь все поймут меня) »
Здесь проще ответить вопросом: а зачем?

Цитата novashdima:
если прописать в обработчике нажатия Close или Form.Close, то компилятор ругается, будто нет соответствующей процедуры и если запустить прогу вывалится AV. »
Мне интересно, что значит "нет соответствующей процедуры". В норме такого быть не должно.
Ну раз у тебя ХЕ2, задам такой вопрос: приложение, которое ты делаешь - VCL или FireMonkey?

Отправлено: 17:58, 10-02-2013 | #25


Пользователь


Сообщения: 108
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Любезный:
Обоснуй, почему бред. »
Я написал в следующем посте, что создавать обработчик и писать в нем всего одну команду имхо бред.
Цитата Любезный:
Здесь проще ответить вопросом: а зачем? »
Я немного не так себя процитировал, я спрашивал, можно ли вместо имени обработчика указать процедуру или нет, если да, то как, если нет, то почему.
Цитата Любезный:
Мне интересно, что значит "нет соответствующей процедуры". В норме такого быть не должно.
Ну раз у тебя ХЕ2, задам такой вопрос: приложение, которое ты делаешь - VCL или FireMonkey? »
Что значит? Да очень просто, в имени обработчика пишите "qwertyui" и не объявляйте и не создавайте такую процедуру в коде, как результат объявление есть, а самой процедуры обработки нет.
VCL

Отправлено: 18:05, 10-02-2013 | #26


Старожил


Сообщения: 295
Благодарности: 30

Профиль | Отправить PM | Цитировать


Цитата novashdima:
Что значит? Да очень просто, в имени обработчика пишите "qwertyui" и не объявляйте и не создавайте такую процедуру в коде, как результат объявление есть, а самой процедуры обработки нет. »
Даже комментировать не хочется.

Если бы вместо пункта меню была, например, кнопка, у неё есть свойство ModalResult, установив которое, можно задать закрытие формы по щелчку. Но у пунктов меню такого свойства нет. Так что... пиши обработчик с одной командой, хотя бы в ввиде, приведённом в верхнем коде поста:
http://forum.oszone.net/post-2086467-6.html

Отправлено: 18:22, 10-02-2013 | #27


Пользователь


Сообщения: 108
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Любезный:
Даже комментировать не хочется. »
Почему?
Цитата Любезный:
Так что... пиши обработчик с одной командой »
Да так у меня давно уже написано, просто перебираю код, пытаюсь избавиться от говнокода.

Кстати вопрос не по теме, но не знаешь какой-то компонент или dll для работы с 7zip архивами?

Отправлено: 18:28, 10-02-2013 | #28


Старожил


Сообщения: 295
Благодарности: 30

Профиль | Отправить PM | Цитировать


Цитата novashdima:
Почему? »
Мне просто стало понятно, что ты пытался написать Form.Close в инспекторе объектов. В нём можно писать только названия уже объявленных в описании класса формы обработчиков событий. Для чужих процедур и методов он не предназначен.

Цитата novashdima:
Да так у меня давно уже написано, просто перебираю код, пытаюсь избавиться от говнокода. »
В этом никакого говнокода нет. Но многие начинающие злоупотребляют такими обработчиками, помещая их на одну форму по нескольку штук. Вот от чего нужно избавляться. Вместо этого достаточно присвоить один обработчик нескольким пунктам/кнопкам и.т.п. через тот же инспектор объектов

Отправлено: 18:42, 10-02-2013 | #29


Аватара для cookie_monster

Новый участник


Сообщения: 41
Благодарности: 9

Профиль | Отправить PM | Цитировать


Цитата novashdima:
Кстати вопрос не по теме, но не знаешь какой-то компонент или dll для работы с 7zip архивами? »
Честно, прочитывая эту тему поймал себя на мысли, что вы, не умеете пользоваться поиском.

http://www.7-zip.org/links.html
http://stackoverflow.com/questions/7...ip-from-delphi
http://www.angusj.com/delphi/

Без обид.

Отправлено: 18:42, 10-02-2013 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - MainMenu и выход из программы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2008 R2 - Выход в интернет из автоматического задания (программы) thundersilence Windows Server 2008/2008 R2 0 21-09-2012 10:27
VBA - выход из цикла иоанн Программирование и базы данных 2 26-05-2009 22:24
Visual Basic .NET - отследить выход из программы StePashKo Программирование и базы данных 2 07-10-2006 16:32
MainMenu DelphiLesson Программирование и базы данных 2 14-09-2003 16:01
Выход из KDE karlison Общий по Linux 8 03-02-2003 09:42




 
Переход