Постановка завдання. Підготовка

Писати будемо на Delphi. Виходячи з ідеї, ми повинні створити список програм,
які будуть видні в нашій програмі, і надати можливість вибору (які
програми встановлювати), після чого почати встановлювати їх по черзі, не
відволікаючись на пошук setup "ного файлу в папках. Список програм буде створено
заздалегідь і ручками. Зберігати назви програм, шлях доступу до них, щодо
нашого exe "шника, і короткий опис, будемо в ini файлі. Структура ini файлу:

[Назва програми]
Path = шлях до програми
Text = короткий опис

Наприклад:

[winamp.exe]
Path=softwinamp.exe
Text = плейер

До того ж наша програма буде зберігати введені користувачем дані, в
разі перезавантаження комп'ютера (що часто буває після установки драйверів), і
запускати після неї для продовження операцій. Для зберігання налаштувань будемо
використовувати спецкаталог для тимчасових файлів. На цьому, мабуть,
підготовчий етап закінчено.

Реалізація


Нам природно знадобиться форма, назвемо її installform. Також кинути на
неї компоненти: ChtckListBox, 4 Button "a, Memo (за бажанням додайте,
що-небудь що буде пояснювати що для чого). Привласнимо імена в тому ж порядку, в
якому поклали на форму компоненти: filelist, startbutton, closebutton,
allbutton, nonebutton, textlist. Після старту програми відразу повинні
відображатися доступні програми, для цього пишемо наступне:

procedure TInstallForm.FormCreate(Sender: TObject);
var s:string;
f:textfile;
i:integer;
res:word;
begin
/ / Визначаємо місце розташування папки Temp
temppath := StrAlloc(255);
res:= gettemppath(255,temppath);
/ / Асоціюємо змінну inifile типу TIniFile з нашим ini файлом
INIFile: = TIniFile.Create (extractfilepath (application.ExeName) + "installlist.ini");
/ / Створюємо tstr: TStringList для зберігання назви програм
tstr:=TStringList.Create;
/ / Зчитуємо назви прог в tstr
inifile.ReadSections(tstr);
/ / Відображаємо в filelist "е
filelist.Items.AddStrings(tstr);
/ / Перевіряємо чи були до цього збережені які-небудь дані (у разі
/ / Перезавантаження компа або його відключення до закінчення операції установки)
if fileexists(temppath+”installlist.txt”)=true then
begin
assignfile(f,temppath+”installlist.txt”);
reset(f);
readln(f,s);
while not eof(f) do
begin
readln(f,s);
for i:=0 to filelist.count-1 do
if filelist.Items.Strings[i]=s then
filelist.Checked[i]:=true;
end;
closefile(f);
end;

end;


Як видно, дані про попередню завантаженні будемо зберігати в txt файлі. Якщо
файл існує, то застосовуємо відповідні налаштування. Тепер розглянемо
випадок, коли знадобиться скинути вибір всіх програм або ж навпаки поставити
в чергу відразу всі проги. Ось для цього ми будемо використовувати allbutton і
nonebutton: при натисканні на першу будуть встановлюватися прапорці, а на другу
зніматися. Пишемо цей код:

procedure TInstallForm.AllButtonClick(Sender: TObject);
var i:integer;
begin
for i:=0 to filelist.Count-1 do
filelist.Checked[i]:=true;
end;

procedure TInstallForm.NoneButtonClick(Sender: TObject);
var i:integer;
begin
for i:=0 to filelist.Count-1 do
filelist.Checked[i]:=false;
end;


Нескладно, правда. Тепер займемося відображенням опису кожної програми. Для
цього код ось цей:

procedure TInstallForm.FileListClick(Sender: TObject);
var def:string;
begin
textlist.Clear;
textlist.LineS.add(
inifile.ReadString (filelist.Items.strings [filelist.itemindex], "Text", def));
end;

До речі, мінлива inifile поширюється на всю нашу прогу. Тут ми
просто виводимо в textlist, то що вважали з ini файлу (це відбувається при натисканні
по напису вибраного рядка). Ну, тепер опишемо кнопку closebutton:

procedure TInstallForm.CloseButtonClick(Sender: TObject);
var
reg:tregistry;
begin
reg:=tregistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.openkey ("SOFTWAREMicrosoftWindowsCurrentVersionRun", false) = true then
begin
reg.DeleteValue(“AutoInstall”) ;
end;
reg.CloseKey;
reg.Destroy;
deletefile(temppath+”installlist.txt”);
application.Terminate;
end;

