|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
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
|
||||
|
||||
Цитата:
Вообще, так оформлять код нельзя - нифига не понятно. Однако если вчитаться, можно заметить, что begin...end расставлены странно, думаю, предполагалось взять в операторные скобки все от каждого IF до конца работы установщика. И еще - четко виден абсолютно идентичный код, повторяющийся много раз. Почему бы не вынести в функцию? Сократит количество строк от 215 до ~30. А использовав теги у CheckBox'ов и массив путей к установщикам (или массив структур чекбокс-путь), можно все запихнуть в цикл, и сократить еще строк на 5-10, и сделать поддержку программы удобной. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 02.09.2013 в 23:14. |
#3
|
||||
|
||||
Skipped......
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 03.09.2013 в 21:43. |
#4
|
|||
|
|||
Цитата:
Да тут не только в Дельфи проблема. Пишется довольно универсальная программа, а все кодируется жестко. Список инсталяторов должен быть внешним. Сделай так и код сам станет более коротким, простым и понятным. |
#5
|
|||
|
|||
Товарищи, полегче! Я-же сказал, что в программировании я недавно, соответственно всех тонкостей я не знаю. Насчет end`ов и правда жёстко конечно, но как-то без них не работает... Вариант, насчет "Вынести в отдельную процедуру" - звучит привлекательно, но опять-же - как? Поподробнее-бы..
|
#6
|
||||
|
||||
Skipped......
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 03.09.2013 в 21:42. |
#7
|
|||
|
|||
Напиши одну процедуру, которая запускает инсталлятор, переданный как параметр. Соответственно, у тебя уберется куча одинакого кода, который вообще не отличается ничем, кроме указания пути к очередному инсталятору в начале блока. Примерно так:
Код:
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)
|