|
|
Регистрация | << Правила форума >> | 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)
|
#8
|
||||
|
||||
И ещё есть классное сочетание клавиш ctrl+d.
Выравнивает по "установленным" правилам весь код в Unit'e |
#9
|
|||
|
|||
Заработало! Отдельное спасибо - lmikle за предоставленный код вынесения в процедуру RunSetup! Процедурку создал, на кнопку чекбоксы кинул, все как по маслу пошло! Теперь я понял, что можно так просто код упрощать, юзая процедуры. Спасибо товрищи! Потом перееду на дельфи XE3, добавлю новенького в прогу. Всем спасибо, проблема решена!
|
#10
|
|||
|
|||
Ну, насчет XE3 это ты может погорячился. С точки зрения VCL ничего принципиально нового там нет, а того, что можно сделать руками или с помощью сторонних библиотек так вообще нет. FM откровенно сырая и тормозная, я надеялся, что они ее в XE3 поправят, но народ говорит, что принципиально ничего не изменилось даже в XE4. Единственное, что полезное в XE3 - это 64-битный компилятор. А оно тебе реально нужно?
|
#11
|
||||
|
||||
Там есть align у всех визуальных компонент.
|
#12
|
|||
|
|||
Ну как вы на ХЕ3 ругаетесь, а ХЕ4 как? Получше? Просто я видел ХЕ3, там объекты для формы посвежей, в Borland D7, они староваты (хоть для меня это не так важно), да и с Win7, ХЕ3 дружелюбнее.
|