Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.09.2013, 22:57
Andrey_Ryzhov Andrey_Ryzhov вне форума
Прохожий
 
Регистрация: 02.09.2013
Адрес: Новгородская обл. пгт Пролетарий
Сообщения: 10
Версия Delphi: Lazarus, ECDXE3
Репутация: 10
По умолчанию CheckBox исполняется много раз

Здравствуйте. Я недавно на форуме, на Delphi пишу недавно. Пишу программу, где используются элементы CheckBox. Пользователь должен выделить несколько чекбоксов и нажать кнопку установки, после нажатия кнопки надо проверить активность всех чекбоксов и установить соответствующее ПО. Прога работает но при работе она запускает установку программ несколько раз. Как этого избежать? И ещё - если ничего не выбрано, то после нажатия на кнопку, запускается окно проводника.
код программы ниже-
Код:
procedure TForm3.Button3Click(Sender: TObject);
var
   SEInfo: TShellExecuteInfo;
   ExitCode: DWORD;
   ExecuteFile, ParamString, StartInString: string;
begin
if CheckBox8.Checked then

ExecuteFile:='Resourses\Programs\MSOFC07_scr\setup.exe';

   FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;

end;

begin
if CheckBox9.Checked then

ExecuteFile:='Resourses\Programs\MSVIS07_scr\setup.exe';

FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;

end;


begin
if CheckBox2.Checked then

ExecuteFile:='Resourses\Programs\AIMP_scr\ampinst.exe';

   FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;

end;

begin
if CheckBox3.Checked then

ExecuteFile:='Resourses\Programs\AdbRdr_scr\ARinst.exe';

   FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;

end;

begin

if CheckBox4.Checked then

ExecuteFile:='Resourses\Programs\PirifCCl_scr\ccstpscrpt.exe';

   FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;

end;

begin

if CheckBox12.Checked then

ExecuteFile:='Resourses\Programs\PirifDfrg_scr\dfinst.exe';

   FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;

end;

begin



if CheckBox10.Checked then

ExecuteFile:='Resourses\Programs\PCS_scr\PCSINST.exe';

   FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;

end;

begin

if CheckBox11.Checked then

ExecuteFile:='Resourses\Programs\SPLN_scr\spinst.exe';

   FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;

end;

begin

if CheckBox13.Checked then

ExecuteFile:='Resourses\Programs\TTLCMD_scr\TCMINST.exe';

   FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;

end;

begin


if CheckBox5.Checked then

ExecuteFile:='Resourses\Programs\KMP_scr\KMPInst.exe';

   FillChar(SEInfo, SizeOf(SEInfo), 0) ;
   SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
   with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
   end;
   if ShellExecuteEx(@SEInfo) then begin
     repeat
       Application.ProcessMessages;
       GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
     until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;


end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
буду очень признателен за помощь, в дельфи я недавно, (как собственно и в программировании).
Ответить с цитированием
  #2  
Старый 02.09.2013, 23:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
Эпично.
Вообще, так оформлять код нельзя - нифига не понятно. Однако если вчитаться, можно заметить, что begin...end расставлены странно, думаю, предполагалось взять в операторные скобки все от каждого IF до конца работы установщика.
И еще - четко виден абсолютно идентичный код, повторяющийся много раз. Почему бы не вынести в функцию? Сократит количество строк от 215 до ~30. А использовав теги у CheckBox'ов и массив путей к установщикам (или массив структур чекбокс-путь), можно все запихнуть в цикл, и сократить еще строк на 5-10, и сделать поддержку программы удобной.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 02.09.2013 в 23:14.
Ответить с цитированием
  #3  
Старый 02.09.2013, 23:08
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Skipped......
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 03.09.2013 в 21:43.
Ответить с цитированием
  #4  
Старый 02.09.2013, 23:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от angvelem
Зачем нужно было столько раз писать один и тот жу код? Вынеси в отдельну процедуру (локальную).

Да тут не только в Дельфи проблема.
Пишется довольно универсальная программа, а все кодируется жестко.

Список инсталяторов должен быть внешним. Сделай так и код сам станет более коротким, простым и понятным.
Ответить с цитированием
  #5  
Старый 03.09.2013, 00:30
Andrey_Ryzhov Andrey_Ryzhov вне форума
Прохожий
 
Регистрация: 02.09.2013
Адрес: Новгородская обл. пгт Пролетарий
Сообщения: 10
Версия Delphi: Lazarus, ECDXE3
Репутация: 10
По умолчанию

