Войти

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


Страниц : 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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

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 на скрине, лично я не представляю зачем такая пое**та вообще нужна. Это лишний код, лишний геморой, лишняя пустая трата времени. Полагаю это всего лишь понт. На мой взгляд в подобных штучках нет ничего что могло бы быть полезным. А так конечно это дело каждого, на вкус и цвет фломастеры разные ;).

Mafioza
19-08-2012, 10:07
Fifth Intellect вообщето это не понт понятно некоторые инсталлы загружаются долго , мне нужен как ты говоришь этот геморой!

ChVL
19-08-2012, 20:47
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

ddv122
20-08-2012, 13:55
Доброго дня, подскажите пожалуйста , если возле инсталлятора лежит к примеру файл 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:

alert30
21-08-2012, 18:23
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