|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9] |
|
|
Скрипты Inno Setup. Помощь и советы [часть 9]
|
|
Ветеран Сообщения: 1274 |
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Скрипты 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 |
|
Пользователь Сообщения: 77
|
Профиль | Отправить PM | Цитировать Цитата El Sanchez:
|
|
|
Последний раз редактировалось ROMKA-1977, 30-05-2018 в 09:58. Отправлено: 09:29, 30-05-2018 | #41 |
|
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать Добрый день, подскажите, возможно ли как-то прикрутить inno download plugin к скрипту "Opera"
чтоб прогресс скачивания нормально отображался перед распаковкой. Сам скрипт ссылка
|
|
Отправлено: 16:42, 30-05-2018 | #42 |
|
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать Цитата 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 |
|
Пользователь Сообщения: 131
|
Профиль | Сайт | Отправить PM | Цитировать Доброго времени суток. Будьте добры подскажите:
1. Как изменить цвет текста лицензионного соглашения? WizardForm.LicenseMemo.Font.Color не даёт никакого эффекта. 2. Существует ли способ разместить текст на Splash изображении? 3. Можно ли в WizardForm.ComponentsList добавить название колонок (как в таблицах)? По сути над списком чекбоксов должна размещаться линия, поделенная на 3 "колонки", такого вида: [ Пустая ячейка | Компоненты | Размер компонента]. |
|
------- Последний раз редактировалось Sotonisto, 13-06-2018 в 02:23. Отправлено: 02:13, 13-06-2018 | #44 |
|
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать Цитата Sotonisto:
Цитата 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 |
|
Пользователь Сообщения: 131
|
Профиль | Сайт | Отправить PM | Цитировать El Sanchez, скрипт для ComponentsList работает, но название колонок скрывает первый компонент. Каким образом можно разместить название колонок до первого компонента? Или же сделать отступ определенного размера перед списком компонентов?
|
|
------- Отправлено: 03:57, 15-06-2018 | #46 |
|
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать Цитата Sotonisto:
Скрытый текст
[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
|
Профиль | Отправить 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;
Сама задача решаема через перекодировки в скрипте 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 |
|
Пользователь Сообщения: 131
|
Профиль | Сайт | Отправить PM | Цитировать El Sanchez, у меня всё снова не как у людей. Вместо названий колонок отображается пустое место (зато с отступом). В первой версии скрипта все отображалось корректно. Я обнаружил, что причина проблемы в том, что у меня WizardForm является родительским элементом для ComponentsList (Parent:=WizardForm). Прошу у Вас помощи еще раз, подскажите что нужно изменить, чтобы колонки отображались.
|
|
------- Отправлено: 20:55, 15-06-2018 | #49 |
|
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать Цитата Sotonisto:
|
|
|
Отправлено: 12:16, 16-06-2018 | #50 |
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| Скрипты 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 | |
|