Товарищи, полегче! Я-же сказал, что в программировании я недавно, соответственно всех тонкостей я не знаю. Насчет end`ов и правда жёстко конечно, но как-то без них не работает... Вариант, насчет "Вынести в отдельную процедуру" - звучит привлекательно, но опять-же - как? Поподробнее-бы..
Ответить с цитированием
  #6  
Старый 03.09.2013, 00:49
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Skipped......
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 03.09.2013 в 21:42.
Ответить с цитированием
  #7  
Старый 03.09.2013, 05:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Напиши одну процедуру, которая запускает инсталлятор, переданный как параметр. Соответственно, у тебя уберется куча одинакого кода, который вообще не отличается ничем, кроме указания пути к очередному инсталятору в начале блока. Примерно так:
Код:
procedure RunSetup(ExeсuteFile : String);
var
   SEInfo: TShellExecuteInfo;
   ExitCode: DWORD;
   ParamString, StartInString: string;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0); 
  SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
  with SEInfo do begin
     fMask := SEE_MASK_NOCLOSEPROCESS;
     Wnd := Application.Handle;
     lpFile := PChar(ExecuteFile) ;
     nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@SEInfo) then 
    begin
      repeat
         Application.ProcessMessages;
         GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
      until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
end; 

Тогда весь твой код, ну кроме этой процедуры, будет примерно такой:
Код:
if CheckBox8.Checked then RunSetup('Resourses\Programs\MSOFC07_scr\setup.exe');
if CheckBox9.Checked then RunSetup('Resourses\Programs\MSVIS07_scr\setup.exe');
if CheckBox2.Checked then RunSetup('Resourses\Programs\AIMP_scr\ampinst.exe');
if CheckBox3.Checked then RunSetup('Resourses\Programs\AdbRdr_scr\ARinst.exe');
if CheckBox4.Checked then RunSetup('Resourses\Programs\PirifCCl_scr\ccstpscrpt.exe');
if CheckBox12.Checked then RunSetup('Resourses\Programs\PirifDfrg_scr\dfinst.exe');
if CheckBox10.Checked then RunSetup('Resourses\Programs\PCS_scr\PCSINST.exe');
if CheckBox11.Checked then RunSetup('Resourses\Programs\SPLN_scr\spinst.exe');
if CheckBox13.Checked then RunSetup('Resourses\Programs\TTLCMD_scr\TCMINST.exe');
if CheckBox5.Checked then RunSetup('Resourses\Programs\KMP_scr\KMPInst.exe');

Последний раз редактировалось lmikle, 03.09.2013 в 06:05.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Andrey_Ryzhov (03.09.2013)
  #8  
Старый 03.09.2013, 11:44
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

И ещё есть классное сочетание клавиш ctrl+d.
Выравнивает по "установленным" правилам весь код в Unit'e
Ответить с цитированием
  #9  
Старый 03.09.2013, 19:28
Andrey_Ryzhov Andrey_Ryzhov вне форума
Прохожий
 
Регистрация: 02.09.2013
Адрес: Новгородская обл. пгт Пролетарий
Сообщения: 10
Версия Delphi: Lazarus, ECDXE3
Репутация: 10
По умолчанию

Заработало! Отдельное спасибо - lmikle за предоставленный код вынесения в процедуру RunSetup! Процедурку создал, на кнопку чекбоксы кинул, все как по маслу пошло! Теперь я понял, что можно так просто код упрощать, юзая процедуры. Спасибо товрищи! Потом перееду на дельфи XE3, добавлю новенького в прогу. Всем спасибо, проблема решена!
Ответить с цитированием
  #10  
Старый 04.09.2013, 06:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, насчет XE3 это ты может погорячился. С точки зрения VCL ничего принципиально нового там нет, а того, что можно сделать руками или с помощью сторонних библиотек так вообще нет. FM откровенно сырая и тормозная, я надеялся, что они ее в XE3 поправят, но народ говорит, что принципиально ничего не изменилось даже в XE4. Единственное, что полезное в XE3 - это 64-битный компилятор. А оно тебе реально нужно?
Ответить с цитированием
  #11  
Старый 04.09.2013, 07:47
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Там есть align у всех визуальных компонент.
Ответить с цитированием
  #12  
Старый 04.09.2013, 20:28
Andrey_Ryzhov Andrey_Ryzhov вне форума
Прохожий
 
Регистрация: 02.09.2013
Адрес: Новгородская обл. пгт Пролетарий
Сообщения: 10
Версия Delphi: Lazarus, ECDXE3
Репутация: 10
По умолчанию

Ну как вы на ХЕ3 ругаетесь, а ХЕ4 как? Получше? Просто я видел ХЕ3, там объекты для формы посвежей, в Borland D7, они староваты (хоть для меня это не так важно), да и с Win7, ХЕ3 дружелюбнее.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter