Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
habib2302,
Можно просто вот так:
[Tasks]
Name: icons; Description: Create Shortcuts:;
Name: icons\desktop; Description: On the Desktop;
Name: icons\quicklaunchicon; Description: In the Taskbar;
Name: soft; Description: Install Additional Software
Name: soft\msv; Description: Microsoft Visual C++
habib2302
17-02-2013, 16:46
saurn, так любой дурак может
habib2302, тебе просто нужно сделать описание задачи через кастомные сообщения, или что? Если просто описание, то я это написал в первом примере, только русские названия заменить на английские. Или нужно менять описания в зависимости от выбранного языка?
Вообщем либо, так:
[Tasks]
Name: icons; Description: {cm:CreateShortcuts};
Name: icons\desktop; Description: {cm:OntheDesktop};
Name: icons\quicklaunchicon; Description: {cm:IntheTaskbar};
Name: soft; Description: {cm:InstallAdditionalSoftware}
Name: soft\msv; Description: Microsoft Visual C++
[CustomMessages]
CreateShortcuts=Create Shortcuts:
OntheDesktop=On the Desktop
IntheTaskbar=In the Taskbar
InstallAdditionalSoftware=Install Additional Software:
Либо так:
[Languages]
Name: ru; MessagesFile: "compiler:Languages\Russian.isl"
Name: en; MessagesFile: "compiler:Languages\English.isl"
[Tasks]
Name: icons; Description: {cm:CreateShortcuts};
Name: icons\desktop; Description: {cm:OntheDesktop};
Name: icons\quicklaunchicon; Description: {cm:IntheTaskbar};
Name: soft; Description: {cm:InstallAdditionalSoftware}
Name: soft\msv; Description: Microsoft Visual C++
[CustomMessages]
ru.CreateShortcuts=Создать Ярлыки:
ru.OntheDesktop=На Рабочем Столе
ru.IntheTaskbar=В Панели Задач
ru.InstallAdditionalSoftware=Установка Дополнительного ПО:
en.CreateShortcuts=Create Shortcuts:
en.OntheDesktop=On the Desktop
en.IntheTaskbar=In the Taskbar
en.InstallAdditionalSoftware=Install Additional Software:
EvilAlex
18-02-2013, 12:00
И последний вопрос, надеюсь поможете)))
Возможно ли сделать так как на рисунке, не вертикальным столбцом который приходиться прокручивать, а в горизонтальный ряд ?
И добавить еще 1 пункт Никнейм, чтобы было поле куда вписывать, для регистрации в реестре, если конечно есть возможность))
TERMINAL
18-02-2013, 14:31
Как и где можно указать иемя файла не unins000.exe, а Uninstall.exe ?
Всем привет.
Johny777
Вы, как я понимаю, пользуетесь (или пользовались) этим (http://forum.oszone.net/post-2015874-1218.html) кодом. Да, действительно код хорош! :good: Не могли бы Вы, пожалуйста, подсказать, как в этом коде отделить функцию распаковки и запаковки. То есть, мне нужна только функция распаковки. Это надо, так сказать бо большому счёту для истетики :boast: чтобы в коде не было ничего лишнего. И возможно ли добавить к нему кнопку "Отмена"?
EvilAlex
Возможно так сделать, но это нужно делать отдельно, то есть нужно создавать радиобаттоны в ручную!
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.
[*Code]
var
NewRadioButton1: TNewRadioButton;
NewRadioButton2: TNewRadioButton;
procedure RedesignWizardForm;
begin
NewRadioButton1 := TNewRadioButton.Create(WizardForm);
with NewRadioButton1 do
begin
Name := 'NewRadioButton1';
Parent := WizardForm.WelcomePage;
Left := ScaleX(256);
Top := ScaleY(248);
Width := ScaleX(113);
Height := ScaleY(17);
Checked := true;
end;
NewRadioButton2 := TNewRadioButton.Create(WizardForm);
with NewRadioButton2 do
begin
Name := 'NewRadioButton2';
Parent := WizardForm.WelcomePage;
Left := ScaleX(256);
Top := ScaleY(280);
Width := ScaleX(113);
Height := ScaleY(17);
end;
NewRadioButton1.TabOrder := 2;
NewRadioButton2.TabOrder := 3;
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
end;
Потом делать проверку что выбрано.
TERMINAL
Как вариант, могу предложить так:
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
RenameFile(ExpandConstant('{app}\unins000.exe'), ExpandConstant('{app}\Uninstall.exe'));
RenameFile(ExpandConstant('{app}\unins000.dat'), ExpandConstant('{app}\Uninstall.dat'));
end;
end;
И при неободимости в секции [Setup] пишем:
UninstallDisplayIcon={app}\Uninstall.exe
Shegorat
18-02-2013, 16:34
Как и где можно указать иемя файла не unins000.exe, а Uninstall.exe ? »
Когда-то очень давно я писал такой код
#define CodeUninstallName "MyApp"
[Setup]
AppId={{4A546E5C-3484-4B20-80AC-1AB2DE5E4B81}
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
UninstallFilesDir={app}\Uninstall
[ code]
procedure RenameUninstall();
var
UninstallDat, UninstallExe,
NewUninstallExe, NewUninstallDat,
RegUninstallString, RegQuietUninstallString,
AppID: String;
begin
UninstallDat:= ExpandConstant('{uninstallexe}');
StringChange(UninstallDat, '.exe', '.dat');
UninstallExe:= ExpandConstant('{uninstallexe}');
NewUninstallExe:= ExpandConstant('{app}\Uninstall\Uninstall {#CodeUninstallName}.exe')
NewUninstallDat:= ExpandConstant('{app}\Uninstall\Uninstall {#CodeUninstallName}.dat');
if FileExists(NewUninstallDat) or FileExists(NewUninstallExe) then
begin
DeleteFile(NewUninstallDat)
DeleteFile(NewUninstallExe)
end;
RenameFile(UninstallExe, NewUninstallExe);
RenameFile(UninstallDat, NewUninstallDat);
AppID:= ExpandConstant('{#SetupSetting("AppID")}');
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'UninstallString', RegUninstallString)
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'QuietUninstallString', RegQuietUninstallString)
StringChange(RegUninstallString, UninstallExe, NewUninstallExe)
StringChange(RegQuietUninstallString, UninstallExe, NewUninstallExe)
RegWriteStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'UninstallString', RegUninstallString)
RegWriteStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'QuietUninstallString', RegQuietUninstallString)
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
RenameUninstall();
end;
EvilAlex
18-02-2013, 16:42
EvilAlex
Возможно так сделать, но это нужно делать отдельно, то есть нужно создавать радиобаттоны в ручную!
читать дальше » »
А как сделать так чтобы боттоны занли что выбирает пользователь ? надо приписывать код или это автоматически ?
Johny777
18-02-2013, 16:57
чтобы в коде не было ничего лишнего »
Мне иногда страшно представить сколько лишнего(мусорного) кода содержит ассемблерный код, скомпилированный из чистого, без лишних переменных и функций скрипта тк думаю что компилятору инно далеко до например дельфи 2010 :(
вот только сжатие. Константы все наместе, тк если будет ошибка, то поймёшь что означает по имени константы
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Files]
Source: 7-zip32.dll; Flags: ignoreversion dontcopy nocompression solidbreak sortfilesbyextension
[ code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
// codes returned by SevenZipCreateArchive and SevenZipExtractArchive
SZ_OK = 0;
SZ_ERROR = 1;
SZ_CANCELLED = 2;
SZ_DLLERROR = 3;
FNAME_MAX32 = 512;
// these get returned as nState in the Callback function
ARCEXTRACT_BEGIN = 0;
ARCEXTRACT_INPROCESS = 1;
ARCEXTRACT_END = 2;
ARCEXTRACT_OPEN = 3;
ARCEXTRACT_COPY = 4;
// Errors
ERROR_START = $8000;
// WARNING
ERROR_DISK_SPACE = $8005;
ERROR_READ_ONLY = $8006;
ERROR_USER_SKIP = $8007;
ERROR_UNKNOWN_TYPE = $8008;
ERROR_METHOD = $8009;
ERROR_PASSWORD_FILE = $800A;
ERROR_VERSION = $800B;
ERROR_FILE_CRC = $800C;
ERROR_FILE_OPEN = $800D;
ERROR_MORE_FRESH = $800E;
ERROR_NOT_EXIST = $800F;
ERROR_ALREADY_EXIST = $8010;
ERROR_TOO_MANY_FILES = $8011;
// ERROR
ERROR_MAKEDIRECTORY = $8012;
ERROR_CANNOT_WRITE = $8013;
ERROR_HUFFMAN_CODE = $8014;
ERROR_COMMENT_HEADER = $8015;
ERROR_HEADER_CRC = $8016;
ERROR_HEADER_BROKEN = $8017;
ERROR_ARC_FILE_OPEN = $8018;
ERROR_NOT_ARC_FILE = $8019;
ERROR_CANNOT_READ = $801A;
ERROR_FILE_STYLE = $801B;
ERROR_COMMAND_NAME = $801C;
ERROR_MORE_HEAP_MEMORY = $801D;
ERROR_ENOUGH_MEMORY = $801E;
ERROR_ALREADY_RUNNING = $801F;
ERROR_USER_CANCEL = $8020;
ERROR_HARC_ISNOT_OPENED = $8021;
ERROR_NOT_SEARCH_MODE = $8022;
ERROR_NOT_SUPPORT = $8023;
ERROR_TIME_STAMP = $8024;
ERROR_TMP_OPEN = $8025;
ERROR_LONG_FILE_NAME = $8026;
ERROR_ARC_READ_ONLY = $8027;
ERROR_SAME_NAME_FILE = $8028;
ERROR_NOT_FIND_ARC_FILE = $8029;
ERROR_RESPONSE_READ = $802A;
ERROR_NOT_FILENAME = $802B;
ERROR_TMP_COPY = $802C;
ERROR_EOF = $802D;
ERROR_ADD_TO_LARC = $802E;
ERROR_TMP_BACK_SPACE = $802F;
ERROR_SHARING = $8030;
ERROR_NOT_FIND_FILE = $8031;
ERROR_LOG_FILE = $8032;
ERROR_NO_DEVICE = $8033;
ERROR_GET_ATTRIBUTES = $8034;
ERROR_SET_ATTRIBUTES = $8035;
ERROR_GET_INFORMATION = $8036;
ERROR_GET_POINT = $8037;
ERROR_SET_POINT = $8038;
ERROR_CONVERT_TIME = $8039;
ERROR_GET_TIME = $803A;
ERROR_SET_TIME = $803B;
ERROR_CLOSE_FILE = $803C;
ERROR_HEAP_MEMORY = $803D;
ERROR_HANDLE = $803E;
ERROR_TIME_STAMP_RANGE = $803F;
ERROR_MAKE_ARCHIVE = $8040;
ERROR_NOT_CONFIRM_NAME = $8041;
ERROR_UNEXPECTED_EOF = $8042;
ERROR_INVALID_END_MARK = $8043;
ERROR_INVOLVED_LZH = $8044;
ERROR_NO_END_MARK = $8045;
ERROR_HDR_INVALID_SIZE = $8046;
ERROR_UNKNOWN_LEVEL = $8047;
ERROR_BROKEN_DATA = $8048;
ERROR_7ZIP_START = $8100;
ERROR_WARNING = $8101;
ERROR_FATAL = $8102;
ERROR_DURING_DECOMPRESSION = $8103;
ERROR_DIR_FILE_WITH_64BIT_SIZE = $8104;
ERROR_FILE_CHANGED_DURING_OPERATION = $8105;
FA_RDONLY = $01;
FA_HIDDEN = $02;
FA_SYSTEM = $04;
FA_LABEL = $08;
FA_DIREC = $10;
FA_ARCH = $20;
FA_ENCRYPTED = $40;
ARCHIVETYPE_ZIP = 1;
ARCHIVETYPE_7Z = 2;
WM_USER = $400;
PBM_SETPOS = (WM_USER + 2);
type
HARC = Longint;
EXTRACTINGINFO = record
dwFileSize: DWORD; // Size of all the housing files. When entire size 0xFFFFFFFF (-1) it is above, 0xFFFFFFFF (-1) it houses.
dwWriteSize: DWORD; // The entire size which processed with compression thawing processing. When dwFileSize 0xFFFFFFFF (-1) is, entire processing ratio (permill) it houses.
szSourceFileName: array [0..FNAME_MAX32] of Byte; // The housing file name which processes.
dummy1: array [0..2] of Byte;
szDestFileName: array [0..FNAME_MAX32] of Byte; // The path name which actually is written.
dummy: array [0..2] of Byte;
end;
// Callback func should return FALSE to cancel the archiving process, else TRUE
ARCHIVERPROC = function(_hwnd: HWND; _uMsg: UINT; _nState: UINT; _lpEis: Longint): BOOL;
function SevenZip(const _hwnd: HWND; _szCmdLine: PAnsiChar; _szOutput: AnsiString; const _dwSize: DWORD): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
function SevenZipSetOwnerWindowEx(_hwnd: HWND; _lpArcProc: Longint): BOOL; external 'SevenZipSetOwnerWindowEx@files:7-zip32.dll stdcall';
function SevenZipKillOwnerWindowEx(_hwnd: HWND): BOOL; external 'SevenZipKillOwnerWindowEx@files:7-zip32.dll stdcall';
function RtlMoveMemory(var Destination: EXTRACTINGINFO; const Source: Longint; len: Integer): Integer; external 'RtlMoveMemory@kernel32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
const
CP_ACP = 0; { default to ANSI code page }
CP_OEMCP = 1; { default to OEM code page }
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpDefaultChar: Integer; lpUsedDefaultChar: Integer): Longint; external 'WideCharToMultiByte@kernel32.dll stdcall';
function StringToWideString(const aStr: string; codePage: Word): string;
var
len: Integer;
begin
len := MultiByteToWideChar(codePage, 0, aStr, -1, '', 0);
if len > 0 then
begin
SetLength(Result, (len*2)-2);
MultiByteToWideChar(codePage, 0, aStr, -1, Result, Length(Result));
end;
end;
function WideStringToString(const wStr: string; codePage: Word): string;
var
len: Integer;
begin
len := WideCharToMultiByte(codePage, 0, wStr, -1, '', 0, 0, 0);
if len > 0 then
begin
SetLength(Result, len-1);
WideCharToMultiByte(codePage, 0, wStr, -1, Result, Length(Result), 0, 0);
end;
end;
function AnsiToDos(const SourceStr: string): string;
begin
Result := WideStringToString(StringToWideString(SourceStr, CP_ACP), CP_OEMCP);
end;
var
szStatus: TNewStaticText;
ei: EXTRACTINGINFO;
ProgressPage: TOutputProgressWizardPage;
hProgress, hMsg1Label, hMsg2Label: HWND;
Cancel: boolean;
DestPath: String;
MyPrgBar: TNewProgressBar;
function ByteArrayToString(cArray: array of Byte): String;
begin
Result := '';
while cArray[Length(Result)] <> 0 do Insert(Chr(cArray[Length(Result)]), Result, Length(Result)+1);
end;
function BytesToSize(Bytes: Extended): String;
var
pszBuf: array [0..15] of Char;
begin
try
Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
except end;
end;
function ArchiverCallbackProc(_hwnd: HWND; _uMsg, _nState: UINT; _lpEis: Longint): BOOL;
var
dwCurrentSize: Single;
begin
Result := True;
case _nState of
ARCEXTRACT_BEGIN: SetWindowText(hMsg1Label, 'Status: scanning');
ARCEXTRACT_INPROCESS:
begin
// if Cancel then Exit;
RtlMoveMemory(ei, _lpEis, SizeOf(ei));
dwCurrentSize := ei.dwWriteSize;
PostMessage(hProgress, PBM_SETPOS, Round(65535*(dwCurrentSize/ei.dwFileSize)), 0);
SetWindowText(hMsg1Label, 'Status: compressing');
SetWindowText(hMsg2Label, FormatFloat('Progress: 0.#0 %', (dwCurrentSize*100)/ei.dwFileSize));
SetWindowText(_hwnd, 'File: ' + ByteArrayToString(ei.szSourceFileName) + #13#10 +
'Total size: ' + BytesToSize(ei.dwFileSize) + #13#10 +
'Current size: ' + BytesToSize(ei.dwWriteSize));
Result := not Cancel;
end;
ARCEXTRACT_END: Result := False;
ARCEXTRACT_OPEN: SetWindowText(hMsg1Label, 'Status: open archive');
end;
end;
procedure Cancel7ZipWork(Sender: TObject);
begin
Cancel := True;
end;
/////////////////////
procedure CreateSevenZipProgressPage;
begin
ProgressPage := CreateOutputProgressPage('7-zip', '');
szStatus := TNewStaticText.Create(ProgressPage);
with szStatus do
begin
Parent := ProgressPage.Surface;
WordWrap := True;
SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(30), ProgressPage.Surface.Width, ScaleY(300));
end;
MyPrgBar := TNewProgressBar.Create(nil)
with MyPrgBar do
begin
Parent := ProgressPage.Surface;
SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(140), ProgressPage.Surface.Width, ScaleY(27));
end;
with TButton.Create(nil) do
begin
Parent := ProgressPage.Surface;
Caption := 'Cancel';
SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(90), ScaleX(75), ScaleY(25));
OnClick := @Cancel7ZipWork;
end;
end;
//////////////////////////////////////////////////////
function SevenZipCreateArchive(hWnd: HWND; ArchiveFilename, BaseDirectory: String; FileList : TArrayOfString; CompressionLevel: Integer; CreateSolidArchive: Boolean; RecurseFolders: Boolean; Password, Sfx: String; ShowProgress: Boolean; Callback: Longint): Integer;
var
S7ResultOutput, s7cmd, cwd: AnsiString;
i: Integer;
begin
Result := SZ_ERROR;
if not SetCurrentDir(BaseDirectory) then Exit;
//
cwd := GetCurrentDir;
if Callback <> 0 then ShowProgress := False;
try
if GetArrayLength(FileList) > 0 then
begin
s7cmd := 'a "' + AnsiToDos(ArchiveFilename) + '" "' + RemoveQuotes(FileList[0]) + '"';
for i := 1 to GetArrayLength(FileList)-1 do
begin
s7cmd := s7cmd + ' -i';
if RecurseFolders then s7cmd := s7cmd + 'r';
s7cmd := s7cmd + '!"' + RemoveQuotes(FileList[i]) + '"';
end;
end;
s7cmd := s7cmd + ' -mx' + IntToStr(CompressionLevel);
if RecurseFolders then s7Cmd := s7cmd + ' -r';
if Password <> '' then s7Cmd := s7Cmd + ' -p' + Password;
if CreateSolidArchive then s7cmd := s7cmd + ' -ms=on' else s7cmd := s7cmd + ' -ms=off';
if not ShowProgress then s7cmd := s7cmd + ' -hide';
if Length(Sfx) > 0 then s7cmd := s7cmd + ' -sfx' + Sfx;
try
s7ResultOutput := StringOfChar(#0, 10240);
if Callback <> 0 then
begin
//get handles for 7-zip callback thread
hProgress := ProgressPage.ProgressBar.Handle;
hMsg1Label := ProgressPage.Msg1Label.Handle;
hMsg2Label := ProgressPage.Msg2Label.Handle;
//show progress page
ProgressPage.Show;
ProgressPage.ProgressBar.Show;
ProgressPage.Description := 'Compress';
//set callback
SevenZipSetOwnerWindowEx(hWnd, Callback);
end;
Result := SevenZip(hWnd, s7cmd, s7ResultOutput, Length(s7ResultOutput)-1);
finally
if Callback <> 0 then
begin
ProgressPage.Hide;
SevenZipKillOwnerWindowEx(hWnd);
end;
//MsgBox(S7ResultOutput, mbInformation, MB_OK);
except
Result := SZ_DLLERROR;
end;
finally
SetCurrentDir(cwd);
end;
end;
procedure InitializeWizard();
begin
Cancel := True;
CreateSevenZipProgressPage;
end;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = wpWelcome then
begin
Cancel := False;
DestPath := 'c:\setup'
// compress with callback
SevenZipCreateArchive(szStatus.Handle, 'C:\123.7z', 'c:\setup', ['common\*'], 1, True, False, '', '', False, CallbackAddr('ArchiverCallbackProc'));
// compress without callback
//SevenZipCreateArchive(szStatus.Handle, 'd:\123.7z', 'd:\', 'SkypeSetupFull.exe', 1, True, False, '', '', True, 0);
Result := True;
end;
end;
TERMINAL
Как вариант, могу предложить так: »
его нельзя переименовывать так просто :( тк путь к экзешнику лежит в реестре и по нему, пути, вызывается удаление
TERMINAL, нужно так:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
AppId=proto_15
[ Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
if not RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'QuietUninstallString', '"' + ExpandConstant('{app}\Uninstall.exe') + '"' + #32 + '/SILENT') then Exit;
if RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', '"' + ExpandConstant('{app}\Uninstall.exe') + '"') then
RenameFile(ExpandConstant('{app}\unins000.exe'), ExpandConstant('{app}\Uninstall.exe'));
if RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallDataFile', '"' + ExpandConstant('{app}\Uninstall.dat') + '"') then
RenameFile(ExpandConstant('{app}\unins000.dat'), ExpandConstant('{app}\Uninstall.dat'));
end;
end;
UPD
Shegorat, пардон, не увидел :)
Johny777
его нельзя переименовывать так просто тк путь к экзешнику лежит в реестре и по нему, пути, вызывается удаление »
По мне так зачем это вообще нужно делать. Сразу же при повторной установке рядом создаётся файл unins000.exe Тут типа нужно делать проверку об установлееной программе или ещё что..., а так, никакой эстетики :teeth: Мысли в слух: Кому придёт в голову сразу же повторно устанавливать прогу... :crazy:
EvilAlex
А как сделать так чтобы боттоны занли что выбирает пользователь ? надо приписывать код или это автоматически ? »
Радиобаттонами я не пользуюсь...
Вот пример проверки чекбоксов:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.
[Files]
Source: 1.zip; DestDir: {app}\File1.exe; Check: NewCheckBox1Result;
Source: 2.zip; DestDir: {app}\File2.exe; Check: NewCheckBox2Result;
[ Code]
var
NewCheckBox1: TNewCheckBox;
NewCheckBox2: TNewCheckBox;
function NewCheckBox1Result: boolean;
begin
Result:=NewCheckBox1.Checked;
end;
function NewCheckBox2Result: boolean;
begin
Result:=NewCheckBox2.Checked;
end;
procedure NewCheckBox1Click(Sender: TObject);
begin
if NewCheckBox1.Checked then begin
NewCheckBox2.Checked:= false;
NewCheckBox2.Enabled:= false;
end
else if not NewCheckBox1.Checked then begin
NewCheckBox2.Enabled:= True;
end;
end;
procedure NewCheckBox2Click(Sender: TObject);
begin
if NewCheckBox2.Checked then begin
NewCheckBox1.Checked:= false;
NewCheckBox1.Enabled:= false;
end
else if not NewCheckBox2.Checked then begin
NewCheckBox1.Enabled:= True;
end;
end;
procedure RedesignWizardForm;
begin
NewCheckBox1 := TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do
begin
Name := 'NewCheckBox1';
Parent := WizardForm.WelcomePage;
Left := ScaleX(208);
Top := ScaleY(208);
Width := ScaleX(97);
Height := ScaleY(17);
OnClick := @NewCheckBox1Click;
end;
NewCheckBox2 := TNewCheckBox.Create(WizardForm);
with NewCheckBox2 do
begin
Name := 'NewCheckBox2';
Parent := WizardForm.WelcomePage;
Left := ScaleX(208);
Top := ScaleY(232);
Width := ScaleX(97);
Height := ScaleY(17);
OnClick := @NewCheckBox2Click;
end;
NewCheckBox1.TabOrder := 2;
NewCheckBox2.TabOrder := 3;
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
end;
Вот также пример из Help-а, чекбоксы работают как радиобаттоны:
[Setup]
AppName=My Program
AppVerName=My Program v 1.7
DefaultDirName={pf}\My Program
OutputDir=.
[ Code]
var
Check: array [0..2] of TCheckBox;
procedure Check0(Sender: TObject);
begin
if Check[0].Checked then
begin
Check[1].Checked := False;
Check[2].Checked := False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[0].Checked := True;
end;
procedure Check1(Sender: TObject);
begin
if Check[1].Checked then
begin
Check[0].Checked := False;
Check[2].Checked := False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[1].Checked := True;
end;
procedure Check2(Sender: TObject);
begin
if Check[2].Checked then
begin
Check[0].Checked := False;
Check[1].Checked := False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[2].Checked := True;
end;
procedure InitializeWizard();
begin
Check[0] := TCheckBox.Create(WizardForm);
with Check[0] do
begin
Parent := WizardForm.SelectDirPage;
Checked := True;
Top := ScaleY(100);
OnClick := @Check0;
Caption := 'Чекбокс №1';
end;
Check[1] := TCheckBox.Create(WizardForm);
with Check[1] do
begin
Parent := WizardForm.SelectDirPage;
Top := ScaleY(120);
OnClick := @Check1;
Caption := 'Чекбокс №2';
end;
Check[2] := TCheckBox.Create(WizardForm);
with Check[2] do
begin
Parent := WizardForm.SelectDirPage;
Top := ScaleY(140);
OnClick := @Check2;
Caption := 'Чекбокс №3';
end;
end;
EvilAlex
18-02-2013, 17:56
Tco 03, мне не для файла, а для ключа реестра... =)
мне не для файла, а для ключа реестра... »
Ну и делайте с функцией Check всё что угодно!
В данном случаи при выборе NewCheckBox1 данные в реестре будут такие:
[Registry]
Root: HKLM; SubKey: "Software\My Programm\"; ValueType: string; ValueName: "ProductName"; ValueData: "My Programm"; Flags: uninsdeletekeyifempty; Check: NewCheckBox1Result;
При выборе NewCheckBox2 соответственно такие:
[Registry]
Root: HKLM; SubKey: "Software\No My Programm\"; ValueType: string; ValueName: "ProductName"; ValueData: "No My Programm"; Flags: uninsdeletekeyifempty; Check: NewCheckBox2Result;
EvilAlex
18-02-2013, 18:59
Tco 03, он ркгаеться почемуто...
EvilAlex
Мда... Вообщем вот, смотрите. Чтобы сделать проверку на что-то, нужно сначала создать такую функцию. Пишем:
[Registry]
Root: HKCU; SubKey: Software\Webzen\Mu\Config; ValueType: dword; ValueName: Resolution; ValueData: 0; Check: NewRadioButton1Result;
[Code]
var
NewRadioButton1: TNewRadioButton;
Вот эта функция на проверку чего-либо!
////////////////////////////////////////////////
function NewRadioButton1Result: Boolean;
begin
if NewRadioButton1.Checked
then
Result:= True;
end;
////////////////////////////////////////////////
Создаём радиобаттон для этой функции:
procedure InitializeWizard();
begin
NewRadioButton1 := TNewRadioButton.Create(WizardForm);
with NewRadioButton1 do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(10);
Top := ScaleY(30);
Width := ScaleX(113);
Height := ScaleY(17);
Caption := '640x480';
end;
end;
EvilAlex
18-02-2013, 19:35
function NewRadioButton1Result: Boolean;
begin
if NewRadioButton1.Checked
then
Result:= True;
end; »
если я правильно понял, то благодаря такой функции радиобаттон должен заработать ? и для каждого свой ?
Попробовал сделать, он мне выделяет только 1 из 11 радиобаттонв...
как сделать чтобы в каждой категории был активен 1 из 2-4 радиобаттон ?
Он и так будет работать! Для каждой радиобаттон или для каждого чекбокса НЕОБХОДИМА такая функция (если Вы хотите привязать какую-то функцию к определённому радиобатон или чекбоксу)!
Так же, к примеру:
Если нужно привязать другой ключ к другой радиобаттон, то это уже будет совсем другая функция: Check: NewRadioButton2Result
Пример:
Root: HKCU; SubKey: Software\Webzen\Mu\Config; ValueType: dword; ValueName: WindowMode; ValueData: 1; Check: NewRadioButton2Result;
И так далее...
И да, к стати, секции [Components] и [Types] тут уже НЕ НУЖНЫ!
EvilAlex
18-02-2013, 20:11
Все проблема решена....
Всем кто помог спасибище !
insombia
18-02-2013, 20:34
http://i53.fastpic.ru/big/2013/0218/c5/f16e8e4f1c73709bf88326d026fb76c5.jpg
как сделать новую папку чтобы при нажатии на неё создавалась сразу папка с названием игры
p.s.предыдущий ответ не подходит
Нет ничего дурнее в паскале нумеровать строки вручную!
var
S: TArrayOfString;
F: String;
begin
F := ExpandConstant('{win}\zzz.inf');
SetArrayLength(S, 1005);
S[0000] := ExpandConstant('zzz');
...
S[1004] := ExpandConstant('zzz');
SaveStringsToFile(F, S, False);
end;
Может какой-то способ есть автозамены в блокнте? Или избавится от этого в коде как-то??
Johny777, надо проверить, спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.