PDA

Показать полную графическую версию : [архив] Inno Setup .:[все вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [35] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

Serega
05-05-2009, 01:05
Raf-9600, var
n: Integer;
FreeMB, TotalMB: Cardinal;
VolumeName, FileSystemName: String;
VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
ListBox: TListBox;
StartMenuTreeView: TStartMenuFolderTreeView;
Info, InfoCaption: TNewStaticText;
InfoPanel: TPanel;

const
oneMB= 1024*1024;
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;

function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
end;

function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
Result:= Trim(String);
end;

function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
end;

procedure GetDiskInfo(Disk: String);
begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
end;

procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string;
begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin
GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then
String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin
TotalB:= TotalMB; FreeB:= FreeMB;
String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String
end else
String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+
PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9);
end;
end;
end;

procedure ObjectOnClick(Sender: TObject);
begin
Case TObject(Sender) of

ListBox:
for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then
WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))

StartMenuTreeView:
if StartMenuTreeView.Directory <> '' then
WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory
else
WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'

WizardForm.NoIconsCheck:
begin
WizardForm.GroupEdit.Enabled:= not (WizardForm.GroupEdit.Enabled);
StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled;
WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled
end;
end;
end;

function ShouldSkipPage(CurPage: Integer): Boolean;
begin
if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
case CurPage of
wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
wpSelectDir, wpSelectProgramGroup, wpInfoAfter: Result := True;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
(CurPageID = wpSelectComponents) then
WizardForm.BackButton.Visible := False;
if CurPageID = wpSelectDir then ListBoxRefresh;
end;

//Будьте очень осторожны в таких случаях! Не позволим пользователю установить программу в уже существующую папку:
function NextButtonClick(CurPage: Integer): Boolean;
var
s, s2:string;
begin
Result:= True;
if CurPageID = wpSelectDir and
(Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then
Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'),
'Установка в системную папку', MB_YESNO or $30) = idYes;

If CurPage = wpSelectDir then begin
s2:=ExpandConstant('{app}')+'';
If DirExists(s2) then begin
s:= 'Установка в существующую папку в целях безопасности невозможна!';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end;
end;
end;

procedure InitializeWizard;
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then begin
PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONDOWN, 0, 0);
PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONUP, 0, 0);
end;

WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1,
WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height);
WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick;
WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage;
WizardForm.NoIconsCheck.Show;

ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8,
WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left,
WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12));
ListBox.Font.Size:= 9;
ListBox.Font.Style:= [];
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;

StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm);
StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'),
ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height);
StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage;
StartMenuTreeView.Cursor:= crHand;
StartMenuTreeView.OnChange:=@ObjectOnClick;

WizardForm.TYPESCOMBO.Visible:= false;

WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Width := ScaleX(200);

InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;
InfoPanel.Left := ScaleX(216);
InfoPanel.Width := ScaleX(200);
InfoPanel.Height := WizardForm.ComponentsList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;

InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := 'ГиКц';
InfoCaption.Left := ScaleX(224);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;

Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188);
Info.Top := ScaleY(12);
Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
Info.Caption := 'ТЖ¶ЇДгµДКу±кЦёХлµЅЧйјюЦ®ЙПЈ¬±гїЙјыµЅЛьµДГиКцЎЈ';
Info.WordWrap := true;

enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
'іМРтОДјюГиКц;'+
'°пЦъОДјюГиКц;'+
'ЧФКцОДјюГиКц;'+
'УўОДГиКц;'+
'µВОДГиКц;'+
'ЦРОДГиКц;'+
'¶нОДГиКцІвКФ#3B#3B°ьє¬#3BУўОД·ЦєЕ;'+
'ІвКФГиКц;'+
'ІвКФ1ГиКц;'+
'ІвКФ2ГиКц;'+
'ІвКФ3ГиКц;'+
'ІвКФ4ГиКц;'+
'ІвКФ5ГиКц;'+
'ІвКФ6ГиКц;'
);
end;

procedure DeinitializeSetup();
begin
disabledesc();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Res: Integer;
begin
case CurUninstallStep of
usPostUninstall:
begin
//Проверяем присутствие папки после удаления
If DirExists(ExpandConstant('{app}')+'') then
//Создаем диалог с тремя кнопками
case MsgBox('Папка "'+ExpandConstant('{app}')+'" не пуста.'#13#13 +
'"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
'"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
'"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of
IDYES:
begin
if not DelTree(ExpandConstant('{app}')+'', True, True, True) then
MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);
end;
IDNO:
begin
if not ShellExec('open', ExpandConstant('{app}')+'', '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);
end;
IDCANCEL:
begin
end;
end;
end;
end;
end;

BlackSelf
05-05-2009, 02:27
Serega_, огромное тебе спасибо за твои труды)

