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

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

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

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


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


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

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


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

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

 

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


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

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


Цитата Любезный:
В этом никакого говнокода нет. Но многие начинающие злоупотребляют такими обработчиками, помещая их на одну форму по нескольку штук. Вот от чего нужно избавляться. Вместо этого достаточно присвоить один обработчик нескольким пунктам/кнопкам и.т.п. через тот же инспектор объектов »
В смысле создать одну поцедуру обработки и назначить ее обрабатывать событие нескольких компонентов? если да, то я так и делаю, и тогда давно интересовавший вопрос, как сделать так... хм... в общем есть множество компонентов 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;
Цитата cookie_monster:
Честно, прочитывая эту тему поймал себя на мысли, что вы, не умеете пользоваться поиском.
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 тоже какие-то траблы были

Последний раз редактировалось novashdima, 10-02-2013 в 18:58.


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



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

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


Старожил


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

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


Цитата novashdima:
В смысле создать одну поцедуру обработки и назначить ее обрабатывать событие нескольких компонентов? если да, то я так и делаю, и тогда давно интересовавший вопрос, как сделать так... хм... в общем есть множество компонентов 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;
Переделка слегка грубовата - надо проверить на предмет скобок. Из движка форума это неудобно.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:50, 10-02-2013 | #32


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


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

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


Цитата Любезный:
Переделка слегка грубовата - надо проверить на предмет скобок. Из движка форума это неудобно. »
Я примерно так и думал, но вот еще в чем дело, эти самые Met1,Met2... это TSpinEdit, при изменении MetX изменяется также MetLabelX и так для каждого компонента, поэтому надо еще как-то привязаться к номеру этого самого MetX
Надеюсь понятно написал.

Отправлено: 20:04, 10-02-2013 | #33


Старожил


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

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


Начиная с 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 - и задача решена.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:12, 10-02-2013 | #34


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


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

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


Цитата Любезный:
Находишь нужный 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к строк кода просто повторение почти одного и того же кода(

Последний раз редактировалось novashdima, 10-02-2013 в 21:29.


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


Старожил


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

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


Ну это уж решай сам - всё зависит от конкретной задачи.

И, кстати, чтобы код проще читался, можно объявить отдельную переменную типа TsSpinEdit, присвоить ей значение Sender as TsSpinEdit и указывать в коде её, а не столь длинную фразу.

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


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


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

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


Нашел вот еще один способ:
Код: Выделить весь код
S:='CheckBox'+IntToStr(I+1);
 with (FindComponent(S) as TCheckBox) do Checked:=True

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


Старожил


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

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


Согласен, тоже вариант.

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


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


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

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


Цитата Любезный:
Согласен, тоже вариант. »
Мне кажется он получше, так как зачем перебирать все компоненты, если можно использовать уже готовую функцию для этого.

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


Старожил


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

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


Цитата novashdima:
Мне кажется он получше, так как зачем перебирать все компоненты, если можно использовать уже готовую функцию для этого. »
Он лучше в том случае, когда надо найти один компонент. Если же нужно найти сразу группу компонентов, лучше сразу попробовать сделать это в одном цикле и тут же присвоить значения ссылок на эти компоненты соответствующим переменным.

Отправлено: 00:58, 11-02-2013 | #40



Компьютерный форум 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




 
Переход