|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 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 '[email protected] 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 '[email protected] stdcall';
function RemoveWindowSubclass(hWnd: HWND; pfnSubclass: Longint; uIdSubclass: UINT_PTR): BOOL; external '[email protected] stdcall';
function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint): Longint; external '[email protected] stdcall';
// Run-Time Library (RTL) Routines
function ReadNCCalcSizeParams(out Destination: TNCCalcSizeParams; const Source: LongWord; len: Integer): Integer; external '[email protected] stdcall';
// Debugging Functions
function WriteNCCalcSizeParams(hProcess: THandle; lpBaseAddress: Longint; var lpBuffer: TNCCalcSizeParams; nSize: DWORD; out lpNumberOfBytesWritten: DWORD): BOOL; external '[email protected] stdcall';
// Process and Thread Functions
function GetCurrentProcess: THandle; external '[email protected] stdcall';
// Device Context Functions
function GetDCEx(hWnd: HWND; hrgnClip: THandle; flags: DWORD): THandle; external '[email protected] stdcall';
function ReleaseDC(hWnd: HWND; hDC: THandle): Integer; external '[email protected] stdcall';
// Painting and Drawing Functions
function GetWindowDC(hWnd: HWND): THandle; external '[email protected] stdcall';
// Window Functions
function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; external '[email protected] stdcall';
function SetWindowPos(hWnd, hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external '[email protected] 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 '[email protected] 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 | |
|