Raf-9600
05-05-2009, 11:57
Serega_, выделяет красным "if CurPageID = wpSelectDir and" и пишет ошибку "Unknown identifer "CurPageID"" :(
Кстати, на всяк: для работоспособности всего что в результате должно получиться, в инсталле должна быть библиотека http://narod.ru/disk/8343782000/descctrl.dll.html Ну и для UninsHs скрипт должен выглядеть типо так:

[Setup]
AppName=Earth 2140
AppVerName=Earth 2140
AppModifyPath="{app}\UninsHs.exe" /m0=Earth 2140

[Files]
Source: "D:\Документы\PSLan\Скачяно\Inno\UninsHs\UninsHs.exe"; DestDir: "{app}"; Flags: restartreplace

[Run]
Filename: {app}\UninsHs.exe; Parameters: /r0=Earth 2140,{language},{srcexe}; Flags: runminimized Сам UninsHs можно скачать тут http://www.han-soft.com/uninshs.php

Serega
05-05-2009, 13:29
Raf-9600, var
n: Integer;
FreeMB, TotalMB: Cardinal;
VolumeName, FileSystemName: String;
VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
ListBox: TListBox;
StartMenuTreeView: TStartMenuFolderTreeView;
Info, InfoCaption: TNewStaticText;
InfoPanel: TPanel;

const
oneMB= 1024*1024;
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;

function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
end;

function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
Result:= Trim(String);
end;

function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
end;

procedure GetDiskInfo(Disk: String);
begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
end;

procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string;
begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin
GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then
String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin
TotalB:= TotalMB; FreeB:= FreeMB;
String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String
end else
String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+
PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9);
end;
end;
end;

procedure ObjectOnClick(Sender: TObject);
begin
Case TObject(Sender) of

ListBox:
for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then
WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))

StartMenuTreeView:
if StartMenuTreeView.Directory <> '' then
WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory
else
WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'

WizardForm.NoIconsCheck:
begin
WizardForm.GroupEdit.Enabled:= not (WizardForm.GroupEdit.Enabled);
StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled;
WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled
end;
end;
end;

function ShouldSkipPage(CurPage: Integer): Boolean;
begin
if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
case CurPage of
wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
wpSelectDir, wpSelectProgramGroup, wpInfoAfter: Result := True;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
(CurPageID = wpSelectComponents) then
WizardForm.BackButton.Visible := False;
if CurPageID = wpSelectDir then ListBoxRefresh;
end;

//Будьте очень осторожны в таких случаях! Не позволим пользователю установить программу в уже существующую папку:
function NextButtonClick(CurPage: Integer): Boolean;
var
s, s2:string;
begin
Result:= True;

if (CurPage = wpSelectDir) and
(Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then
Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'),
'Установка в системную папку', MB_YESNO or $30) = idYes;

If CurPage = wpSelectDir then begin
s2:=ExpandConstant('{app}')+'';
If DirExists(s2) then begin
s:= 'Установка в существующую папку в целях безопасности невозможна!';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end;
end;
end;

procedure InitializeWizard;
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then begin
PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONDOWN, 0, 0);
PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONUP, 0, 0);
end;

WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1,
WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height);
WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick;
WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage;
WizardForm.NoIconsCheck.Show;

ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8,
WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left,
WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12));
ListBox.Font.Size:= 9;
ListBox.Font.Style:= [];
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;

StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm);
StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'),
ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height);
StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage;
StartMenuTreeView.Cursor:= crHand;
StartMenuTreeView.OnChange:=@ObjectOnClick;

WizardForm.TYPESCOMBO.Visible:= false;

WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Width := ScaleX(200);

InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;
InfoPanel.Left := ScaleX(216);
InfoPanel.Width := ScaleX(200);
InfoPanel.Height := WizardForm.ComponentsList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;

InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := 'ГиКц';
InfoCaption.Left := ScaleX(224);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;

Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188);
Info.Top := ScaleY(12);
Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
Info.Caption := 'ТЖ¶ЇДгµДКу±кЦёХлµЅЧйјюЦ®ЙПЈ¬±гїЙјыµЅЛьµДГиКцЎЈ';
Info.WordWrap := true;

enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
'іМРтОДјюГиКц;'+
'°пЦъОДјюГиКц;'+
'ЧФКцОДјюГиКц;'+
'УўОДГиКц;'+
'µВОДГиКц;'+
'ЦРОДГиКц;'+
'¶нОДГиКцІвКФ#3B#3B°ьє¬#3BУўОД·ЦєЕ;'+
'ІвКФГиКц;'+
'ІвКФ1ГиКц;'+
'ІвКФ2ГиКц;'+
'ІвКФ3ГиКц;'+
'ІвКФ4ГиКц;'+
'ІвКФ5ГиКц;'+
'ІвКФ6ГиКц;'
);
end;

procedure DeinitializeSetup();
begin
disabledesc();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Res: Integer;
begin
case CurUninstallStep of
usPostUninstall:
begin
//Проверяем присутствие папки после удаления
If DirExists(ExpandConstant('{app}')+'') then
//Создаем диалог с тремя кнопками
case MsgBox('Папка "'+ExpandConstant('{app}')+'" не пуста.'#13#13 +
'"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
'"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
'"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of
IDYES:
begin
if not DelTree(ExpandConstant('{app}')+'', True, True, True) then
MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);
end;
IDNO:
begin
if not ShellExec('open', ExpandConstant('{app}')+'', '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);
end;
IDCANCEL:
begin
end;
end;
end;
end;
end;

Raf-9600
05-05-2009, 13:35
Serega_, терь непонятно почему, гибридизировалось это окно, хотя оно должно оставаться стандартным:

http://uaimages.com/images/187014Corel030.png

Serega
05-05-2009, 13:49
Raf-9600, не совсем понял суть вопроса, если вы имеете ввиду почему у вас окно без рамки?
Отношение к скрипту которой я вам правил, это не имеет никого отношения, скажу только, что вы что-то добавили в секцию код.

Raf-9600
05-05-2009, 17:05
Serega_, та это я так скриншот сделал :) Я имел введу что под строкой указывающей выбор папки в меню Пуск, ничего не должно быть! В том числе и "Don't create Start Menu floder".

Serega
05-05-2009, 17:33
Raf-9600, я закоментировал в скрипте строки где это создаётся var
n: Integer;
FreeMB, TotalMB: Cardinal;
VolumeName, FileSystemName: String;
VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
ListBox: TListBox;
StartMenuTreeView: TStartMenuFolderTreeView;
Info, InfoCaption: TNewStaticText;
InfoPanel: TPanel;

const
oneMB= 1024*1024;
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;

function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
end;

function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
Result:= Trim(String);
end;

function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
end;

procedure GetDiskInfo(Disk: String);
begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
end;

procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string;
begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin
GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then
String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin
TotalB:= TotalMB; FreeB:= FreeMB;
String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String
end else
String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+
PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9);
end;
end;
end;

procedure ObjectOnClick(Sender: TObject);
begin
Case TObject(Sender) of

ListBox:
for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then
WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))

StartMenuTreeView:
if StartMenuTreeView.Directory <> '' then
WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory
else
WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'

WizardForm.NoIconsCheck:
begin
WizardForm.GroupEdit.Enabled:= not (WizardForm.GroupEdit.Enabled);
StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled;
WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled
end;
end;
end;

function ShouldSkipPage(CurPage: Integer): Boolean;
begin
if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
case CurPage of
wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
wpSelectDir, wpSelectProgramGroup, wpInfoAfter: Result := True;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
(CurPageID = wpSelectComponents) then
WizardForm.BackButton.Visible := False;
if CurPageID = wpSelectDir then ListBoxRefresh;
end;

//Будьте очень осторожны в таких случаях! Не позволим пользователю установить программу в уже существующую папку:
function NextButtonClick(CurPage: Integer): Boolean;
var
s, s2:string;
begin
Result:= True;

if (CurPage = wpSelectDir) and
(Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then
Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'),
'Установка в системную папку', MB_YESNO or $30) = idYes;

If CurPage = wpSelectDir then begin
s2:=ExpandConstant('{app}')+'';
If DirExists(s2) then begin
s:= 'Установка в существующую папку в целях безопасности невозможна!';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end;
end;
end;

procedure InitializeWizard;
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then begin
PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONDOWN, 0, 0);
PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONUP, 0, 0);
end;

// WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1,
// WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height);
// WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick;
// WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage;
// WizardForm.NoIconsCheck.Show;

ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8,
WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left,
WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12));
ListBox.Font.Size:= 9;
ListBox.Font.Style:= [];
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;

// StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm);
// StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'),
// ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
// StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height);
// StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage;
// StartMenuTreeView.Cursor:= crHand;
// StartMenuTreeView.OnChange:=@ObjectOnClick;

WizardForm.TYPESCOMBO.Visible:= false;

WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Width := ScaleX(200);

InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;
InfoPanel.Left := ScaleX(216);
InfoPanel.Width := ScaleX(200);
InfoPanel.Height := WizardForm.ComponentsList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;

InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := 'ГиКц';
InfoCaption.Left := ScaleX(224);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;

Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188);
Info.Top := ScaleY(12);
Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
Info.Caption := 'ТЖ¶ЇДгµДКу±кЦёХлµЅЧйјюЦ®ЙПЈ¬±гїЙјыµЅЛьµДГиКцЎЈ';
Info.WordWrap := true;

enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
'іМРтОДјюГиКц;'+
'°пЦъОДјюГиКц;'+
'ЧФКцОДјюГиКц;'+
'УўОДГиКц;'+
'µВОДГиКц;'+
'ЦРОДГиКц;'+
'¶нОДГиКцІвКФ#3B#3B°ьє¬#3BУўОД·ЦєЕ;'+
'ІвКФГиКц;'+
'ІвКФ1ГиКц;'+
'ІвКФ2ГиКц;'+
'ІвКФ3ГиКц;'+
'ІвКФ4ГиКц;'+
'ІвКФ5ГиКц;'+
'ІвКФ6ГиКц;'
);
end;

procedure DeinitializeSetup();
begin
disabledesc();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Res: Integer;
begin
case CurUninstallStep of
usPostUninstall:
begin
//Проверяем присутствие папки после удаления
If DirExists(ExpandConstant('{app}')+'') then
//Создаем диалог с тремя кнопками
case MsgBox('Папка "'+ExpandConstant('{app}')+'" не пуста.'#13#13 +
'"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
'"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
'"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of
IDYES:
begin
if not DelTree(ExpandConstant('{app}')+'', True, True, True) then
MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);
end;
IDNO:
begin
if not ShellExec('open', ExpandConstant('{app}')+'', '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);
end;
IDCANCEL:
begin
end;
end;
end;
end;
end;



P.S.
Вообще я только объединил, по вашей просьбе несколько кодов, а это было прописано в одном из предложенных вами вариантов... т.е. от себя, я ничего не добавлял…

Raf-9600
05-05-2009, 17:41
Serega_, проблема в том, что если эти скрипты юзать по отдельности, то ничего аномального (как на скрине) не создается...
А Вы можете чёнить дописать, чтобы и функции прежние остались, и все нормально работало? :)

Serega
05-05-2009, 17:54
А Вы можете чёнить дописать, чтобы и функции прежние остались, и все нормально работало? »Чего-нибудь дописать... хммм... конечно могу, если только чего-нибудь... :)
Вы объясните нормально, что конкретно хотите и что конкретно не работает?

Raf-9600
05-05-2009, 18:21
Что в вашем понимании слово - корректно? »
Чтоб все работало и без побочных эффектов :)

Вы объясните нормально, что конкретно хотите и что конкретно не работает? »
Ну что не работает я уже на срине показал. Т.е. окно выбора папки в меню Пуск должно быть стандартным, т.е. вот таким:

http://uaimages.com/images/809420Corel031.png

А что должно работать, это долгий вопрос :) Ну с кодом отображающим список винчестеров, под "полоской" выбора папки установки думаю и так понятно. Его можно просто скомпилить отдельно, и увидете как он должен работать :)
Потом, Боковушка с описанием компонентов - там тоже все предельно ясно.
Одно из действий кода деинсталлятора UninsHs, это удаление вступительной странички, в случае когда он будет запускать инсталлятор (ну типа чтоб компоненты изменить). Второе, это когда в UninsHs нажать на кнопку "Восстановить", тогда он должен запускать инсталлятор так, чтобы пропустить все страницы его диалогов, и запустить процесс переустановки, с сохранением всех компонентов, ктороие были выбраны в инсталлятре при установке. Ну и третя функция, это запустить стандартный деинсталлятор, но так чтобы тот не спрашивал ли уверен юзер что хочет удалить прогу, а сразу начинал бы деинсталляцию.
Код проверки присудствия папок, после деинсталяции, говорит сам за себя, тоесть после завершения удаления всех файлов, деинсталлятор должен проверять, не осталось ли что-то в папке {app}, и если находит, то выводил бы диалоговое окно, с вариантами "Удалить", "Открыть в проводнике" и "Отменить" (типа так :)). Ну и + он должен запрещять установку в существующую папку (в целях безопасности). Т.е. если юзер повытаеться в путе установки, указать существующую папку, то после клика "Далее" инсталлятор должен вывести сообщение что установка в существующую папку невозможна.


