Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]
Привет... вопросик:
Можно ли научить инно скачивать с https ? Может *dll-ку какую можно прикрутить?
З.Ы. с http качает без проблем.
Ivan_009, кстати, вдруг если не заметил, нумерация файлов слайдшоу должна начинаться с 0 - 0.bmp, 1.bmp и так далее. Это так, на всякий случай :)
Ivan_009
26-03-2014, 22:02
кстати, вдруг если не заметил, нумерация файлов слайдшоу должна начинаться с 0 - 0.bmp, 1.bmp и так далее. Это так, на всякий случай »
nik1967, Ну я уже понял :) . Кстати как на финишной странице к примеру остановить показ слайд-шоу...
Dodakaedr
26-03-2014, 22:50
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Run]
Filename: "{app}\MyProg"; Description: "{cm:LaunchProgram, MyProg}"; Flags: nowait postinstall skipifsilent
[ Code]
var
IniCheckBox: TCheckBox;
procedure InitializeWizard();
begin
IniCheckBox:= TCheckBox.Create(WizardForm);
IniCheckBox.Left:= WizardForm.RunList.Left + 4;
IniCheckBox.Top:= WizardForm.RunList.Top + 10;
IniCheckBox.Width:= WizardForm.RunList.Width;
IniCheckBox.Height:= 14
IniCheckBox.Caption:=' Изменить язык интерфейса на русский';
IniCheckBox.Parent:= WizardForm.FinishedPage;
end;
procedure DeinitializeSetup();
begin
if WizardForm.CurPageID = WpFinished then
begin
if IniCheckBox.Checked then
SetIniString('Language','CurrentLanguage', 'путь к файлу\Language\Russian.ini' ,ExpandConstant('{app}\Settings.ini'))
end;
end;
Как сделать чтобы вместо "путь к файлу" было "{pf}\My Program" (надо чтобы брался путь с {app}). Как это изменить? И желательно без чекбокса все это оформить??
Кстати как на финишной странице к примеру остановить показ слайд-шоу... »
Использовать KillTimer и скрытие AImg - ImgSetVisibility(AImg[i],false); либо AImg[i].Hide; - но не проверял - не уверен в правильности.
Dodakaedr, ну дык
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[ Code]
procedure CurPageChanged(CurPageID: Integer);
begin
if WizardForm.CurPageID = WpFinished then SetIniString('Language','CurrentLanguage','RU',ExpandConstant('{app}\Language\Russian.ini'));
end;
Pascal Scripting: SetIniString
Prototype:
function SetIniString(const Section, Key, Value, Filename: String): Boolean;
Description:
Writes a string to an INI file.
Ivan_009
26-03-2014, 23:22
nik1967, Таймер какой то не убиваемый пробовал:
ImgSetVisibility(AImg[i],false);
KillTimer(0, Timer);
на секунду отключает дальше пошло и поехало... :shot:
Ivan_009, скинь скрип с файлами - посмотрю, как будет время (можно в личку).
Dodakaedr
26-03-2014, 23:37
nik1967, не то. Твой скрипт создает
[Language]
CurrentLanguage=RU
А мне нужно чтобы было так
[Language]
CurrentLanguage=C:\Program Files\ImageConverter\Language\Russian.ini
И то чтобы C:\Program Files\ImageConverter бралось з инсталятора с константы {app}
Habetdin
27-03-2014, 01:35
Как сделать чтобы вместо "путь к файлу" было "{pf}\My Program" (надо чтобы брался путь с {app}). Как это изменить? »
По аналогии с предыдущим параметром, можно было написать:
ExpandConstant('{app}\Language\Russian.ini')
И желательно без чекбокса все это оформить? »
Убрать весь код, создающий чекбокс и проверяющий его значение? Получаем:
procedure DeinitializeSetup();
begin
if WizardForm.CurPageID = WpFinished then
begin
SetIniString('Language', 'CurrentLanguage', ExpandConstant('{app}\Language\Russian.ini'), ExpandConstant('{app}\Settings.ini'))
end;
end;
Хотя, правильнее, по-моему, для данной цели для этого использовать секцию [INI] (http://www.jrsoftware.org/ishelp/topic_inisection.htm), а не [Code]:
[INI]
Filename: "{app}\Settings.ini"; Section: "Language"; Key: "CurrentLanguage"; String: "{app}\Language\Russian.ini"
[hr]Есть Components/Tasks, INI (а еще конструкторы, генерирующие все необходимое), а они пишут всё в Code, при этом не зная основ этого самого Code :(
Dodakaedr
27-03-2014, 08:40
Убрать весь код, создающий чекбокс и проверяющий его значение? Получаем: »
Супер, то что нужно.
Доброго времени суток!
Подскажите плиз, можно ли в инно поменять порядок отображения стандартных страниц? Ну т е сначала тип, а потом выбор папки для установки, например.
поменять порядок отображения стандартных страниц? »
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpSelectDir: WizardForm.SelectComponentsPage.Show;
wpSelectComponents: WizardForm.SelectDirPage.Show;
end;
end;
Dodakaedr
27-03-2014, 23:28
http://savepic.org/5216498.jpg
Как это окошко (Информационное) можно изменить: размер, название вверху, вставить картинку в нижнею часть?
Dodakaedr, никак. Это стандартный MsgBox, редактировать его нельзя, за исключением текста и набора кнопок. В шапке есть пример Создание кастомного диалогового окна (http://forum.oszone.net/post-2043384-1383.html), как раз под этот случай.
Dinvin4ester
28-03-2014, 10:02
Ребята привет.
Скрипт - http://sendfile.su/952086 и еще не показывает прогресс бар ,можно тоже сделать ее,а то я не использую сторонние архиваторы,только пользуюсь средствами инно.
Спасибо.
Помогите пжста. Нужно сделать два чекбокса в деинсталле на удаление файлов конфигураций программы.
Вот часть моего кода:
[UninstallDelete]
Type: filesandordirs; Name: "{app}\config"
Type: filesandordirs; Name: "{app}\files"
Type: files; Name: "{app}\ts3server.sqlitedb"
[code]
var
RunProg: TCheckBox;
procedure CheckBoxChecked;
begin
if RunProg.Checked then
MsgBox('CheckBox отмечен...', mbInformation, MB_OK);
end;
procedure GreatCheckBox;
begin
RunProg:= TCheckBox.Create(WizardForm);
with RunProg do
begin
Parent := WizardForm;
Caption := 'Удалить файлы конфигураций?';
SetBounds(140,330,150,15);
Cursor:= crHand;
Checked:= True;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpFinished then GreatCheckBox;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then CheckBoxChecked;
end;
Только вот я не знаю как связать секции [UninstallDelete] и [code]
Serega, в таком варианте работает несовсем корректно. Страницы меняются, но не меняются шапки, т е на странице с выбором папки заголовок про выбор компонентов и наоборот. И кроме того, на странице выбора компонентов по кнопке "далее" выводится диалог о папке установки (типа папка существует, точно хотите установить туда)
Shkutu, есть вот такой, старый, код Доброва:
[Setup]
AppName=My program
AppVerName=My program 1.5
DefaultDirName={pf}\My program
;DisableDirPage=True
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
[Components]
Name: WB; Description: 'Мой компьютер' - Настройки; ExtraDiskSpaceRequired: 1048576
[code]
function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;
Procedure CurPageChanged(CurPageID: Integer);
Begin
Case CurPageID of
wpSelectDir: if WizardForm.Tag = 1 then
begin
WizardForm.SelectDirPage.Notebook.ActivePage:= WizardForm.SelectComponentsPage;
WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectComponents)
WizardForm.Hint:= WizardForm.PageDescriptionLabel.Caption; // запомнить SetupMessage(msgSelectDirDesc)
WizardForm.PageDescriptionLabel.Caption:= SetupMessage(msgSelectComponentsDesc)
end;
wpSelectComponents: if WizardForm.Tag = 1 then
begin
WizardForm.SelectComponentsPage.Notebook.ActivePage:= WizardForm.SelectDirPage;
WizardForm.DiskSpaceLabel.Caption:= WizardForm.ComponentsDiskSpaceLabel.Caption;
WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectDir)
WizardForm.PageDescriptionLabel.Caption:= WizardForm.Hint // иначе вместо названия программы [name]
end;
end;
End;
Procedure InitializeWizard;
Begin
PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage
end;
Dodakaedr
28-03-2014, 17:39
saurn, [Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[cоde]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
GWL_EXSTYLE = -20;
WS_EX_APPWINDOW = $40000;
WS_EX_TOOLWINDOW = $80;
//SW_HIDE = 0;
SW_NORMAL = 1;
GWL_HWNDPARENT = -8;
GCL_STYLE = -26;
CS_NOCLOSE = $200;
WM_CLOSE = $10;
// hhkAtlTab = 101;
// hhkAtlSpace = 102;
// MOD_ALT = 1;
// VK_TAB = 9;
MB_ICONHAND = $00000010;
// MB_ICONQUESTION = $00000020;
MB_ICONEXCLAMATION = $00000030;
MB_ICONASTERISK = $00000040;
MB_USERICON = $00000080;
// MB_ICONWARNING = MB_ICONEXCLAMATION;
// MB_ICONERROR = MB_ICONHAND;
// MB_ICONINFORMATION = MB_ICONASTERISK;
MB_ICONSTOP = MB_ICONHAND;
type
HDC = LongWord;
HFONT = LongWord;
HGDIOBJ = LongWord;
STR_SIZE = record
cx: Longint;
cy: Longint;
end;
_MESSAGE_INFO = record
hMsgLabel: HWND;
dTimeOut: DWORD;
dStartTime: DWORD;
hMsgForm: HWND;
end;
var
MESSAGE_INFO: _MESSAGE_INFO;
//function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLong{#A}@user32.dll stdcall';
//function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLong{#A}@user32.dll stdcall';
//function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';
function GetDC(hWnd: HWND): HDC; external 'GetDC@user32.dll stdcall';
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; external 'SelectObject@gdi32.dll stdcall';
function GetTextExtentPoint32(DC: HDC; Str: PChar; Count: Integer; var Size: STR_SIZE): BOOL; external 'GetTextExtentPoint32{#A}@gdi32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';
function StrFromTimeInterval(var pszOut: Char; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
//function RegisterHotKey(hWnd: HWND; id: Integer; fsModifiers, vk: UINT): BOOL; external 'RegisterHotKey@user32.dll stdcall';
//function UnregisterHotKey(hWnd: HWND; id: Integer): BOOL; external 'UnregisterHotKey@user32.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function MessageBeep(uType: UINT): BOOL; external 'MessageBeep@user32.dll stdcall';
function GetStrSizeInPixels(Font: TFont; Caption: String): STR_SIZE;
var
DC: HDC;
SaveFont: HFONT;
begin
DC := GetDC(0);
try
SaveFont := SelectObject(DC, Font.Handle);
GetTextExtentPoint32(DC, PChar(Caption), Length(Caption), Result);
SelectObject(DC, SaveFont);
finally
ReleaseDC(0, DC);
end;
end;
function TicksToTime(Ticks: DWORD): String;
var
i: Byte;
arr: array [0..31] of Char;
begin
for i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;
function CharCount(C: Char; aStr: String): Integer;
var
i: Integer;
begin
Result := 0;
for i := 1 to Length(aStr) do if aStr[i] = C then Result := Result + 1;
end;
procedure ATimeOutProc;
var
PassedTime: DWORD;
begin
PassedTime := GetTickCount-MESSAGE_INFO.dStartTime;
if PassedTime >= MESSAGE_INFO.dTimeOut then PostMessage(MESSAGE_INFO.hMsgForm, WM_CLOSE, 0, 0);
SetWindowText(MESSAGE_INFO.hMsgLabel, TicksToTime(MESSAGE_INFO.dTimeOut-PassedTime));
end;
function ShowMessageEx(AText, ACaption: string; AType: UINT; AMsgTyp: TMsgBoxType; ATimeOut: Integer): Integer;
var
MsgBoxForm: TSetupForm;
MsgLabel: TLabel;
Size: STR_SIZE;
szStatus: TNewStaticText;
ATimeOutTimer: LongWord;
begin
MsgBoxForm := CreateCustomForm;
with MsgBoxForm do
begin
Position := poScreenCenter;
BorderStyle := bsDialog;
Caption := ACaption;
Color := clBtnFace;
ShowWindow(GetWindowLong(MsgBoxForm.Handle, GWL_HWNDPARENT), SW_HIDE);
// RegisterHotKey(Handle, hhkAtlTab, MOD_ALT, VK_TAB);
MsgLabel := TLabel.Create(nil)
with MsgLabel do
begin
AutoSize := False;
WordWrap := True;
Parent := MsgBoxForm;
Caption := AText;
Size := GetStrSizeInPixels(Font, AText);
Left := ScaleX(16);
Top := ScaleY(16);
Font.Size := 10;
if (Size.cx > 300) and (Size.cx <= 500) then
begin
Width := ScaleX(Size.cx);
Height := ScaleY(Size.cy)+Size.cy*CharCount(#13,AText)+3;
end else if (Size.cx > 500) then
begin
Width := ScaleX(500);
Height := ScaleY(Size.cy*Round(Size.cx/500)+Size.cy*CharCount(#13,AText));
end else if (Size.cx < 300) then
begin
Width := ScaleX(300);
Height := (Size.cy);
end;
end;
ClientWidth := MsgLabel.Width + ScaleX(30);
ClientHeight := MsgLabel.Height + ScaleY(70);
with TButton.Create(nil) do
begin
Parent := MsgBoxForm;
SetBounds(MsgBoxForm.ClientWidth - ScaleX(90), MsgBoxForm.ClientHeight - ScaleY(35), ScaleX(71), ScaleY(25));
Cursor := crHand;
case AType of
MB_OKCANCEL:
begin
ModalResult := mrOk;
Caption := SetupMessage(msgButtonOK);
end;
MB_YESNO:
begin
ModalResult := mrYes;
Caption := SetupMessage(msgButtonYes);
end;
MB_OK:
begin
ModalResult := mrOk;
Caption := SetupMessage(msgButtonOk);
end;
end;
end;
if AType <> MB_OK then
with TButton.Create(nil) do
begin
Caption := SetupMessage(msgButtonNo);
Parent := MsgBoxForm;
SetBounds(MsgBoxForm.ClientWidth - ScaleX(175), MsgBoxForm.ClientHeight - ScaleY(35), ScaleX(71), ScaleY(25));
Cursor := crHand;
case AType of
MB_OKCANCEL:
begin
ModalResult := mrCancel;
Caption := SetupMessage(msgButtonCancel);
end;
MB_YESNO:
begin
ModalResult := mrNo;
Caption := SetupMessage(msgButtonNo);
end;
end;
end;
if ATimeOut <> 0 then
begin
szStatus := TNewStaticText.Create(nil);
with szStatus do
begin
Parent := MsgBoxForm;
WordWrap := True;
SetBounds(ScaleX(16), MsgBoxForm.ClientHeight - ScaleY(25), ScaleX(71), ScaleY(25));
end;
MESSAGE_INFO.hMsgLabel := szStatus.Handle;
MESSAGE_INFO.dTimeOut := ATimeOut;
MESSAGE_INFO.dStartTime := GetTickCount;
MESSAGE_INFO.hMsgForm := MsgBoxForm.Handle;
ATimeOutTimer := SetTimer(0, 777, 1, CallbackAddr('ATimeOutProc'));
end;
case AMsgTyp of
mbError: MessageBeep(MB_ICONWARNING);
mbInformation: if not MessageBeep(MB_ICONINFORMATION) then MessageBeep(MB_ICONASTERISK);
mbCriticalError: if not MessageBeep(MB_ICONSTOP) then MessageBeep(MB_ICONERROR);
end;
case AType of
MB_OKCANCEL:
case ShowModal of
mrOk: Result := IDOK;
mrCancel: Result := IDCANCEL;
else Result := IDCANCEL;
end;
MB_YESNO:
case ShowModal of
mrYes: Result := IDYES;
mrNo: Result := IDNO;
else Result := IDNO;
end;
MB_OK:
begin
ShowModal;
Result := IDOK;
end;
end;
ShowWindow(GetWindowLong(MsgBoxForm.Handle, GWL_HWNDPARENT), SW_NORMAL);
KillTimer(0, ATimeOutTimer);
// UnregisterHotKey(Handle,hhkAtlTab);
// UnregisterHotKey(Handle,hhkAtlSpace);
Free;
end;
end;
function InitializeSetup(): Boolean;
begin
if ShowMessageEx( ' Названия архивов:' + #13#10 +
'hl2_update.exe' + #13#10 +
'hl2_ep1_update.exe' + #13#10 +
'hl2_ep2_update.exe' + #13#10 +
'portal_update.exe'
, SetupMessage(msgErrorTitle), MB_YESNO, mbCriticalError, 7000) = IDNO then MsgBox('Cancel', mbCriticalError, MB_OK);
end;
Почему inno ultra в этом коде выдает что 'PChar' неизвестный тип (67 строка)?
Dodakaedr
type
#ifdef UNICODE
#define A "W"
PChar = PAnsiChar;
#else
#define A "A"
#endif
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC