PDA

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


Страниц : 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

ROMKA-1977
30-05-2018, 09:29
в секцию Setup добавить WindowVisible=yes и WindowShowCaption=no, в процедуре ResizeButtonOnClick в конце дописать MainForm.Visible := not PageResized; »
Получилось но не совсем то. Поверх фонового изображения "xxx.jpg" теперь накладывается стандартный синий фон Inno Setup вот он закрывается и отображается при кликах на кнопки "Min" и "Max", а фоновое изображение "xxx.jpg" как и ранее отображается на экране при клике на кнопку "Min".

Nikolay4
30-05-2018, 16:42
Добрый день, подскажите, возможно ли как-то прикрутить inno download plugin к скрипту "Opera"
чтоб прогресс скачивания нормально отображался перед распаковкой.

Сам скрипт http://rgho.st/8qQG8FPTm

El Sanchez
31-05-2018, 10:08
Получилось но не совсем то. Поверх фонового изображения "xxx.jpg" теперь накладывается стандартный синий фон Inno Setup вот он закрывается и отображается при кликах на кнопки "Min" и "Max", а фоновое изображение "xxx.jpg" как и ранее отображается на экране при клике на кнопку "Min". »
ROMKA-1977, не проверял, не хочу библиотеку искать :). Попробуйте вместо ssInitialize(GetWindowLong(MainForm.Handle,-8),0,False,1,$FF000000); написать ssInitialize(MainForm.Handle,0,False,1,$FF000000);
P.S. GetWindowLong(MainForm.Handle,-8) - попытка автора библиотеки Application.Handle получить. Ужас.

Sotonisto
13-06-2018, 02:13
Доброго времени суток. Будьте добры подскажите:
1. Как изменить цвет текста лицензионного соглашения? WizardForm.LicenseMemo.Font.Color не даёт никакого эффекта.
2. Существует ли способ разместить текст на Splash изображении?
3. Можно ли в WizardForm.ComponentsList добавить название колонок (как в таблицах)? По сути над списком чекбоксов должна размещаться линия, поделенная на 3 "колонки", такого вида: [ Пустая ячейка | Компоненты | Размер компонента].

El Sanchez
14-06-2018, 12:04
1. Как изменить цвет текста лицензионного соглашения? WizardForm.LicenseMemo.Font.Color не даёт никакого эффекта. »
Sotonisto, используйте rtf-файл
3. Можно ли в WizardForm.ComponentsList добавить название колонок (как в таблицах)? По сути над списком чекбоксов должна размещаться линия, поделенная на 3 "колонки", такого вида: [ Пустая ячейка | Компоненты | Размер компонента]. »
Sotonisto,
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
#ifndef IS_ENHANCED
const
WC_HEADER = 'SysHeader32';
WS_CHILD = $40000000;
WS_VISIBLE = $10000000;
WS_DISABLED = $08000000;
WM_SETFONT = $0030;
HDI_WIDTH = $0001;
HDI_TEXT = $0002;
HDI_FORMAT = $0004;
HDF_CENTER = $0002;
HDF_STRING = $4000;
HDM_FIRST = $1200;
HDM_INSERTITEM = HDM_FIRST + {#ifdef UNICODE}10{#else}1{#endif};

type
THDItem = record
Mask: LongWord;
cxy: Integer;
pszText: string;
hbm: HBITMAP;
cchTextMax: Integer;
fmt: Integer;
lParam: LongWord;
iImage: Integer;
iOrder: Integer;
_type: LongWord;
pvFilter: LongWord;
state: LongWord;
end;

// Window Functions
function CreateWindowEx(dwExStyle: DWORD; lpClassName, lpWindowName: string; dwStyle: DWORD; x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: THandle; hInstance, lpParam: Longint): HWND; external 'CreateWindowEx{#A}@user32.dll stdcall';
function DestroyWindow(hWnd: HWND): BOOL; external 'DestroyWindow@user32.dll stdcall';
// Message Functions
function SendMessageHDItem(hWnd: HWND; Msg: LongWord; wParam: Longint; var lParam: THDItem): Longint; external 'SendMessage{#A}@user32.dll stdcall';

var
HeaderHandle: HWND;
#endif

procedure CreateHeader;
var
#ifdef IS_ENHANCED
HeaderControl: THeaderControl;
HeaderSection: THeaderSection;
#else
HDItem: THDItem;
#endif
begin
with WizardForm.ComponentsList do
begin
#ifdef IS_ENHANCED
HeaderControl := THeaderControl.Create(WizardForm);
HeaderControl.Parent := WizardForm.ComponentsList;
HeaderControl.Enabled := False;
HeaderSection := HeaderControl.Sections.Add;
HeaderSection.Width := ClientWidth div 3;
HeaderSection.Alignment := taCenter;
HeaderSection.Text := '';
HeaderSection := HeaderControl.Sections.Add;
HeaderSection.Width := ClientWidth div 3;
HeaderSection.Alignment := taCenter;
HeaderSection.Text := 'Компоненты';
HeaderSection := HeaderControl.Sections.Add;
HeaderSection.Width := ClientWidth div 3;
HeaderSection.Alignment := taCenter;
HeaderSection.Text := 'Размер компонента';
#else
HeaderHandle := CreateWindowEx(0, WC_HEADER, '', WS_VISIBLE or WS_CHILD or WS_DISABLED, 0, 0, ClientWidth, MinItemHeight, Handle, 0, 0, 0);
if HeaderHandle = 0 then Exit;
SendMessage(HeaderHandle, WM_SETFONT, Font.Handle, 1);
HDItem.Mask := HDI_WIDTH or HDI_TEXT or HDI_FORMAT;
HDItem.cxy := ClientWidth div 3;
HDItem.fmt := HDF_CENTER or HDF_STRING;
HDItem.pszText := '';
SendMessageHDItem(HeaderHandle, HDM_INSERTITEM, 0, HDItem);
HDItem.pszText := 'Компоненты';
SendMessageHDItem(HeaderHandle, HDM_INSERTITEM, 1, HDItem);
HDItem.pszText := 'Размер компонента';
SendMessageHDItem(HeaderHandle, HDM_INSERTITEM, 2, HDItem);
#endif
end;
end;

procedure InitializeWizard;
begin
CreateHeader;
end;

procedure DeinitializeSetup;
begin
#ifndef IS_ENHANCED
if HeaderHandle <> 0 then
DestroyWindow(HeaderHandle);
#endif
end;

Sotonisto
15-06-2018, 03:57
El Sanchez, скрипт для ComponentsList работает, но название колонок скрывает первый компонент. Каким образом можно разместить название колонок до первого компонента? Или же сделать отступ определенного размера перед списком компонентов?

El Sanchez
15-06-2018, 14:37
скрипт для ComponentsList работает, но название колонок скрывает первый компонент. »
Sotonisto, точно, еще и стирается при нажатии на первый компонент. Вот вариант на расширенной версии, где заголовок рисуется на неклиентской части ComponentsList:

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
type
TNCCalcSizeParams = record
rgrc0: TRect;
rgrc1: TRect;
rgrc2: TRect;
end;

// Shell Functions
function SetWindowSubclass(hWnd: HWND; pfnSubclass: Longint; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): BOOL; external 'SetWindowSubclass@comctl32.dll stdcall';
function RemoveWindowSubclass(hWnd: HWND; pfnSubclass: Longint; uIdSubclass: UINT_PTR): BOOL; external 'RemoveWindowSubclass@comctl32.dll stdcall';
function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint): Longint; external 'DefSubclassProc@comctl32.dll stdcall';
// Run-Time Library (RTL) Routines
function ReadNCCalcSizeParams(out Destination: TNCCalcSizeParams; const Source: LongWord; len: Integer): Integer; external 'RtlMoveMemory@kernel32.dll stdcall';
// Debugging Functions
function WriteNCCalcSizeParams(hProcess: THandle; lpBaseAddress: Longint; var lpBuffer: TNCCalcSizeParams; nSize: DWORD; out lpNumberOfBytesWritten: DWORD): BOOL; external 'WriteProcessMemory@kernel32.dll stdcall';
// Process and Thread Functions
function GetCurrentProcess: THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
// Device Context Functions
function GetDCEx(hWnd: HWND; hrgnClip: THandle; flags: DWORD): THandle; external 'GetDCEx@user32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: THandle): Integer; external 'ReleaseDC@user32.dll stdcall';
// Painting and Drawing Functions
function GetWindowDC(hWnd: HWND): THandle; external 'GetWindowDC@user32.dll stdcall';
// Window Functions
function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall';
function SetWindowPos(hWnd, hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';

const
WM_NCCALCSIZE = $0083;
WM_NCPAINT = $0085;

SWP_NOSIZE = 1;
SWP_NOMOVE = 2;
SWP_NOZORDER = 4;
SWP_FRAMECHANGED = $20;
SWP_NOOWNERZORDER = $200;

DCX_WINDOW = 1;
DCX_CACHE = 2;
DCX_INTERSECTRGN = $80;
DCX_USESTYLE = $10000;
DCX_KEEPCLIPRGN = $40000;

var
PCheckListBoxWndProc: LongWord;
HeaderControl: THeaderControl;

function CheckListBoxWndProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): LongWord;
var
DC: THandle;
NCCalcSizeParams: TNCCalcSizeParams;
NumberOfBytesWritten: DWORD;
P: TPoint;
R: TRect;
begin
case uMsg of
WM_NCCALCSIZE:
begin
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
ReadNCCalcSizeParams(NCCalcSizeParams, lParam, SizeOf(NCCalcSizeParams));
NCCalcSizeParams.rgrc0.Top := NCCalcSizeParams.rgrc0.Top + HeaderControl.Height;
WriteNCCalcSizeParams(GetCurrentProcess, lParam, NCCalcSizeParams, SizeOf(NCCalcSizeParams), NumberOfBytesWritten);
end;
WM_NCPAINT:
begin
if (wParam <> 0) and (wParam <> 1) then
DC := GetDCEx(hWnd, wParam, DCX_WINDOW or DCX_CACHE or DCX_INTERSECTRGN or DCX_KEEPCLIPRGN or DCX_USESTYLE)
else
DC := GetWindowDC(hWnd);
try
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
GetWindowRect(hWnd, R);
P.x := 0;
P.y := -HeaderControl.Height;
P := HeaderControl.ClientToScreen(P);
HeaderControl.PaintTo(DC, P.x - R.Left, P.y - R.Top);
finally
ReleaseDC(hWnd, DC);
end;
end;
else
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
end;
end;

procedure CreateHeader;
var
HeaderSection: THeaderSection;
begin
with WizardForm.ComponentsList do
begin
HeaderControl := THeaderControl.Create(WizardForm);
HeaderControl.Parent := WizardForm.ComponentsList;
HeaderControl.Enabled := False;
HeaderSection := HeaderControl.Sections.Add;
HeaderSection.Width := ClientWidth div 3;
HeaderSection.Alignment := taCenter;
HeaderSection.Text := '';
HeaderSection := HeaderControl.Sections.Add;
HeaderSection.Width := ClientWidth div 3;
HeaderSection.Alignment := taCenter;
HeaderSection.Text := 'Компоненты';
HeaderSection := HeaderControl.Sections.Add;
HeaderSection.Width := ClientWidth div 3;
HeaderSection.Alignment := taCenter;
HeaderSection.Text := 'Размер компонента';

// sublass
PCheckListBoxWndProc := CallbackAddr('CheckListBoxWndProc');
SetWindowSubclass(Handle, PCheckListBoxWndProc, 0, 0);
// send WM_NCCALCSIZE
SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOOWNERZORDER or SWP_NOSIZE or SWP_NOZORDER);
HeaderControl.Visible := False;
end;
end;

procedure InitializeWizard;
begin
CreateHeader;
end;

procedure DeinitializeSetup;
begin
if PCheckListBoxWndProc <> 0 then
RemoveWindowSubclass(WizardForm.ComponentsList.Handle, PCheckListBoxWndProc, 0);
end;

usermode
15-06-2018, 14:40
Всем привет! Есть код:


procedure RtlMoveMemory(Dest: string; Source: PAnsiChar; Len: Integer);
external 'RtlMoveMemory@kernel32.dll stdcall';