P.S.
Это Вы на ru-board'е под ником "DeKaNszn"? :)

Serega
05-05-2009, 18:38
Raf-9600, мне интересно, а вы вообще пробовали скомпилировать скрипт?
Не проверял UninsHs, но остальное, о чём вы пишите, всё работает или я не прав?

Raf-9600
05-05-2009, 18:49
Serega_, та работает (вроде :)) но меня спущяют побочные эффекты такой работы:
http://uaimages.com/thumbs/294461Corel030-.png (http://uaimages.com/images/294461Corel030-.png)

Serega
05-05-2009, 18:56
Raf-9600, я же у вас на русском языке спрашиваю: вы пробовали скомпилировать скрипт? Пост № 688, на предыдущей странице? Я там закомментировал, где создаются эти объекты и на работоспособность инсталлятора, то, что я закомментировал, никак не влияет...

Raf-9600
05-05-2009, 19:19
Serega_, аа, вы про этот скрит? http://forum.mediaportal.kiev.ua/style_emoticons/default/blush.gif
Вы то по-русски сказали, но я ж не знал что то что вы закоментили, не влияет на функционал http://forum.mediaportal.kiev.ua/style_emoticons/default/smile.gif
Реально все пашет, и все деинсталляторы тоже корректно работают. Есть только одна маленькая мелочь, при отмене инсталляции, инсталлятор почему-то долго закрывается. В принципе пережить можно, но если знаете как исправить, буду благодарен http://forum.mediaportal.kiev.ua/style_emoticons/default/rolleyes.gif

Serega
05-05-2009, 21:27
Raf-9600, теоретически, это может происходить из-за descctrl.dll, т.е. инсталлятор пытается закрыться и удалить временные файлы, а descctrl.dll работает. Попробуйте добавить в скрипт процедуру CancelButtonClick:
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
disabledesc();
end;

Raf-9600
05-05-2009, 21:38
Serega_, Респект и Уважуха! http://kolobok.us/smiles/standart/dance3.gif http://forum.0day.kiev.ua/style_emoticons/0day_emo/good2.gif

P.S.
Но это врятли иза descctrl.dll, ибо если попробовать скомпилить только код боковушки (с этой dll'кой) то закрытие происходит нормально.

Serega
05-05-2009, 22:01
Но это врятли иза descctrl.dll, ибо если попробовать скомпилить только код боковушки (с этой dll'кой) то закрытие происходит нормально. »Если вы добавили процедуру CancelButtonClick и у вас стал закрываться инсталлятор быстрее, то это было именно из-за dll'ки...

P.S.
Хотя у меня и при старом варианте закрывался быстро...

RedBishep
06-05-2009, 19:05
Привет Всем!!!
У меня вот такая проблема,точнее говоря вопрос!!
Извиняюсь если есть где-то такая тема,не хватило терпения всё прочитать и т.д ))
Короче...
Я создаю Инсталлер игры,Всё нормально устанавливается и т.д всё работает
Но мне хотелось бы узнать как сделать...
Я вот пробовал создать Инсталлер игры (Call of Duty 4)
Всё шло отлично а вот посредине Запаковки вышла ошибка ( что setup не может быть больше 2,1гб )
Подскажите что или как можно сделать так что бы он был больше чем 2,1 гб
И ещё вот такой вопрос!!
Я во многих играх видел что посредине установке игры идёт распаковка(Extracting)
Как мне такое сделать ??
Если можно со скринами и подробной инфой...
Буду Очень Благодарен!!!

Drongo
06-05-2009, 20:04
Подскажите что или как можно сделать так что бы он был больше чем 2,1 гб »Одним сплошным файлом это сделать не получится, придётся только "бить" на части .bin. В секцию Setup добавь строки, которые выделены зелёным цветом
[Setup]
...
DiskSpanning=yes
SlicesPerDisk=1
DiskSliceSize=2100000000
DiskClusterSize=4096
ReserveBytes=0

Compression=lzma/ultra
SolidCompression=yesЯ во многих играх видел что посредине установке игры идёт распаковка(Extracting)
Как мне такое сделать ?? »Архиватор как сжимать ??? (http://www.forum.oszone.net/thread-130857.html) -> Комментарий 10 (http://www.forum.oszone.net/post-1029209.html#post1029209) и дальше по тексту вниз. А вот как? Это хороший вопрос. :) Я бы тоже не отказался узнать на него ответ. ;)




© OSzone.net 2001-2012