Показать полную графическую версию : MainMenu и выход из программы
Любезный
10-02-2013, 17:10
У меня в программах не бывает 100 форм, я обхожусь 5-10 и всегда использовал FormXXX.Close или FormXXX.Hide и все было нормально. »
Я же написал: если хочешь стать программистом.
Что дает Self передавая его в качестве параметра Sender и в таком варианте? »
Sender тут ни при чём, его роль обычно служебная и состоит в том, чтобы передать в обработчик информацию о любом объекте для дальнейшей обработки в коде, которая производится отнюдь не всегда. А в таком варианте Self позволяет закрыть именно тот экземпляр TForm, из которого вызывается метод.
Application.Terminate' is not a valid identifier. »
Точку с запятой в конце строки не поставил?
Если поставил - посмотри, что у тебя в списке модулей (uses). Наверняка там нет модуля Forms, в котором прописан идентификатор Application.
novashdima
10-02-2013, 17:24
Я же написал: если хочешь стать программистом. »
Ок, ТС лох и опозорился и не хочу я стать программистом, довольны?
А в таком варианте Self позволяет закрыть именно тот экземпляр TForm, из которого вызывается метод. »
Тогда Self.Close ничем не отличается от Close, так?
Точку с запятой в конце строки не поставил? »
ЧТО??? Точка с запятой??? Это где вы видели, чтобы имя обработчика указывалось с точкой с запятой? Для уверенности, попробовал поставить точку с запятой, получил выщеуказанное мною сообщение об ошибке.
Если поставил - посмотри, что у тебя в списке модулей (uses). Наверняка там нет модуля Forms, в котором прописан идентификатор Application. »
На чем основаны ваши предположения? На том, что ТС нуб?
1. Если бы в uses не было Forms, то компилятор бы ругался даже на объявление моей формы.
2. Компилятор сам добавляет недостающие модули в uses.
3. Если бы модуля не было, то я получил бы Undeclared Identifier "Application.Terminate", а я получил "is not valid identifier" (для знатоков английского - не верный идентификатор)
Любезный
10-02-2013, 17:25
Все, что было написано в хелпе я приложил, и теперь расскажите, где там написано о том, что можно писать 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.
Ок, ТС лох и опозорился и не хочу я стать программистом, довольны? »
Зачем хамишь? Лучше бы прислушался и вник.
Тогда Self.Close ничем не отличается от Close, так? »
Можно сказать и так. Но лучше приучаться писать именно Self.Close. Причин много. Есть, например, блоки with Object do begin...end, в которых могут быть объекты со своими методами Close.
ЧТО??? Точка с запятой??? Это где вы видели, чтобы имя обработчика указывалось с точкой с запятой? Для уверенности, попробовал поставить точку с запятой, получил выщеуказанное мною сообщение об ошибке. »
Кто тебе сказал, что Application.Terminate - это имя обработчика? Это код, который нужно вставить в обработчик. Для чего, по твоему, в конце строки добавляют точку с запятой?
1. Если бы в uses не было Forms, то компилятор бы ругался даже на объявление моей формы. »
Не факт.
2. Компилятор сам добавляет недостающие модули в uses. »
Ничего подобного. Компилятор сам не добавляет ничего - это дело среды.
3. Если бы модуля не было, то я получил бы Undeclared Identifier "Application.Terminate", а я получил "is not valid identifier" (для знатоков английского - не верный идентификатор) »
Ну так прочитай в хелпе описание этой ошибки и сделай выводы.
novashdima
10-02-2013, 17:37
Плохо приложил. »
Расскажите теперь о категориях оценки хорошо/плохо приложил, а что что-то я таких не знаю.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"
Любезный
10-02-2013, 17:58
Хорошо, процитируем топик.
Создавать же обработчик и в нем писать одну единственную команду Close бред... Как быть? »
Обоснуй, почему бред.
я спрашивал, как можно вместо имени обработчика указать саму процедуру выхода из приложения (надеюсь теперь все поймут меня) »
Здесь проще ответить вопросом: а зачем?
если прописать в обработчике нажатия Close или Form.Close, то компилятор ругается, будто нет соответствующей процедуры и если запустить прогу вывалится AV. »
Мне интересно, что значит "нет соответствующей процедуры". В норме такого быть не должно.
Ну раз у тебя ХЕ2, задам такой вопрос: приложение, которое ты делаешь - VCL или FireMonkey?
novashdima
10-02-2013, 18:05
Обоснуй, почему бред. »
Я написал в следующем посте, что создавать обработчик и писать в нем всего одну команду имхо бред.
Здесь проще ответить вопросом: а зачем? »
Я немного не так себя процитировал, я спрашивал, можно ли вместо имени обработчика указать процедуру или нет, если да, то как, если нет, то почему.
Мне интересно, что значит "нет соответствующей процедуры". В норме такого быть не должно.
Ну раз у тебя ХЕ2, задам такой вопрос: приложение, которое ты делаешь - VCL или FireMonkey? »
Что значит? Да очень просто, в имени обработчика пишите "qwertyui" и не объявляйте и не создавайте такую процедуру в коде, как результат объявление есть, а самой процедуры обработки нет.
VCL
Любезный
10-02-2013, 18:22
Что значит? Да очень просто, в имени обработчика пишите "qwertyui" и не объявляйте и не создавайте такую процедуру в коде, как результат объявление есть, а самой процедуры обработки нет. »
Даже комментировать не хочется.
Если бы вместо пункта меню была, например, кнопка, у неё есть свойство ModalResult, установив которое, можно задать закрытие формы по щелчку. Но у пунктов меню такого свойства нет. Так что... пиши обработчик с одной командой, хотя бы в ввиде, приведённом в верхнем коде поста:
http://forum.oszone.net/post-2086467-6.html
novashdima
10-02-2013, 18:28
Даже комментировать не хочется. »
Почему?
Так что... пиши обработчик с одной командой »
Да так у меня давно уже написано, просто перебираю код, пытаюсь избавиться от говнокода.
Кстати вопрос не по теме, но не знаешь какой-то компонент или dll для работы с 7zip архивами?
Любезный
10-02-2013, 18:42
Почему? »
Мне просто стало понятно, что ты пытался написать Form.Close в инспекторе объектов. В нём можно писать только названия уже объявленных в описании класса формы обработчиков событий. Для чужих процедур и методов он не предназначен.
Да так у меня давно уже написано, просто перебираю код, пытаюсь избавиться от говнокода. »
В этом никакого говнокода нет. Но многие начинающие злоупотребляют такими обработчиками, помещая их на одну форму по нескольку штук. Вот от чего нужно избавляться. Вместо этого достаточно присвоить один обработчик нескольким пунктам/кнопкам и.т.п. через тот же инспектор объектов
cookie_monster
10-02-2013, 18:42
Кстати вопрос не по теме, но не знаешь какой-то компонент или dll для работы с 7zip архивами? »
Честно, прочитывая эту тему поймал себя на мысли, что вы, не умеете пользоваться поиском.
http://www.7-zip.org/links.html
http://stackoverflow.com/questions/74519/using-7-zip-from-delphi
http://www.angusj.com/delphi/
Без обид.
novashdima
10-02-2013, 18:49
В этом никакого говнокода нет. Но многие начинающие злоупотребляют такими обработчиками, помещая их на одну форму по нескольку штук. Вот от чего нужно избавляться. Вместо этого достаточно присвоить один обработчик нескольким пунктам/кнопкам и.т.п. через тот же инспектор объектов »
В смысле создать одну поцедуру обработки и назначить ее обрабатывать событие нескольких компонентов? если да, то я так и делаю, и тогда давно интересовавший вопрос, как сделать так... хм... в общем есть множество компонентов Met1 Met2.... и вот допустим одна процедура обоработки, как ее переделать, чтобы можно было использовать для нескольких компонентов?
procedure TMainForm.Met11Change(Sender: TObject);
begin
try
if (IsNan(Met11.Value) = False) and (Met11.Value <> 0)
and (Met11.Value < Met11.MaxValue)
then UpdateMetProduction
else if (IsNan(Met11.Value) = True) or (Met11.Value = 0)
then begin
MetLabel11.Caption := '';
MetLabel.Caption := '';
end
else Met11.Value := Met11.MaxValue - 1;
except
on E:EConvertError do
Met11.Clear;
end;
end;
Честно, прочитывая эту тему поймал себя на мысли, что вы, не умеете пользоваться поиском.
http://www.7-zip.org/links.html
http://stackoverflow.com/questions/7...ip-from-delphi
http://www.angusj.com/delphi/
Без обид. »
Конечно не обижаюсь)
Я пробовал много вариантов, с сайта 7zip скачивал порт для делфи, но что-то было не так, то ли функционал то ли что. Находил так же другие компоненты, пытался их использовать, один был очень даже неплох, сжимал нормально, а вто с расжатием одна проблема была, при сжатии если нужный файл находился мне допустим в C:\Windows\"много всяких папок"\notepad.exe, то архив будет такой:
папка Windows -> много всяких папок -> нужный файл
Насчет JclCompression - я вроде бы в нем разобраться не смог( Со стандартной библиотекой System.Zip тоже какие-то траблы были
Любезный
10-02-2013, 19:50
В смысле создать одну поцедуру обработки и назначить ее обрабатывать событие нескольких компонентов? если да, то я так и делаю, и тогда давно интересовавший вопрос, как сделать так... хм... в общем есть множество компонентов Met1 Met2.... и вот допустим одна процедура обоработки, как ее переделать, чтобы можно было использовать для нескольких компонентов? »
Здесь важно, какого типа этот Met11. Пусть для примера это будет TMyType.
Возьмём тот же код и слегка переделаем, используя Sender.
procedure TMainForm.Met11Change(Sender: TObject);
begin
if not (Sender is TMyType) then exit;
try
if (IsNan((Sender as TMyType).Value) = False)
and ((Sender as TMyType).Value <> 0)
and ((Sender as TMyType).Value < (Sender as TMyType).MaxValue))
then UpdateMetProduction
else if (IsNan((Sender as TMyType).Value) = True) or ((Sender as TMyType).Value = 0)
then begin
MetLabel11.Caption := '';
MetLabel.Caption := '';
end
else (Sender as TMyType).Value := (Sender as TMyType).MaxValue- 1;
except
on E:EConvertError do
(Sender as TMyType).Clear;
end;
end;
Переделка слегка грубовата - надо проверить на предмет скобок. Из движка форума это неудобно.
novashdima
10-02-2013, 20:04
Переделка слегка грубовата - надо проверить на предмет скобок. Из движка форума это неудобно. »
Я примерно так и думал, но вот еще в чем дело, эти самые Met1,Met2... это TSpinEdit, при изменении MetX изменяется также MetLabelX и так для каждого компонента, поэтому надо еще как-то привязаться к номеру этого самого MetX
Надеюсь понятно написал.
Любезный
10-02-2013, 20:12
Начиная с D2010, можно решить и этот вопрос. Но тут уже посложнее. Привязка будет не к номеру, а к имени.
У любого компонента есть свойство Name. Все компоненты формы можно обойти в цикле и найти нужные, с нужными именами. Пример:
var lab: TLabel;
with Self
do for I:=0 to ComponentsCount-1
do if Components [i] is Label
then if (Components [i] as TLabel).Name='Label1'
then begin
lab:=Components [i] as TLabel;
break;
exit;
end;
Находишь нужный Label, присваиваешь ему Caption - и задача решена.
novashdima
10-02-2013, 21:20
Находишь нужный Label, присваиваешь ему Caption - и задача решена. »
Ну... получилось что-то такое:
procedure TMainForm.MetChange(Sender: TObject);
var lab: TsLabel;
namestr: string;
begin
if not (Sender is TsSpinEdit) then exit;
try
if (IsNan((Sender as TsSpinEdit).Value) = False)
and ((Sender as TsSpinEdit).Value <> 0)
and (((Sender as TsSpinEdit).Value) < ((Sender as TsSpinEdit).MaxValue))
then UpdateMetProduction
else if (IsNan((Sender as TsSpinEdit).Value) = True) or ((Sender as TsSpinEdit).Value = 0)
then begin
namestr := (Sender as TsSpinEdit).Name;
Insert('Label', namestr, Length(namestr)-1);
with Self
do for I:=0 to MainForm.ComponentCount - 1
do if (Components[i] is TsLabel)
then if ((Components [i] as TsLabel).Name = namestr)
then begin
lab:=Components [i] as TsLabel;
break;
exit;
end;
lab.Caption := '';
MetLabel.Caption := '';
end
else (Sender as TsSpinEdit).Value := (Sender as TsSpinEdit).MaxValue- 1;
except
on E:EConvertError do
(Sender as TsSpinEdit).Clear;
end;
end;
Думаю стоит выделить поиск компонента в отдельную функцию, а то понадобится она еще не раз, так как у меня около 2к строк кода просто повторение почти одного и того же кода(
Любезный
10-02-2013, 21:43
Ну это уж решай сам - всё зависит от конкретной задачи.
И, кстати, чтобы код проще читался, можно объявить отдельную переменную типа TsSpinEdit, присвоить ей значение Sender as TsSpinEdit и указывать в коде её, а не столь длинную фразу.
novashdima
10-02-2013, 22:25
Нашел вот еще один способ:
S:='CheckBox'+IntToStr(I+1);
with (FindComponent(S) as TCheckBox) do Checked:=True
Любезный
10-02-2013, 22:41
Согласен, тоже вариант.
novashdima
10-02-2013, 23:02
Согласен, тоже вариант. »
Мне кажется он получше, так как зачем перебирать все компоненты, если можно использовать уже готовую функцию для этого.
Любезный
11-02-2013, 00:58
Мне кажется он получше, так как зачем перебирать все компоненты, если можно использовать уже готовую функцию для этого. »
Он лучше в том случае, когда надо найти один компонент. Если же нужно найти сразу группу компонентов, лучше сразу попробовать сделать это в одном цикле и тут же присвоить значения ссылок на эти компоненты соответствующим переменным.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.