function LoadStringFromUTF16LEFile(FileName: string; var S: string): Boolean;
var
A: AnsiString;
begin
Result := LoadStringFromFile(FileName, A);
if Result then
begin
SetLength(S, Length(A) div 2);
RtlMoveMemory(S, A, Length(S) * 2);
{ Trim BOM, if any }
if (Length(S) >= 1) and (Ord(S[1]) = $FEFF) then
Delete(S, 1, 1);
end;
end;


Помогите переделать данную функцию для загрузки UTF-8 файла.

Сама задача решаема через перекодировки в скрипте ConvertString.iss, но в этом примере кода поменьше.

// еще одна задача
необходимо запустить юникодный батник через функцию Exec или ShellExec (или через api), чтобы внутренние команды выполнились, например, bat-ник с содержимым:

copy "c:\嗨 русский.txt" "c:\嗨 русский.txt.bak"

в самой Windows, если вставить данную строку в cmd, то, пусть она и не отобразит правильно имена файлов в окне (что не требуется), но зато выполнит операцию корректно с названиями файлов в Unicode кодировке.

как добиться этого в Inno, чтобы можно было выполнять юникодные батники?
(просьба при возможности сделать пример для стандартной версии IS)

Sotonisto
15-06-2018, 20:55
El Sanchez, у меня всё снова не как у людей. Вместо названий колонок отображается пустое место (зато с отступом). В первой версии скрипта все отображалось корректно. Я обнаружил, что причина проблемы в том, что у меня WizardForm является родительским элементом для ComponentsList (Parent:=WizardForm). Прошу у Вас помощи еще раз, подскажите что нужно изменить, чтобы колонки отображались.

El Sanchez
16-06-2018, 12:16
Я обнаружил, что причина проблемы в том, что у меня WizardForm является родительским элементом для ComponentsList (Parent:=WizardForm). »
Sotonisto, переместите строку HeaderControl.Visible := False; после SetWindowPos.

Coломoн Keйн
16-06-2018, 15:51
Здраствуйте. Подскажите, пожалуйста, как создать патч с помощью Inno Setup? Обыкновенный инсталятор непрактичен из-за своего веса. Вчера использовал софтинку Inno Setup XDELTA Patch Maker, но два факта огорчили меня сильно - во первых, файла два (exe и bin), не один, а во вторых, окно инсталла сильно упрощенно по сравнению с инсталлами от самого Inno Setup.
Грубо говоря, есть два архива - оригинальный и модифицированный. Надо, чтобы инсталл содержал только разницу между ними (патч-данные). Тогда он будет весить около всего 40 Мб, чего я и хочу добиться, но чтобы окно инсталла осталось неизменным.

habib2302
16-06-2018, 22:29
Coломoн Keйн, можете попробовать Mole`s Smart Version Patch Constructor

Coломoн Keйн
16-06-2018, 22:56
Coломoн Keйн, можете попробовать Mole`s Smart Version Patch Constructor »
Обязательно попробую. Спасибо за совет!

usermode
16-06-2018, 23:01
Coломoн Keйн, есть еще патчер Visual Patch от Indigo Rose, там патчи можно создать как мастер со страницами наподобие Inno Setup. А для создания автономного патча в ISXPM нужно убрать галку Create Launcher, если размер патча на выходе небольшой.

А чтобы самому включить в свой инсталлятор патч-файл и применить его при установке, это нужно консольные утилиты использовать, типа xdelta или jojodiff, разбираться, как они работают и использовать их в своем инсталляторе.