А що так багато запитаєте ви? Здавалося б application.terminate і все, але не
так все просто, а ось чому: справа в тому, що якщо вихід з програми коректний,
то нам потрібно видалити з реєстру сліди нами залишені (залишимо ми їх тільки при
незавершених операція установки), або просто переконатися, що їх там немає (і
рам і користувачеві спокійно). Також видаляємо файл з настройками. Чому
application.terminate, а не installform.close, тому що мені півроку твердили в
інституті, що так правильніше (хоча хто як хоче). переходимо до найскладнішого
в коді – опису кнопки startbutton. Хоча якщо хоч трохи читати і мати під
рукою MSDN і це нескладно (сам перевіряв). Отже, пишемо ось це:

procedure TInstallForm.StartButtonClick(Sender: TObject);
var k,i:integer;
def:string;
f:textfile;
reg:tregistry;
pres:string;
begin
/ / Зберігаємо себе в реєстрі (про всяк випадок)
reg:=tregistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.openkey ("SOFTWAREMicrosoftWindowsCurrentVersionRun", false) = true then
begin
pres:=reg.ReadString(“AutoInstall”);
if (pres=””)or(pres<>application.exename) then
if reg.CreateKey(“AutoInstall”)=true then
reg.WriteString ("AutoInstall", application.exename);
end;
reg.CloseKey;
reg.Destroy;
/ / Мінімізуємо
showwindow(installform.Handle,2);
/ / Обробляємо всі зазначені прапори по черзі
for k:=0 to tstr.count-1 do
begin
/ / Попередньо зберігаємо налаштування в installlist.txt
assignfile(f,temppath+”installlist.txt”);
rewrite(f);
for i:=0 to filelist.count-1 do
if filelist.Checked[i]=true then
writeln(f,filelist.items.strings[i]);
closefile(f);
if filelist.Checked[k]=true then
begin
filelist.Checked[k]:=false;
StartAndWaitEnd(extractfilepath(application.ExeName)+
inifile.ReadString(tstr.Strings[k],”Path”,def));
end;
end;
/ / Після закінчення операції усуваємо себе з реєстру
reg:=tregistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.openkey ("SOFTWAREMicrosoftWindowsCurrentVersionRun", false) = true then
begin
reg.DeleteValue(“AutoInstall”) ;
end;
reg.CloseKey;
reg.Destroy;
/ / Повертаємо вікно до початкового стану і положенню
showwindow(installform.Handle,1);
/ / Вбиваємо файл з налаштуваннями
deletefile(temppath+”installlist.txt”);
end;

Ось і все. А немає не все я ще не розповів про функції StartAndWaitEnd. Вона
потрібна для того, щоб запустити додаток, передати йому управління і,
дочекавшись його закриття, передати управління нашої проге для продовження роботи.
Ось і код цієї функції:

function TInstallForm.StartAndWaitEnd(cmdline:string):boolean;
var si:TSTARTUPINFO;
pi:TPROCESSINFORMATION;
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
si.dwFlags := startf_UseShowWindow;
si.wShowWindow:=1;
if not CreateProcess (nil, PChar (cmdline), nil, nil, False, 0, nil, nil, si, pi) then
begin
StartAndWaitEnd:=false;
end
else
StartAndWaitEnd:=true;
application.ProcessMessages;
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
end;

Тут CreatePorcess запускає обраної програми, а WaitForSingleObject
очікує, поки процес завершиться. Хто хоче знати більше – читайте MSDN, є
ще багато всякої літератури з цього приводу. Ось тепер все!

Висновок


Це ніби все, але якщо хто знає спосіб по-краще з задоволенням ознайомлений.
Не забудьте підключити модулі Registry і IniFiles. До речі, сама наша прога буде
недоступна поки працює запущене з допомогою неї додаток (багато намагався не
вийшло "оживити"), а так все працює коректно, а натискати "так", "далі",
"Готове" доведеться все одно самому. Пишіть коментарі, почитаю. Якщо у когось
є пропозиції (наприклад, як і Abigor "а залиште повідомлення kosfiz" у або в
коментарі опишіть). Якщо у когось є питання, то пишіть мені на скриньку,
обов'язково відповім. Перепрошую за можливі помилки.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*