Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9]

Ответить
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 9]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 06-06-2020
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:

Показать/скрыть: Ссылки на примеры скриптов:

Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;

  • RegExporter - Бесплатная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.3.0 [17.01.2015] - Скачать;



Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z
Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z
Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:09, 04-04-2018

 

Аватара для ROMKA-1977

Пользователь


Сообщения: 74
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось ROMKA-1977, 30-05-2018 в 09:58.


Отправлено: 09:29, 30-05-2018 | #41



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Сам скрипт

Отправлено: 16:42, 30-05-2018 | #42


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата ROMKA-1977:
Получилось но не совсем то. Поверх фонового изображения "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 получить. Ужас.

Отправлено: 10:08, 31-05-2018 | #43


Аватара для Sotonisto

Пользователь


Сообщения: 131
Благодарности: 16

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Большой шаг вперед, как правило, следствие хорошего пинка под зад.


Последний раз редактировалось Sotonisto, 13-06-2018 в 02:23.


Отправлено: 02:13, 13-06-2018 | #44


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата Sotonisto:
1. Как изменить цвет текста лицензионного соглашения? WizardForm.LicenseMemo.Font.Color не даёт никакого эффекта. »
Sotonisto, используйте rtf-файл
Цитата Sotonisto:
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;
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:04, 14-06-2018 | #45


Аватара для Sotonisto

Пользователь


Сообщения: 131
Благодарности: 16

Профиль | Сайт | Отправить PM | Цитировать


El Sanchez, скрипт для ComponentsList работает, но название колонок скрывает первый компонент. Каким образом можно разместить название колонок до первого компонента? Или же сделать отступ определенного размера перед списком компонентов?

-------
Большой шаг вперед, как правило, следствие хорошего пинка под зад.


Отправлено: 03:57, 15-06-2018 | #46


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата Sotonisto:
скрипт для 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;

Последний раз редактировалось El Sanchez, 16-06-2018 в 12:15. Причина: fix

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:37, 15-06-2018 | #47


Новый участник


Сообщения: 28
Благодарности: 9

Профиль | Отправить PM | Цитировать


Всем привет! Есть код:

Код: Выделить весь код
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)

Последний раз редактировалось usermode, 16-06-2018 в 11:31.


Отправлено: 14:40, 15-06-2018 | #48


Аватара для Sotonisto

Пользователь


Сообщения: 131
Благодарности: 16

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Большой шаг вперед, как правило, следствие хорошего пинка под зад.


Отправлено: 20:55, 15-06-2018 | #49


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата Sotonisto:
Я обнаружил, что причина проблемы в том, что у меня WizardForm является родительским элементом для ComponentsList (Parent:=WizardForm). »
Sotonisto, переместите строку HeaderControl.Visible := False; после SetWindowPos.
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:16, 16-06-2018 | #50



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 7] El Sanchez Автоматическая установка приложений 2499 02-02-2015 08:59
Скрипты Inno Setup. Помощь и советы [часть 6] El Sanchez Автоматическая установка приложений 2494 10-03-2014 11:51
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58




 
Переход