![]() |
MainMenu и выход из программы
Добрый день. В проге имеется главное меню, и конечно же стандартная менюшка "Выход", все, что надо сделать при нажатии на эту клавишу, это выполнить Form.Close, но вот в чем проблема, если прописать в обработчике нажатия Close или Form.Close, то компилятор ругается, будто нет соответствующей процедуры и если запустить прогу вывалится AV.
Создавать же обработчик и в нем писать одну единственную команду Close бред... Как быть? |
Цитата:
А вообще, не Form.Close, а Form1.Close (если имя формы не менялось) что то я сейчас ленюсь теорию с практикой на пальцах объяснять |
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Меня поражает нежелание людей приводить кусочек исходного текста. Я же не весь код прошу, а только проблемный участок. Может там синтаксическая ошибка, может логическая, нам как угадывать?
Вот сложно привести небольшой фрагмент описания формы, и вызов процедуры MainMenu? Цитата:
--- Еще раз прошу привести фрагмент проблемного кода. |
Цитата:
Что то типа этого: вместо Код:
procedure TForm1.НажатиеПунктаМеню(Sender: TObject); Код:
ПунктМеню.OnClick:=Form.Close; Цитата:
|
|
Цитата:
|
Цитата:
![]() |
novashdima, это нарушение принципов ООП. Я завтра картинку нарисую для наглядности. Некорректное взаимодействие объектов.
|
Цитата:
|
Цитата:
|
Цитата:
|
Я постарался выделить существенную часть:
Цитата:
|
Цитата:
|
Procedural Types (Delphi) - RAD Studio XE3
Events Are Properties - RAD Studio XE3 Во всяком случае — имя, не строку. Почему «по идее»? Как определили? Каков код? novashdima, я пробовал Delphi один раз, в третьей версии, лет пятнадцать назад ;). Не стесняйтесь излагать подробно и приводить код, на форуме достаточно просвещённого народа, чтобы помочь. |
Цитата:
Цитата:
Раз так просите привожу конкретный пример: Код:
Есть ExitFileItem: TMenuItem п.с. при этом все, что меня интересует, так это то, почему я значением свойства могу указать MyFunction Код:
type Цитата:
|
Цитата:
Цитата:
|
Так... ТС, напиши в обработчике нажатия на пункт меню команду Application.Terminate, и всё. Только так, а не всякими Form1.Close, можно корректно завершить работу всего приложения.
А если нужно просто закрывать текущую форму, надо приучаться писать Self.Close, ибо если в будущем планируешь стать программистом, тебе, возможно, придётся создавать большое количество идентичных форм с разными именами, поэтому ты никакими FormXXX.Close не отделаешься. Цитата:
|
Цитата:
Error --------------------------- 'Application.Terminate' is not a valid identifier. --------------------------- OK Help --------------------------- Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Никто не дезинформирует, это чистейшая правда, пройдитесь по форумам, к нас чтобы выяснить какую-то мелочь надо будет пол часа доказывать, что ты не верблюд. |
Цитата:
Цитата:
Цитата:
Если поставил - посмотри, что у тебя в списке модулей (uses). Наверняка там нет модуля Forms, в котором прописан идентификатор Application. |
Цитата:
Цитата:
Цитата:
Цитата:
1. Если бы в uses не было Forms, то компилятор бы ругался даже на объявление моей формы. 2. Компилятор сам добавляет недостающие модули в uses. 3. Если бы модуля не было, то я получил бы Undeclared Identifier "Application.Terminate", а я получил "is not valid identifier" (для знатоков английского - не верный идентификатор) |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
К тому же, к чему я должен по вашему прислушиваться? как оказалось вы даже не поняли, что я хочу сделать! К тому же я до сих пор обращаюсь в кам на Вы, что вы почему то не делаете, видимо воспитание такое. П.С. Спасибо за все новое, что я узнал в этой теме, а это пока из 24 комментов то, какую WinApi функцию вызывает terminate и какой вызывается он сам. Цитата:
Цитата:
Цитата:
Цитата:
Код:
<IDname> is not a valid identifierFrom RAD Studio XE2 |
Хорошо, процитируем топик.
Цитата:
Цитата:
Цитата:
Ну раз у тебя ХЕ2, задам такой вопрос: приложение, которое ты делаешь - VCL или FireMonkey? |
Цитата:
Цитата:
Цитата:
VCL |
Цитата:
Если бы вместо пункта меню была, например, кнопка, у неё есть свойство ModalResult, установив которое, можно задать закрытие формы по щелчку. Но у пунктов меню такого свойства нет. Так что... пиши обработчик с одной командой, хотя бы в ввиде, приведённом в верхнем коде поста: http://forum.oszone.net/post-2086467-6.html |
Цитата:
Цитата:
Кстати вопрос не по теме, но не знаешь какой-то компонент или dll для работы с 7zip архивами? |
Цитата:
Цитата:
|
Цитата:
http://www.7-zip.org/links.html http://stackoverflow.com/questions/7...ip-from-delphi http://www.angusj.com/delphi/ Без обид. |
Цитата:
Код:
procedure TMainForm.Met11Change(Sender: TObject); Цитата:
Я пробовал много вариантов, с сайта 7zip скачивал порт для делфи, но что-то было не так, то ли функционал то ли что. Находил так же другие компоненты, пытался их использовать, один был очень даже неплох, сжимал нормально, а вто с расжатием одна проблема была, при сжатии если нужный файл находился мне допустим в C:\Windows\"много всяких папок"\notepad.exe, то архив будет такой: папка Windows -> много всяких папок -> нужный файл Насчет JclCompression - я вроде бы в нем разобраться не смог( Со стандартной библиотекой System.Zip тоже какие-то траблы были |
Цитата:
Возьмём тот же код и слегка переделаем, используя Sender. Код:
procedure TMainForm.Met11Change(Sender: TObject); |
Цитата:
Надеюсь понятно написал. |
Начиная с D2010, можно решить и этот вопрос. Но тут уже посложнее. Привязка будет не к номеру, а к имени.
У любого компонента есть свойство Name. Все компоненты формы можно обойти в цикле и найти нужные, с нужными именами. Пример: Код:
var lab: TLabel; |
Цитата:
Код:
procedure TMainForm.MetChange(Sender: TObject); |
Ну это уж решай сам - всё зависит от конкретной задачи.
И, кстати, чтобы код проще читался, можно объявить отдельную переменную типа TsSpinEdit, присвоить ей значение Sender as TsSpinEdit и указывать в коде её, а не столь длинную фразу. |
Нашел вот еще один способ:
Код:
S:='CheckBox'+IntToStr(I+1); |
Согласен, тоже вариант.
|
Цитата:
|
Цитата:
|
Цитата:
Код:
for i := 1 to Count do |
Ну что же, весь код я пересмотрел и переделал, в результате главный исходник уменьшился с 2900 строк кода до 1700, что не может не радовать. Также введя такую обработку я избавился от головняка в плане сохранения настроек в файл, за что огромное спасибо. Однако остается открытым два вопроса, каким образом можно объединить такие процедуры:
Код:
procedure TMainForm.EnergyInfo(Sender: TObject); |
novashdima, желательно под каждый новый вопрос, не имеющий непосредственного отношения к названию этой темы, заводить новую.
|
Цитата:
|
Цитата:
Цитата:
И подскажите по поводу остальных вопросов. upd Создал темы под каждый вопрос. |
Цитата:
|
Цитата:
|
Время: 02:27. |
Время: 02:27.
© OSzone.net 2001-