![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте. Я недавно на форуме, на 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, и сделать поддержку программы удобной. Последний раз редактировалось Bargest, 02.09.2013 в 23:14. |
|
#3
|
||||
|
||||
|
Skipped......
Последний раз редактировалось angvelem, 03.09.2013 в 21:43. |
|
#4
|
|||
|
|||
|
Цитата:
Да тут не только в Дельфи проблема. Пишется довольно универсальная программа, а все кодируется жестко. Список инсталяторов должен быть внешним. Сделай так и код сам станет более коротким, простым и понятным. |
|
#5
|
|||
|
|||
|
Товарищи, полегче! Я-же сказал, что в программировании я недавно, соответственно всех тонкостей я не знаю. Насчет end`ов и правда жёстко конечно, но как-то без них не работает... Вариант, насчет "Вынести в отдельную процедуру" - звучит привлекательно, но опять-же - как? Поподробнее-бы..
|
|
#6
|
||||
|
||||
|
Skipped......
Последний раз редактировалось 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 дружелюбнее.
|