Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
Johny777
19-08-2012, 01:34
Ivan_009, Mafioza,
блин чуваки
харэ мудрить
я знаю как такое задать и поделюсь, но вы поймите простую вещь
у меня в инсталле при запуске извлекаются 75 картинок
на них отведено 74 деления прогрессбара на форме которая создаётся в начале InitializeWizard;
а в конце разрушается
сама процедура InitializeWizard; у меня длиной в 4200 строк
и все остальные деления (позиции прогреса) раскиданы на примерно равных интервалах по ней (25 делений)
те я не мог не отобразить запуск такого тяжёлого инсталла
если у вас сразу запускается, то вы и форму не особо увидите. Она мелькнёт и всё
а теперь подумайте
вот вы хотите вешать необдуманно рюшки которые - понты
Я тоже фанат всяких наворотов но скажу честно. Если бы мой инсталл запускался за пару секунд я бы форму даже не создавал
в общем призываю ещё раз пересмотреть желания
если вам нужны кастомные тормоза, то дело ваше. Выдеру пример у себя из кода
Прочитали?
Теперь ещё раз скажите нужно или нет
если не нужно то поудаляйте свои посты
если нужно оставьте. Заменю это сообщение на код
Fifth Intellect
19-08-2012, 03:43
а теперь подумайте
вот вы хотите вешать необдуманно рюшки которые - понты »Мне тоже нравятся некоторые рюшечки, но в меру и если они несут в себе какую то полезность, ну, или необходимость, что то донести до пользователя, такой тюнинг действительно есть. Лично я выбираю "как можно больше дефолта+красоты+компактности+скорости загрузки и естесно + стабильности работы". Но вот то хочет Mafioza, именно то что показал товарищ Ivan_009 на скрине, лично я не представляю зачем такая пое**та вообще нужна. Это лишний код, лишний геморой, лишняя пустая трата времени. Полагаю это всего лишь понт. На мой взгляд в подобных штучках нет ничего что могло бы быть полезным. А так конечно это дело каждого, на вкус и цвет фломастеры разные ;).
Fifth Intellect вообщето это не понт понятно некоторые инсталлы загружаются долго , мне нужен как ты говоришь этот геморой!
El Sanchez,
Ваш скрипт работает. Спасибо большое!
В чём смысл флага CSIDL_FLAG_CREATE? - Без него тоже работает.
El Sanchez
19-08-2012, 22:19
В чём смысл флага CSIDL_FLAG_CREATE? - Без него тоже работает. »
ChVL, у меня тоже. Флаг означает создать папку, если ее еще нет. В SHGetSpecialFolderPath, которую вы использовали, за это отвечает последний параметр, у вас он True. Эта функция устарела, поэтому я ее и заменил.
Johny777
20-08-2012, 00:52
мне нужен »
держи
[Setup]
AppName=Icon_Demo
AppVerName=Icon_Demo
DefaultDirName={pf}\Icon_Demo
Compression=none
[Files]
;DestName: "WizardForm.BitmapImage1.bmp"; Source: "Pics\Lambda_hand.bmp"; Flags: dontcopy solidbreak nocompression sortfilesbyextension
;DestName: "WizardForm.BitmapImage2.bmp"; Source: "Pics\D2_coast.bmp"; Flags: dontcopy solidbreak nocompression sortfilesbyextension
;DestName: "WizardForm.BitmapImage3.bmp"; Source: "Pics\GordonF.bmp"; Flags: dontcopy solidbreak nocompression sortfilesbyextension
;DestName: "WizardForm.BitmapImage4.bmp"; Source: "Pics\Borealis.bmp"; Flags: dontcopy solidbreak nocompression sortfilesbyextension
;DestName: "WizardForm.BitmapImage5.bmp"; Source: "Pics\portals.bmp"; Flags: dontcopy solidbreak nocompression sortfilesbyextension
;... итд
[ code]
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
procedure InitializeWizard;////////////////////////////////////////////////////////////////////////////////////////// Initialize Wizard ////////////////////////////////////////////////////////////////////////////////////////////////
var
Form: TSetupForm;
LoadPrgsBar: TNewProgressBar;
i: Integer;
begin
Form := CreateCustomForm();
with Form do
begin
ClientWidth := ScaleX(300);
ClientHeight := ScaleY(271);
BorderStyle := bsDialog;
Caption := 'Загрузка';
Left := GetSystemMetrics(16) - ClientWidth - ScaleX(16);
Top := GetSystemMetrics(17) - ClientHeight - ScaleY(16);
LoadPrgsBar := TNewProgressBar.Create(nil);
with LoadPrgsBar do
begin
Parent := Form;
SetBounds(ScaleX(0), ScaleY(0), ScaleX(300), ScaleY(27));
Position := 0;
end;
Show;
Repaint;
end;
/// пример распаковки изображений в цикле (называния картинок должны быть одинаковыми с разными номерами) = пример в секции файлов
// with LoadPrgsBar do
// begin
// for i := 1 to 73 do
// begin
// ExtractTemporaryFile('WizardForm.BitmapImage' + IntToStr(i) + '.bmp');
// Position := i;
// end;
// end;
/// другой пример
// ExtractTemporaryFile('warning_dark.bmp'); // извлекаем картинку
LoadPrgsBar.Position := 1; // добавляем позицию
// ExtractTemporaryFile('hl1.bmp'); /// извлекаеи ещё одну
LoadPrgsBar.Position := 2; // добавляем позицию
/// создаеём что-то
LoadPrgsBar.Position := 3; // добавляем позицию
Form.Free; /// писать в самом конце процедуры. Те освобождаем форму
end;
взял у себя из кода
правда без картинки
чисто функционал
нужна будет добавь таким макаром http://forum.oszone.net/post-1968497-631.html
Доброго дня, подскажите пожалуйста , если возле инсталлятора лежит к примеру файл 1.mp3, скопировать его в папку установки + под папки Music\\11\\
В итоге он после установки должен оказаться так к примеру С:\\1\\Music\\11\\1.mp3 но только если он имеется возле инсталлятора.
Johny777
20-08-2012, 15:09
ddv122,
[Setup]
AppName=Icon_Demo
AppVerName=Icon_Demo
DefaultDirName={pf}\Icon_Demo
Compression=none
[Files]
Source: {src}\1.mp3; DestDir: {app}\Music\11; Flags: external skipifsourcedoesntexist
[Dirs]
Name: "{app}\Music\11"
MogilShik2007
20-08-2012, 17:31
Всем привет!
Выложите скрипт двойного прогресс бара, нашел один, но чет смущает пункт SizeInfo.ini - чего это такое и откуда ее брать?
И такой вопрос на больших файлах пропадает моя иконка инсталлятора, это как то можно исправить?
Эээ, после запуска игры появляются такие значения в реестре:
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{EE4DEA71-3E59-432B-AF58-2B13E53D4F90}"; и т.д.
Root: HKLM; Subkey: "SOFTWARE\Classes\Record\{05266000-5465-3AA0-90F4-6FDD962F7F95}"; и т.д.
Где цифры выделены фиолетовым цветом, это можно как то прописать чтобы удалялось?
Johny777
20-08-2012, 18:39
MogilShik2007,
сам хотел двойной прогрессбар
мне на руборде объяснили по научному - http://krinkels.org/showpost.php?p=8222&postcount=311
что это нереально или как-то так
давно забил (ну почти забил :) )
Ivan_009,
он о примере для не использующего исдан скрипта говорит
и в исдане вверху общее количество архивов
внизу текущий
те это не отображение конкретных файлов - мелких и больших!
MogilShik2007
20-08-2012, 18:47
Johny777
Спасибо.
А что по поводу ключей реестра?
Вот кстати скрипт двойного прогресс бара:
#define SrcPath "Files\"
#define Mask "*.*"
#define FindHandle
#define FindResult
#define SearchPath SrcPath + Mask
#define AllFilesSize 0
#define CurFileSize 0
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy
#sub ProcessFoundFile
#define FileName FindGetFileName(FindHandle)
Source: {#SrcPath}{#FileName}; DestDir: {tmp}; Flags: ignoreversion; BeforeInstall: ProgressInit(); AfterInstall: ProgressReset()
#expr CurFileSize = FileSize(SrcPath + FileName)
#expr AllFilesSize = AllFilesSize + CurFileSize
#expr WriteIni( SourcePath + "\\SizeInfo.ini","Name", FileName, CurFileSize )
#expr WriteIni( SourcePath + "\\SizeInfo.ini","Size", "AllSize", AllFilesSize )
#endsub
#for {FindHandle = FindResult = FindFirst(SearchPath, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile
Source: SizeInfo.ini; Flags: dontcopy
[Code]
type
TMsg = record
hwnd: HWnd;
msg: Word;
wParam: Word;
lParam: Word;
time: Longint;
pt: TPoint;
end;
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
var
Msg: TMsg;
TimerID: LongWord;
ProgressBar: TNewProgressBar;
CurrentFileSize: LongInt;
OneStepSize: LongInt;
OldPosition: LongInt;
ReadyFlag: Boolean;
lbl, lbl1: TLabel;
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
function WrapTimerProc(callback: TProc; paramcount: Integer): Longword; external 'wrapcallback@files:innocallback.dll stdcall';
procedure ProgressInit();
begin
ProgressBar.Min:= 0;
ProgressBar.Position:= 0;
OldPosition:= WizardForm.ProgressGauge.Position;
ProgressBar.Max:= GetIniInt('Name', ExtractFileName(ExpandConstant(CurrentFileName)), 0, 0, 0, ExpandConstant('{tmp}\SizeInfo.ini'));
ReadyFlag:= True;
end;
procedure ProgressReset();
begin
ReadyFlag:= False;
end;
procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
res: LongWord;
begin
if ReadyFlag then
begin
ProgressBar.Position:= ProgressBar.Position + (WizardForm.ProgressGauge.Position - OldPosition) ;
OldPosition:= WizardForm.ProgressGauge.Position;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
pfunc: LongWord;
begin
if CurStep = ssInstall then
begin
pfunc:= WrapTimerProc(@OnTimer, 4);
TimerID:= SetTimer(0, 0, 20, pfunc);
end;
end;
procedure InitializeWizard();
begin
ReadyFlag:= False;
ExtractTemporaryFile('SizeInfo.ini');
ProgressBar := TNewProgressBar.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressBar.Left := Left;
ProgressBar.Top := Top + ScaleX(30);
ProgressBar.Width := Width;
ProgressBar.Height := Height;
ProgressBar.Parent := WizardForm.InstallingPage;
ProgressBar.Position := 0;
end;
end;
procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;
Что за SizeInfo.ini и с чем его едят? )))
Ivan_009
20-08-2012, 20:51
Как добавить в инсталлятор свой шрифт можно пример.... :sorry:
El Sanchez
20-08-2012, 21:51
Как добавить в инсталлятор свой шрифт можно пример.... »
Ivan_009, пример есть в шапке. В нем файл шрифта распаковывается во временную папку и подгружается оттуда. Для тех, кто использует расширенную версию Inno, возможен вариант с распаковкой шрифта в память, а не на диск. Вот пример:
#define Font "Rurintania.ttf"
#define FontName "Rurintania"
[Setup]
RawDataResource=font:{#Font}
[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
function FindResource(hModule: THandle; lpName: String; lpType: Integer): THandle; external 'FindResource{#A}@kernel32.dll stdcall';
function LoadResource(hModule, hResInfo: THandle): THandle; external 'LoadResource@kernel32.dll stdcall';
function LockResource(hResData: THandle): Longint; external 'LockResource@kernel32.dll stdcall';
function SizeofResource(hModule, hResInfo: THandle): DWORD; external 'SizeofResource@kernel32.dll stdcall';
function AddFontMemResourceEx(pbFont: Longint; cbFont: DWORD; pdv: Longint; var pcFonts: DWORD): THandle; external 'AddFontMemResourceEx@gdi32.dll stdcall';
function RemoveFontMemResourceEx(fh: THandle): BOOL; external 'RemoveFontMemResourceEx@gdi32.dll stdcall';
const
RT_RCDATA = 10;
var
fh, hResInfo, hResAddr: THandle;
pcFonts, iResSize: DWORD;
procedure InitializeWizard();
begin
if not FontExists('{#FontName}') then
begin
hResInfo := FindResource(HInstance, '_IS_FONT', RT_RCDATA);
iResSize := SizeofResource(HInstance, hResInfo);
hResAddr := LockResource(LoadResource(HInstance, hResInfo));
pcFonts := 1;
fh := AddFontMemResourceEx(hResAddr, iResSize, 0, pcFonts);
end;
//отсюда начинаем указывать наш шрифт
WizardForm.Font.Name := '{#FontName}';
end;
procedure DeinitializeSetup();
begin
RemoveFontMemResourceEx(fh);
end;
Ivan_009
20-08-2012, 22:14
El Sanchez, а в деинсталлятор как?
El Sanchez
21-08-2012, 11:08
El Sanchez, а в деинсталлятор как? »
Ivan_009, аналогично:
procedure InitializeUninstallProgressForm();
begin
if not FontExists('{#FontName}') then
begin
hResInfo := FindResource(HInstance, '_IS_FONT', RT_RCDATA);
iResSize := SizeofResource(HInstance, hResInfo);
hResAddr := LockResource(LoadResource(HInstance, hResInfo));
pcFonts := 1;
fh := AddFontMemResourceEx(hResAddr, iResSize, 0, pcFonts);
end;
//
UninstallProgressForm.Font.Name := '{#FontName}';
end;
procedure DeinitializeUninstall();
begin
RemoveFontMemResourceEx(fh);
end;
Ivan_009
21-08-2012, 16:53
При наложении текстур на кнопки эти процедуры нужны в IsDone скрипте или нет
WizardForm.CancelButton.Visible:=true;
WizardForm.CancelButton.Enabled:=false;
Подскажите заранее благодарю... :search:
Ivan_009, ну так вроде отвечает на кнопочку "Отмены", потестируй.
Ivan_009
21-08-2012, 23:05
Как добавить проценты удаления на деинсталлятор...Подскажите пожалуйста... :search:
apozlevich
22-08-2012, 15:40
Всем доброго времени {суток}!
Появился вопрос: вот есть три файла с одинаковыми именами, как бы сделать так, что бы можно было выбрать, какой из них устанавливать? (Ооочень желательно еще и с выбором из командной строки).
R.i.m.s.k.y.
22-08-2012, 15:47
apozlevich,
как-то так
[Components]
Name: f1; Description: File #1
Name: f2; Description: File #2
Name: f3; Description: File #3
[Files]
Components: f1; Source: Files\F1\File1, Destination: {app}
Components: f2; Source: Files\F2\File2, Destination: {app}
Components: f3; Source: Files\F3\File3, Destination: {app}
С комстрокой тебе чего именно нужно?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.