Показать полную графическую версию : MainMenu и выход из программы
novashdima
09-02-2013, 05:25
Добрый день. В проге имеется главное меню, и конечно же стандартная менюшка "Выход", все, что надо сделать при нажатии на эту клавишу, это выполнить Form.Close, но вот в чем проблема, если прописать в обработчике нажатия Close или Form.Close, то компилятор ругается, будто нет соответствующей процедуры и если запустить прогу вывалится AV.
Создавать же обработчик и в нем писать одну единственную команду Close бред... Как быть?
Как быть? »
Начать приводить примеры кода и ошибок компилятора.
А вообще, не Form.Close, а Form1.Close (если имя формы не менялось)
что то я сейчас ленюсь теорию с практикой на пальцах объяснять
Создавать же обработчик и в нем писать одну единственную команду Close бред... Как быть? »
А как вообще вы хотите выполнить "действие", не создавая обработчик?
novashdima
09-02-2013, 16:33
если имя формы не менялось »
Имя формы менялось, поэтому Form.Close я привел для примера.
Начать приводить примеры кода и ошибок компилятора. »
Я итак вроде бы понятно написать, что имеется на форме компонент MainMenu, в этом MainMenu есть Item, при событии OnClick по которому надо делать Close. Если написать в обработчик Close то компилятор говорит, мол не найдена процедура обработки Close, удалить описание? Я говорю нет, и тогда при запуске программы вылетает AV (Access Violation), что логично.
А как вообще вы хотите выполнить "действие", не создавая обработчик? »
Можно создать свою процедуру и повесить ее на обработку любых событий нескольких компонентов, почему тогда нельзя на обработку повесить вызов не своей процедуры, а вызов обработчика формы?
Меня поражает нежелание людей приводить кусочек исходного текста. Я же не весь код прошу, а только проблемный участок. Может там синтаксическая ошибка, может логическая, нам как угадывать?
Вот сложно привести небольшой фрагмент описания формы, и вызов процедуры MainMenu? Можно создать свою процедуру и повесить ее на обработку любых событий нескольких компонентов, почему тогда нельзя на обработку повесить вызов не своей процедуры, а вызов обработчика формы? »
Три раза перечитал, три раза не понял. Наверно из-за нарушений принципов ООП.
---
Еще раз прошу привести фрагмент проблемного кода.
Три раза перечитал, три раза не понял. »
А я после прочтения второй раз, думаю, что автор пытается запихать не в код обработчика метод Close, а в имя обработчика.
Что то типа этого:
вместо
procedure TForm1.НажатиеПунктаМеню(Sender: TObject);
begin
Form.Close;
end
это
ПунктМеню.OnClick:=Form.Close;
Я итак вроде бы понятно написать »
Но никто не понять, увы...
novashdima
09-02-2013, 19:44
А я после прочтения второй раз, думаю, что автор пытается запихать не в код обработчика метод Close, а в имя обработчика. »
Да, все верно
ПунктМеню.OnClick:=Form.Close; »
Так сделать реально?
Так сделать реально? »
А в документации почитать — реально или нет — нельзя?!
novashdima
09-02-2013, 23:02
А в документации почитать — реально или нет — нельзя?! »
Вот все, что есть в документации
http://clip2net.com/clip/m86446/1360436443-clip-19kb.png
novashdima, это нарушение принципов ООП. Я завтра картинку нарисую для наглядности. Некорректное взаимодействие объектов.
novashdima
10-02-2013, 00:05
ovashdima, это нарушение принципов ООП. Я завтра картинку нарисую для наглядности. Некорректное взаимодействие объектов. »
Спасибо за ответ, значит нельзя. А вот картинка, почему нарушает очень не помешает.
Вот все, что есть в документации »
А так: Vcl.Menus.TMenuItem.OnClick - XE3 API Documentation (http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.Menus.TMenuItem.OnClick)?
novashdima
10-02-2013, 01:46
А так: Vcl.Menus.TMenuItem.OnClick - XE3 API Documentation? »
Эм... то есть вместо процедуры обработки я могу ввести WM_COMMAND?
Я постарался выделить существенную часть:
Delphi
property OnClick: TNotifyEvent read FOnClick write FOnClick stored IsOnClickStored;
novashdima
10-02-2013, 02:44
Я постарался выделить существенную часть: »
Ага, то есть свойство OnClick-а TNotifyEvent, что являет собой строку-название обработчика, но получается, что Form.Close - функция, но тогда вопрос, почему я могу указать имя произвольной функции в качестве TNotifyEvent, а другую функцию, которая по идее TNotifyEvent - не могу???
Procedural Types (Delphi) - RAD Studio XE3 (http://docwiki.embarcadero.com/RADStudio/XE3/en/Procedural_Types)
Events Are Properties - RAD Studio XE3 (http://docwiki.embarcadero.com/RADStudio/XE3/en/Events_Are_Properties)
Во всяком случае — имя, не строку. Почему «по идее»? Как определили? Каков код?
novashdima, я пробовал Delphi один раз, в третьей версии, лет пятнадцать назад ;). Не стесняйтесь излагать подробно и приводить код, на форуме достаточно просвещённого народа, чтобы помочь.
novashdima
10-02-2013, 06:08
Во всяком случае — имя, не строку »
Я думал имя это строка...
Почему «по идее»? »
Эм... свойство у event у нас получается типа TNotifyEvent , которая является именем обработчика (функции). При этом свойством одного event указать функцию-обработчик другого event у меня не получилось, может попробовать свойством event назначить свойство другого компонента, то есть свойство OnClick у MainMenu назначить Form.OnClose?
Раз так просите привожу конкретный пример:
Есть ExitFileItem: TMenuItem
ExitFileItem.OnClick = ExitProgram
procedure TMainForm.ExitProgram(Sender: TObject);
begin
Close;
end;
Все, что надо, это значение свойства ExitFileItem.OnClick присвоить в Object Inspector MainForm.Close|MainForm.CloseQuery|Exit|Application.Terminate|Halt|WM_Close|WM_Quit... может еще какие способы закрыть приложение есть, я все что знал сказал)
п.с. при этом все, что меня интересует, так это то, почему я значением свойства могу указать MyFunction
type
TMainForm = class(TForm)
procedure MyFunction(Sender: TObject);
То есть процедура у нас MainForm.MyFunction(Sender) и все отлично, а вот указать MainForm.Close(Sender) я не могу, вопрос - почему?
Не стесняйтесь излагать подробно и приводить код, на форуме достаточно просвещённого народа, чтобы помочь. »
Русскоязычные форумы отличаются тем, что в процессе обсуждения проблемы сначала все скажут, какой ТС лох, что он тут забыл, ему в раздел новички или вообще с этого форума, через постов 15-20 начнут обсуждать суть темы и или окажется, что никто не знает, что делать или подскажут вариантов 5 минимум решения проблемы) На англоязычных форумах/чатах если задашь вопрос, то тебе сразу прямо ответят, дадут линк, объяснят что к чему и пожелают удачи)
Русскоязычные форумы отличаются тем, … »
Что делать ;), «у каждого свои недостатки». Впрочем, я лично видел всякое.
а вот указать MainForm.Close(Sender) я не могу, вопрос - почему? »
Возможно, не тот тип? Впрочем, как я писал выше, мои знания давно устарели. Подождём более опытных коллег.
Любезный
10-02-2013, 12:12
Так... ТС, напиши в обработчике нажатия на пункт меню команду Application.Terminate, и всё. Только так, а не всякими Form1.Close, можно корректно завершить работу всего приложения.
А если нужно просто закрывать текущую форму, надо приучаться писать Self.Close, ибо если в будущем планируешь стать программистом, тебе, возможно, придётся создавать большое количество идентичных форм с разными именами, поэтому ты никакими FormXXX.Close не отделаешься.
На англоязычных форумах/чатах если задашь вопрос, то тебе сразу прямо ответят, дадут линк, объяснят что к чему и пожелают удачи)
Ты бы лучше вместо чтения англоязычных форумов почитал бы Help к Delphi и хорошие книжки по ней. Да и английский бы заодно выучил, прежде чем дезинформировать нас таким высказыванием.
novashdima
10-02-2013, 16:54
ТС, напиши в обработчике нажатия на пункт меню команду Application.Terminate, и всё »
---------------------------
Error
---------------------------
'Application.Terminate' is not a valid identifier.
---------------------------
OK Help
---------------------------
FormXXX.Close »
У меня в программах не бывает 100 форм, я обхожусь 5-10 и всегда использовал FormXXX.Close или FormXXX.Hide и все было нормально.
Self.Close »
Что дает Self передавая его в качестве параметра Sender и в таком варианте?
Ты бы лучше вместо чтения англоязычных форумов почитал бы Help к Delphi »
Все, что было написано в хелпе я приложил (http://forum.oszone.net/post-2086652-9.html), и теперь расскажите, где там написано о том, что можно писать Application.Terminate или о чем еще надо.
хорошие книжки »
Читал я две книжки, там и про ООП написано и про сами языки, но нигде не написано, что именно можно указывать значением свойства Event
Да и английский бы заодно выучил, прежде чем дезинформировать нас таким высказыванием. »
У меня среднее знание английского, понять пойму, рассказать - посложнее будет, да и вообще какое ваше дело?
Никто не дезинформирует, это чистейшая правда, пройдитесь по форумам, к нас чтобы выяснить какую-то мелочь надо будет пол часа доказывать, что ты не верблюд.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.