Coломoн Keйн
17-06-2018, 14:47
есть еще патчер Visual Patch от Indigo Rose »
Да вот сижу над ней, но после компиляции говорит, мол моя софтинка не найдена. Хз как исправить.
Mole`s Smart Version Patch Constructor »
инсталл просто отвратительный получился.

А чтобы самому включить в свой инсталлятор патч-файл и применить его при установке, это нужно консольные утилиты использовать, типа xdelta или jojodiff, разбираться, как они работают и использовать их в своем инсталляторе. »

Если не разберусь, обращусь. $$$

usermode
17-06-2018, 19:33
Если не разберусь, обращусь. $$$ »
Так а что там, вот, к примеру JojoDiff:
https://sourceforge.net/projects/jojodiff/
Для генерации патч-файла запустить из командной строки:

jdiff.exe -b "C:\original.file" "C:\modified.file" "C:\resultpatch.file"

а для применения, полученный файл с изменениями resultpatch.file включить в установку и после инсталляции выполнить в Exec или RunTask:
jptch.exe "C:\original.file" "C:\resultpatch.file" "C:\modified.file"
(естественно, с путями константами)

в итоге после установки указанный original.file будет пропатчен.
но для этого может понадобится манипуляция удаления старого файла с переименованием пропатченного файла в оригинальное имя стандартными средствами Inno.

А в ISXPM можно вообще сделать невидимый Silent патч без окна (или SilentForm - маленькая форма с индикатором прогресса выполнения, чтобы пользователю было понятно, что применяется обновление и ничего не зависло) с указанием параметров с путем для применения и запускать его из инсталлятора, вся информация есть в справке, в нем поддерживаются константы Inno Setup.
Просто когда нужно будет поставить апдейт с обновлением для сотни файлов, то делать вручную это не очень хорошая идея, поэтому создавалась данная программа, чтобы довести все до полного автоматизма.

Coломoн Keйн
17-06-2018, 20:41
Для генерации патч-файла запустить из командной строки:
jdiff.exe -b "C:\original.file" "C:\modified.file" "C:\resultpatch.file" »
Ого, спасибище! 3 дня мучаюсь уже. С этим моментом понятно, с остальными - как начну, будет ясно. Или не ясно. Я не профи в инно сетапе. В любом случае, спасибо!

Просто этот файл, по которому патч-данные делаются - единственный, который устанавливается. Можно как то сделать применение патч-данных к оригинальному файлу как раз в момент установки, не после нее? Или я уже слишком требовательный к инсталлятору? И да, я так понимаю, можно же скомбинировать все это дело с существующим скриптом, чтобы не терять его главных функций?

usermode
17-06-2018, 21:15
Можно как то сделать применение патч-данных к оригинальному файлу как раз в момент установки, не после нее? »
можно выполнить и перед установкой, можно как угодно в зависимости от алгоритма действий. но чтобы делать такие простейшие вещи, нужно время изучить хотя бы базово Inno Setup, опробовать примеры, почитать справку и руководства. все есть в шапке темы. а потом спрашивать, что именно не получается. ко всем модулям тоже нужно читать описания и мануалы, не лениться вобщем :)

Sotonisto
18-06-2018, 19:36
Доброго всем вечера.
Будьте добры, подскажите, как реализовать сплеш с использованием botva2? Попытался сделать так, но содержимое формы не отображается (хотя при ShowModal все отображалось корректно):
И еще один вопрос: существует ли способ выровнять текст по правому краю? Например, как размещение по центру при помощи taCenter.

ZVSRus
21-06-2018, 21:26
И еще один вопрос: существует ли способ выровнять текст по правому краю? Например, как размещение по центру при помощи taCenter.
Так не пойдёт?

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
Text1: TLabel;
Text2: TLabel;
Text3: TLabel;

procedure InitializeWizard();
begin
Text1 := TLabel.Create(WizardForm);
with Text1 do
begin
Parent := WizardForm.SelectDirPage;
Alignment := taRightJustify;
Caption := 'Текст справа';
Font.Color := clBlue;
Font.Height := -13;
Font.Name := 'Tahoma';
Font.Style := [fsBold, fsItalic];
SetBounds(ScaleX(0),ScaleY(120),ScaleX(417),ScaleY(16));
end;

Text2 := TLabel.Create(WizardForm);
with Text2 do
begin
Parent := WizardForm.SelectDirPage;
Alignment := taCenter;
Caption := 'Текст по центру';
Font.Color := clBlue;
Font.Height := -13;
Font.Name := 'Tahoma';
Font.Style := [fsBold, fsItalic];
SetBounds(ScaleX(0),ScaleY(140),ScaleX(417),ScaleY(16));
end;

Text3 := TLabel.Create(WizardForm);
with Text3 do
begin
Parent := WizardForm.SelectDirPage;
// Alignment := taLeftJustify;
Caption := 'Текст слева';
Font.Color := clBlue;
Font.Height := -13;
Font.Name := 'Tahoma';
Font.Style := [fsBold, fsItalic];
SetBounds(ScaleX(0),ScaleY(160),ScaleX(417),ScaleY(16));
end;
end;




© OSzone.net 2001-2012