Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
icq99999999
12-08-2013, 15:26
можно ли чтобы при запуске созданного установщика с ключом выполнялся определённый файл?
а при обычном запуске никаких окон не отображалось, все распаковывалось в временную папку и запускался определенный файл2
(все файлы внутри установщика)
Johny777
12-08-2013, 18:49
icq99999999,
[Files]
Source: "file1.exe"; Flags: dontcopy nocompression
Source: "file2.exe"; Flags: dontcopy nocompression
[code ]
const
RUN_PARAM = '-run';
function InitializeSetup(): Boolean;
var
ResultCode: Integer;
begin
if Pos(RUN_PARAM, GetCmdTail) <> 0 then
begin
ExtractTemporaryFile('file1.exe');
Exec(AddBackslash(ExpandConstant('{tmp}')) + 'file1.exe', '', ExpandConstant('{tmp}'), SW_HIDE, ewNoWait, ResultCode);
Result := True;
end else
begin
ExtractTemporaryFile('file2.exe');
Exec(AddBackslash(ExpandConstant('{tmp}')) + 'file2.exe', '', ExpandConstant('{tmp}'), SW_HIDE, ewNoWait, ResultCode);
end;
end;
пример запуска: "setup.exe -run"
------------------------------------------------------
при запуске с этим параметром:
1. извлекаем file1.exe в папку в темпе
2. запускаем его оттуда без ожидания завершения его процесса
3. возвращаем из InitializeSetup() True следствием чего будет инициализация приложения установки
при запуске без параметра:
1. извлекаем file2.exe в папку в темпе
2. запускаем его оттуда без ожидания завершения его процесса
3. возвращаем из InitializeSetup() False
icq99999999
12-08-2013, 21:40
Цитата Johny777:
Код: »
а если нужно сделать следующее:
c запуска ключом:
распаковать всё в %temp%\spacep
скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\
запустить файл с параметром %temp%\spacep\1\hidcon.exe -setup.cmd
запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat
после завершения hidcon.exe удалить все извлечённые файлы
при обычном запуске:
распаковать всё в %temp%\spacep
скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\
запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat
после завершения hidcon.exe удалить папку %temp%\spacep\1
запустить %temp%\spacep\set.exe
после завершения процесса set.exe скопировать %temp%\spacep\comp.ini и положить рядом с программой
удалить все извлечённые файлы.
весь процесс должен быть полностью скрыт от глаз пользователя
Nightwishh
12-08-2013, 21:49
saurn, И это снова я. В срипте Example_NewCheckListBox радиобуттоны и чекбоксы находятся на компонентслисте, а мне хотелось бы чтобы они были свободными, как в скрипте Прототип (только там задачи), т.к. я на них хочу повесить OneClick (звук wav).
Johny777
13-08-2013, 03:19
Nightwishh, т.к. я на них хочу повесить OneClick (звук wav). »
а в чём проблема? так не пойдёт?
procedure ComponentsListOnClickCheck(Sender: TObject);
begin
// проигрывание звука
end;
procedure InitializeWizard();
begin
WizardForm.ComponentsList.OnClickCheck := @ComponentsListOnClickCheck;
end;
=================================================================================
icq99999999,
распаковать всё »
а всё это сколько?
нет такой возможности извлечь папку из инсталла не во время установки. Только если извлекать по одному файлу, как в последнем примере.
Не знаю сколько файлов лежит в папке spacep, поэтому сделал так: пакуешь папку в 7z архив и кладёшь рядом с экзешником инсталла
[Files]
Source: "7-zip32.dll"; Flags: dontcopy nocompression
[code ]
#define A = (Defined UNICODE) ? "W" : "A"
#define Use_Debug
const
SPACE_CHAR = #32;
SZ_OK = 0;
RUN_PARAM = '-run';
ARCHIVE_NAME = 'spacep.7z';
INI_NAME = 'comp.ini';
function SevenZip(const _hwnd: HWND; _szCmdLine: PAnsiChar; _szOutput: PAnsiChar; const _dwSize: DWORD): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
function CopyFile(lpExistingFileName, lpNewFileName: String; bFailIfExists: BOOL): BOOL; external 'CopyFile{#A}@kernel32.dll stdcall';
function SimpleExtractSevenZip(const ArchivePath, DestPath: AnsiString): Boolean;
var
SevenZipCmd: AnsiString;
begin
SevenZipCmd := Format( 'x "%s" "%s" -y -hide', [ ArchivePath, AddBackslash(RemoveBackslash(DestPath)) ] );
CharToOemBuff(SevenZipCmd);
Result := SevenZip(0, SevenZipCmd, '', 0) = SZ_OK;
end;
function InitializeSetup(): Boolean;
var
ResultCode: Integer;
TempPath, OuterPath: String;
begin
Result := False;
OuterPath := AddBackslash( ExpandConstant('{src}') );
TempPath := AddBackslash( ExpandConstant('{tmp}') );
if Pos(RUN_PARAM, GetCmdTail) <> 0 then // c запуска ключом:
begin
#ifdef Use_Debug
MsgBox('распаковать всё в %temp%\spacep', mbInformation, MB_OK);
#endif
if not SimpleExtractSevenZip(OuterPath + ARCHIVE_NAME, TempPath) then MsgBox(SysErrorMessage(DLLGetLastError), mbError, MB_OK);
#ifdef Use_Debug
MsgBox('скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\', mbInformation, MB_OK);
#endif
CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
#ifdef Use_Debug
MsgBox('запустить файл с параметром %temp%\spacep\1\hidcon.exe -setup.cmd', mbInformation, MB_OK);
#endif
Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-setup.cmd', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
#ifdef Use_Debug
MsgBox('запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat', mbInformation, MB_OK);
#endif
Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
#ifdef Use_Debug
MsgBox('...папка в темпе удалится сама', mbInformation, MB_OK);
#endif
end else // при обычном запуске:
begin
#ifdef Use_Debug
MsgBox('распаковать всё в %temp%\spacep', mbInformation, MB_OK);
#endif
if not SimpleExtractSevenZip(OuterPath + ARCHIVE_NAME, TempPath) then MsgBox(SysErrorMessage(DLLGetLastError), mbError, MB_OK);
#ifdef Use_Debug
MsgBox('скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\', mbInformation, MB_OK);
#endif
CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
#ifdef Use_Debug
MsgBox('запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat', mbInformation, MB_OK);
#endif
Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
#ifdef Use_Debug
MsgBox('после завершения hidcon.exe удалить папку %temp%\spacep\1', mbInformation, MB_OK);
#endif
DelTree(TempPath + 'spacep\1\', True, True, True);
#ifdef Use_Debug
MsgBox('запустить %temp%\spacep\set.exe', mbInformation, MB_OK);
#endif
Exec(TempPath + 'spacep\' + 'set.exe', '-1бат.bat', TempPath + 'spacep\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
#ifdef Use_Debug
MsgBox('после завершения процесса set.exe скопировать %temp%\spacep\comp.ini и положить рядом с программой', mbInformation, MB_OK);
MsgBox('а что, если инсталл на диске?', mbError, MB_OK);
#endif
CopyFile(TempPath + 'spacep\' + INI_NAME, OuterPath + INI_NAME, False);
#ifdef Use_Debug
MsgBox('...папка в темпе удалится сама', mbInformation, MB_OK);
#endif
end;
end;
Исходник с файлами:
icq99999999
13-08-2013, 09:11
Цитата Johny777:
а всё это сколько? »
под всё я имел ввиду содержимое инстала, а поэтому использовать стороннюю утилиту 7z не нужно, вот только как 7z отключить?
след вопрос:
а можно ли после копирования проверить есть ли файл comp.ini рядом с прогой, если файла нет то копировать его из %temp%\spacep\ в C:\AppData\
а потом скопировать файл "comp.ini" из директории с прогой в %temp%\spacep\ если файла нет то копировать его из C:\AppData\ в %temp%\spacep\
можно ли убрать появляющейся(при запуске) на понели задач окошко в котором написано установка
можно ли отключить при компиляции изображение WizModernImage.bmp
можно ли чтобы при запуске с ключом файл находящейся внутри инстала распаковывался в %windir%\temp\ а при обычном запуске не распаковывался
Nightwishh
13-08-2013, 18:58
Блин, я сам всех и себя запутал. Вообщем есть скрипт Button Sound [Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
LicenseFile=compiler:License.txt
[Files]
Source: UI\buttonclick.WAV; Flags: dontcopy
Source: UI\buttonclickrelease.WAV; Flags: dontcopy
Source: UI\buttonrollover.WAV; Flags: dontcopy
[ Code]
function sndPlaySound(lpszSoundName: AnsiString; uFlags: cardinal): Integer; external 'sndPlaySoundA@winmm stdcall delayload'; /// функция проигрывания звука
procedure PlaySoundOnEnter(Sender: TObject); /// процедура при наведении
begin
sndPlaySound(ExpandConstant('{tmp}\buttonrollover.WAV'),$0001);
end;
procedure PlaySoundOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); /// при нажатии кнопки
begin
sndPlaySound(ExpandConstant('{tmp}\buttonclick.WAV'),$0001);
end;
procedure PlaySoundOnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); /// при отпускании кнопки
begin
sndPlaySound(ExpandConstant('{tmp}\buttonclickrelease.WAV'),$0001);
end;
procedure InitializeWizard;
begin
ExtractTemporaryFile('buttonclick.WAV'); /// функцией ExtractTemporaryFile извлекаем файл во временную папку - при нажатии кнопри паши по контролу (не путать с кликом)
ExtractTemporaryFile('buttonclickrelease.WAV'); /// при отпускании кнопки мыши с контрола
ExtractTemporaryFile('buttonrollover.WAV'); /// при наведении
with WizardForm do
begin
with NextButton do
begin
OnMouseEnter := @PlaySoundOnEnter;
OnMouseDown := @PlaySoundOnMouseDown;
OnMouseUp := @PlaySoundOnMouseUp;
end;
with BackButton do
begin
OnMouseEnter := NextButton.OnMouseEnter;
OnMouseDown := NextButton.OnMouseDown;
OnMouseUp := NextButton.OnMouseUp;
end;
with CancelButton do
begin
OnMouseEnter := NextButton.OnMouseEnter;
OnMouseDown := NextButton.OnMouseDown;
OnMouseUp := NextButton.OnMouseUp;
end;
with DirBrowseButton do
begin
OnMouseEnter := NextButton.OnMouseEnter;
OnMouseDown := NextButton.OnMouseDown;
OnMouseUp := NextButton.OnMouseUp;
end;
with GroupBrowseButton do
begin
OnMouseEnter := NextButton.OnMouseEnter;
OnMouseDown := NextButton.OnMouseDown;
OnMouseUp := NextButton.OnMouseUp;
end;
end;
end; Как мне сделать звук при наведении и при нажатии у компонентов, без ботвы?
insombia
13-08-2013, 19:59
Nightwishh через bass вроде можно,но не знаб работает ли без ботвы,так как там есть пример тот что тебе нужен
Johny777
13-08-2013, 20:43
icq99999999, вот только как 7z отключить? »
да не быть мне кэпом! переписать код конечно :)
под всё я имел ввиду содержимое инстала »
переписал, изучай:
[Setup]
AppName=Demo
AppVerName=1.1
OutputDir=Output
CreateAppDir=no
[Files]
Source: spacep\*; DestDir:{tmp}\spacep; Flags: recursesubdirs createallsubdirs
[code ]
#define A = (Defined UNICODE) ? "W" : "A"
#define Use_Debug
const
RUN_PARAM = '-run';
INI_NAME = 'comp.ini';
GCL_STYLE = -26;
CS_NOCLOSE = $200;
WM_LBUTTONDOWN = $0201;
WM_LBUTTONUP = $0202;
function CopyFile(lpExistingFileName, lpNewFileName: String; bFailIfExists: BOOL): BOOL; external 'CopyFile{#A}@kernel32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@User32.dll stdcall';
function SetClassLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): DWORD; external 'SetClassLong{#A}@User32.dll stdcall';
function GetClassLong(hWnd: HWND; nIndex: Integer): DWORD; external 'GetClassLong{#A}@User32.dll stdcall';
function RunWithParam(): Boolean;
begin
Result := Pos(RUN_PARAM, GetCmdTail) <> 0;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode: Integer;
TempPath, OuterPath: String;
begin
if CurStep = ssPostInstall then
begin
OuterPath := AddBackslash( ExpandConstant('{src}') );
TempPath := AddBackslash( ExpandConstant('{tmp}') );
if RunWithParam() then // c запуска ключом:
begin
CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-setup.cmd', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
end else // при обычном запуске:
begin
CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
DelTree(TempPath + 'spacep\1\', True, True, True);
Exec(TempPath + 'spacep\' + 'set.exe', '-1бат.bat', TempPath + 'spacep\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
if not CopyFile(TempPath + 'spacep\' + INI_NAME, OuterPath + INI_NAME, False) then
begin
CopyFile(TempPath + 'spacep\' + INI_NAME, ExtractFilePath(ExpandConstant('{localappdata}')) + INI_NAME, False);
if not CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False) then
CopyFile(ExtractFilePath(ExpandConstant('{localappdata}')) + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
end;
end;
end;
end;
procedure InitializeWizard();
begin
ShowWindow(Application.Handle, SW_HIDE); // прячем кнопку в панели задач
SetClassLong(WizardForm.Handle, GCL_STYLE, GetClassLong(WizardForm.Handle, GCL_STYLE) or CS_NOCLOSE); // без Alt+F4
// прячем форму
WizardForm.BorderStyle := bsNone;
WizardForm.SetBounds(Screen.Width-777, Screen.Height-777, 0, 0);
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpReady then
begin
PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONDOWN, 0, 0);
PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONUP, 0, 0);
end;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
case PageID of
wpWelcome, wpSelectDir, wpFinished {, другие твои страницы}: Result := True;
end;
end;
а можно ли после копирования проверить есть ли файл comp.ini рядом с прогой, если файла нет то копировать его из %temp%\spacep\ в C:\AppData\
а потом скопировать файл "comp.ini" из директории с прогой в %temp%\spacep\ если файла нет то копировать его из C:\AppData\ в %temp%\spacep\
можно ли убрать появляющейся(при запуске) на понели задач окошко в котором написано установка »
это всё в коде выше, вот только я не уверен насчёт C:\AppData\. Может имелось в виду то что тебе выдаёт месседжбокс в коде выше, в первой строке процедуры InitializeWizard();
проверить есть ли файл comp.ini рядом с прогой »
проверяется функцией FileExists, но ясделал проще. Просто если CopyFile вернёт False делаем что надо
можно ли отключить при компиляции изображение WizModernImage.bmp »
Я не совсем понимаю что ты имеешь в виду. Нельзя управлять теневым исходным кодом инно отсюда. Чтоб этой картинки не было в принципе, нужно переписать исходники инно.
Можно спрятать: впиши в InitializeWizard это WizardForm.WizardBitmapImage.Hide;
Можно пропустить страницу приветствия: [Setup] DisableWelcomePage=yes
можно ли чтобы при запуске с ключом файл находящейся внутри инстала распаковывался в %windir%\temp\ а при обычном запуске не распаковывался »Можно:
1. если файл должен попасть в темп во время установки то так:
[Files]
Source: имя_файла; DestDir:{tmp}\; Check: RunWithParam();
2. если где-то ещё то как в примере отсюда http://forum.oszone.net/post-2200430-1002.html с соответствующей проверкой
if RunWithParam() then ExtractTemporaryFile('имя_файла')
=================================================================================
Всем
Вот пример воспроизведения Wav файлов из памяти - быстрый доступ, быстрее чем с жёсткого диска. Это отдельный пример из кода ниже. Может кому пригодится:
[Setup]
...
RawDataResource=SndA:bugreporter_succeeded.wav |SndB:buttonclickreleaseo.WAV
[code ]
#define A = (Defined UNICODE) ? "W" : "A"
type
HINST = THandle;
HMODULE = HINST;
Pointer = Longint;
HRSRC = THandle;
HGLOBAL = THandle;
const
SND_ASYNC = $0001;
SND_NODEFAULT = $0002;
SND_MEMORY = $0004;
RT_RCDATA = 10;
function sndPlaySound(lpszSoundName: Pointer; uFlags: UINT): BOOL; external 'sndPlaySound{#A}@Winmm.dll stdcall';
function LoadResource(hModule: HINST; hResInfo: HRSRC): HGLOBAL; external 'LoadResource@kernel32.dll stdcall';
function FindResource(hModule: HMODULE; lpName: String; lpType: Longint): HRSRC; external 'FindResource{#A}@kernel32.dll stdcall';
function LockResource(hResData: HGLOBAL): Pointer; external 'LockResource@kernel32.dll stdcall';
var
hResourceSound: HRSRC;
pSoundMemory: Pointer;
procedure InitializeWizard();
begin
hResourceSound := FindResource(HInstance, '_IS_SNDA', RT_RCDATA);
pSoundMemory := LockResource(LoadResource(HInstance, hResourceSound));
sndPlaySound(pSoundMemory, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
end;
===================================================================================================
Nightwishh
Как мне сделать звук при наведении и при нажатии у компонентов, без ботвы? »
накатал пример при наведении и нажатии, пойдёт?
[Setup]
...
RawDataResource=SndA:bugreporter_succeeded.wav |SndB:buttonclickreleaseo.WAV
[Components]
Name: "main"; Description: "Main Files";
Name: "main\a"; Description: "A Files";
Name: "main\b"; Description: "B Files";
[code ]
#define A = (Defined UNICODE) ? "W" : "A"
type
HINST = THandle;
HMODULE = HINST;
Pointer = Longint;
HRSRC = THandle;
HGLOBAL = THandle;
const
SND_ASYNC = $0001;
SND_NODEFAULT = $0002;
SND_MEMORY = $0004;
RT_RCDATA = 10;
function sndPlaySound(lpszSoundName: Pointer; uFlags: UINT): BOOL; external 'sndPlaySound{#A}@Winmm.dll stdcall';
function LoadResource(hModule: HINST; hResInfo: HRSRC): HGLOBAL; external 'LoadResource@kernel32.dll stdcall';
function FindResource(hModule: HMODULE; lpName: String; lpType: Longint): HRSRC; external 'FindResource{#A}@kernel32.dll stdcall';
function LockResource(hResData: HGLOBAL): Pointer; external 'LockResource@kernel32.dll stdcall';
var
pSoundMemory_A, pSoundMemory_B: Pointer;
function GetResourceSoundAddr(const ResourceName: String): Pointer;
var
hResourceSound: HRSRC;
begin
hResourceSound := FindResource(HInstance, ResourceName, RT_RCDATA);
Result := LockResource(LoadResource(HInstance, hResourceSound));
end;
procedure ComponentsOnClickCheck(Sender: TObject);
begin
sndPlaySound(pSoundMemory_B, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
end;
var
LastIndex: Integer;
procedure ComponentsItemsMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
if Index = -1 then
begin
LastIndex := -1;
Exit;
end;
if LastIndex = -1 then
begin
LastIndex := Index;
sndPlaySound(pSoundMemory_A, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
end else
if LastIndex = Index then Exit else
if LastIndex <> Index then
begin
LastIndex := Index;
sndPlaySound(pSoundMemory_A, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
end;
end;
procedure InitializeWizard();
begin
LastIndex := -1;
pSoundMemory_A := GetResourceSoundAddr('_IS_SNDA');
pSoundMemory_B := GetResourceSoundAddr('_IS_SNDB');
WizardForm.ComponentsList.OnItemMouseMove := @ComponentsItemsMouseMove;
WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClickCheck;
end;
исходники простого воспроизведения и звука на компонентах:
tr011_tmn
14-08-2013, 11:19
приветствую коллеги.
Хочу обратится за помощью. Можно ли реализовать удаление содержимого каталога, в каталоге {app} без бантика?
Например в каталоге {app}\Redist удалить все что находится в каталоге Redist не трогая содержимое {App}?
В идеале хотелось бы реализовать через Checkbox, типа "хотите ли вы очистить содержимое каталога Redist" и при отмеченном checkbox что бы происходила очистка.
Johny777
14-08-2013, 15:02
tr011_tmn, удаление самого каталога вместе с содержимым подойдёт?
const
FOLDER_NAME = 'Redist';
var
DeleteRedistCheckBox: TCheckBox;
// Force - Boolean value that is true if folders with the read-only attribute set are to be deleted; false (default) if they are not.
procedure DeleteFolder(const FolderPath: String; const Force: Boolean);
var
oFS: Variant;
begin
if not DirExists(FolderPath) then Exit;
oFS := CreateOleObject('Scripting.FileSystemObject');
try
oFS.DeleteFolder(RemoveBackslash(FolderPath), Force);
except
ShowExceptionMessage();
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
if DeleteRedistCheckBox.Checked then DeleteFolder(AddBackslash(ExpandConstant('{app}')) + FOLDER_NAME, True);
// или DelTree(AddBackslash(ExpandConstant('{app}')) + FOLDER_NAME, True, True, True);
end;
procedure InitializeWizard();
begin
DeleteRedistCheckBox := TCheckBox.Create(WizardForm.InstallingPage);
with DeleteRedistCheckBox do
begin
Parent := WizardForm.InstallingPage;
SetBounds(ScaleX(100), ScaleY(100), ScaleX(100), ScaleY(16));
Caption := 'Delete Redist Folder';
end;
end;
Johny777 у тебя случаем нет примера Переименование файлов не по маске а по определенному названию vo_ russian.spk на vo_english.spk в зависимости от выбранного компонента
tr011_tmn
14-08-2013, 15:56
tr011_tmn, удаление самого каталога вместе с содержимым подойдёт? »
глянул, если верно понял то {app} не будет трогаться при удалении FOLDER_NAME = 'Redist';. Все верно?
Johny777
14-08-2013, 17:18
vint56,
у тебя случаем нет примера Переименование файлов не по маске а по определенному названию vo_ russian.spk на vo_english.spk в зависимости от выбранного компонента »
Не было пока ты не спросил :) вот тебе процедура
[Components]
Name: en; Description: Russian to English; Flags: exclusive
Name: ru; Description: English to Russian; Flags: exclusive
;[Files]
;Source: Folder\*; DestDir: {app}; Flags: recursesubdirs createallsubdirs onlyifdoesntexist
[code ]
#define A = (Defined UNICODE) ? "W" : "A"
function MoveFile(lpExistingFileName, lpNewFileName: String): BOOL; external 'MoveFile{#A}@kernel32.dll stdcall';
procedure RenameFileChunks(const RootFolder, SourceFileChunk, DestFileChunk: String; const Recurse: Boolean);
var
NewSearchPath, TempFileName: String;
FindRec: TFindRec;
begin
NewSearchPath := AddBackslash(RemoveBackslash(RootFolder));
if FindFirst(NewSearchPath + '*.*', FindRec) then
try
repeat
if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
if Pos(SourceFileChunk, FindRec.Name) <> 0 then
begin
TempFileName := FindRec.Name;
StringChange(TempFileName, SourceFileChunk, DestFileChunk);
MoveFile(NewSearchPath + FindRec.Name, NewSearchPath + TempFileName);
end;
end else
if (FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY) and (FindRec.Name <> '.') and (FindRec.Name <> '..') then
if Recurse then RenameFileChunks(NewSearchPath + FindRec.Name, SourceFileChunk, DestFileChunk, Recurse);
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
AppPath: String;
begin
if CurStep = ssPostInstall then
begin
AppPath := ExpandConstant('{app}');
MsgBox('Сейчас переименую', mbInformation, MB_OK);
if IsComponentSelected('ru') then
RenameFileChunks(AppPath, 'english', 'russian', True)
if IsComponentSelected('en') then
RenameFileChunks(AppPath, 'russian', 'english', True);
end;
end;
прототип: procedure RenameFileChunks(const RootFolder, SourceFileChunk, DestFileChunk: String; const Recurse: Boolean);
где:
RootFolder - исходная папка с файлами и папками, где нужно переименовывать
SourceFileChunk - часть в имени файла которую нужно переименовать, в данном случае 'russian' в vo_ russian.spk
DestFileChunk - часть в имени файла в которую нужно переименовать - 'english'
Recurse - булев значение. Если True то будет искать в подкаталогах RootFolder-а, в противном случае только в RootFolder
вызываешь процедуру например на этапе ssPostInstall для соответсвующих компонентов, если они выбраны ( IsComponentSelected(...) ... )
==============================================================
tr011_tmn, Все верно? »
верно, слетит только папка Redist с её содержимым
Johny777 а что {app} константа не работает
procedure InitializeWizard;
begin
RenameFileChunks('C:\Program Files (x86)\ISDone', 'english', 'russian', True); только если так
end;
volga163@vk
14-08-2013, 18:30
Здравствуйте. Возможно ли сделать такую фишку:
Если существует файл config.ini в папке, куда ставится программа, но нет определённой ветки в реестре, установщик заменяет файл config.ini и создаёт ветку с определённым значением и наоборот.
Если существует и то, и то, то установка ничего из них не трогает.
Если нет ни того, ни того, то установка создаёт и ветку, и файл.
Голову сломал, ничего на ум не приходит.
Johny777
14-08-2013, 18:43
vint56,
а что {app} константа не работает »
она работает и всё остальное кроме встроенной RenameFile, которая по непонятным мне причинам в данном случае НЕ работает (моё доверие к встроенным функциям упало ещё на одно деление :( )
http://img191.imageshack.us/img191/5369/59by.png (http://imageshack.us/photo/my-images/191/59by.png/)
заместо её используй WinApi функцию MoveFile, которой можно переименовывать файлы
обновил предыдущий код
всё понятное дело перед этим проверил у себя на безошибочную работу
volga163@vk, создать ветку в реестре? что-то я не пойму. Может ключ. И где? в каком разделе? Какие значения туда внести? Как ключ называется? Подробнее насчёт реестра скажи
а лучше всего выложи содержание .reg файла
Здравствуйте!
В моем скрипте создаются и используются кастомные формочки. Сам инсталляор должен быть двуязычным (рус + англ). Текст на стандартных формах при выборе определенного языка на этот язык переводится, а текст на кастомных формах - очевидно, нет. Может, кто подскажет, как корректно реализовать двуязычность для кастомных форм? Это в скрипте создания форм надо мониторить язык как-то и в зависимости от языка выводить разные сообщения? Или это нужно как-то править языковые (.isl) файлы?
В работе с inno новичок, буду благодарна за помощь:)
volga163@vk
14-08-2013, 19:33
Подробнее насчёт реестра скажи »
Проверяем наличие этой ветки: HKCU\Control Panel\MyApp\Test\, значение типа expandsz, с текстом "ID" и именем ID. Вот как на картинке:
http://ybex.com/index.php?c=start&m=pic&key=wgpj09p7pviqirid2q5n3w5fz5g5iodwn8c23ly2
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.