Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: Diawer
Дата сообщения: 13.10.2008 10:19
Извиняюсь, мой косяк, всё работает отлично, не сменил в секции [Files] - Languages: на Check:
Спасибо. Но появился ещё вопрос, что бы по умолчанию был выбран язык в твоём коде относительно выбранного языка в самом начале.
Автор: YurCompMan2
Дата сообщения: 13.10.2008 11:46
Victor_Dobrov

http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=715&limit=1&m=1#1
Обнаружил проблему. При добавлении описания 288 компонента вылетает ошибка "runtime error (at 62:158)". Что мне делать?
Автор: Victor_Dobrov
Дата сообщения: 13.10.2008 12:11
YurCompMan2
Цитата:
Что мне делать?

У тебя так много компонентов? Тогда возможно с этим не справляется библиотека descctrl.dll (лимит - 255 символов на описание).
Автор: YurCompMan2
Дата сообщения: 13.10.2008 12:36
У меня их 332...
Как 255? 255 символов у меня заканчиваются намного раньше (если брать всю строку с . Здесь именно проблема в 288 строке наблюдается, вне зависимости от её длины или длины предшествующих.

Добавлено:
Скачал с китайского официального сайта эту dll с примером. Почти та же проблема, ошибка только вылетает сразу при запуске (там сделано как в NSIS, описание справа).
В общем, проблема, значит, в descctrl.dll.

Есть идеи, как выйти из ситуации сиёй?

Добавлено:
Может, можно сделать использование второго descctrl.dll, к примеру, descctrl_.dll, и использовать её для описания компонентов после 287го?
Автор: Victor_Dobrov
Дата сообщения: 13.10.2008 12:57
YurCompMan2

Конкретного скрипта нет, но вот здесь есть расширенная версия Inno Setup, в которой можно делать описания компонентов без использования descctrl.dll.

P.S. а ты уверен, что юзер дойдёт хотя бы до сотого описания?
Автор: YurCompMan2
Дата сообщения: 13.10.2008 13:12
Victor_Dobrov

Я ведь дошёл...

Добавлено:
Не подскажете, что где там есть ссылки на скачку? Истоии версий есть, а ссылки не могу найти.

Добавлено:
Скачал 2 дополнения.
В одном нашёл, как сделать + и - в списке компонентов. Есть пример ручного создания практически точной копии выбора компонентов NSIS.
В другом сам компилер стал круче, но примера нет, не знаю, что делать.
Автор: Victor_Dobrov
Дата сообщения: 13.10.2008 15:09
YurCompMan2 - вот [more=пример]
; только для расширенной сборки Inno Setup by ResTools

[Setup]
AppName=Components Descriptions
AppVerName=Components Descriptions
CreateAppDir=false

[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl

[Types]
Name: tweak; Description: Оптимальный выбор
Name: full; Description: Выбрать все компоненты
Name: deselect; Description: Сбросить все компоненты
Name: custom; Description: Пользовательский режим; Flags: iscustom

[Components]
Name: Safe; Description: Параметры безопасности; Types: deselect
Name: Safe\wscsvc; Description: Отключить 'Центр обеспечения безопасности'; Types: full tweak
Name: Safe\Signing; Description: Разрешить установку неподписанных драйверов; Types: full
Name: WB; Description: 'Мой компьютер' - Настройки; Types: deselect
Name: WB\Computer; Description: Добавить ярлыки - Корзина, Сетевые подключения; Types: full tweak
Name: WB\Low; Description: Уведомление о недостатке свободного места на диске
Name: WB\Low\1; Description: Изменить порог срабатывания с 10 % до 1%; Flags: exclusive; Types: tweak
Name: WB\Low\No; Description: Не предупреждать о переполнении дисков; Flags: exclusive; Types: full
Name: IE; Description: Настройки обозревателя Internet Explorer; Types: deselect
Name: IE\Cache; Description: Временные файлы Internet - использовать сжатие; Types: full tweak
Name: User; Description: Параметры входа в систему
Name: User\Logon; Description: Пользователи - использовать страницу приветствия; Flags: exclusive; Types: full
Name: User\Logon2K; Description: Классический вид - выводить запрос имени и пароля; Flags: exclusive; Types: tweak
Name: User\Autologon; Description: Задействовать автоматический вход в систему; Types: full tweak
Name: User\Sound; Description: Не сопровождать звуком загрузку и завершение работы; Types: full
Name: User\English; Description: Английский язык ввода по умолчанию для всех; Types: full
Name: Sys; Description: Настройки системы и оборудования; Types: deselect
Name: Sys\Memory; Description: Память - оптимизировать работу ядра Windows
Name: Sys\Memory\1024; Description: 1024Мб физической памяти на этом компьютере; Flags: exclusive
Name: Sys\Timeout; Description: Разрешить быстрое завершение работы; Types: full tweak

[Code]
var HintLock: Boolean; Point: TPoint; CompDesc: TEdit; MessageForm: TForm; MessagePanel: TPanel; MessageLabel: TLabel; n, frame: integer; CompUpKey: Boolean; Descriptions: String; CompHints: array of String;

procedure GetCursorPos(var Point: TPoint); external 'GetCursorPos@user32 stdcall delayload';
function SetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, wFlags: Longint):Boolean; external 'SetWindowPos@user32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32 stdcall delayload';
function DrawIconEx(hdc, x, y, hIcon, cx, cy, AniCur, Draw, Flags: Longint): Longint; external 'DrawIconEx@user32 stdcall delayload';
function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32 stdcall delayload';

Procedure DrawIcon(Form: TWinControl; File: String; nIcon, Left, Top, Size, BColor: Integer); var Panel: TPanel; Rect: TRect; Begin
Panel:= TPanel.Create(Form); Panel.SetBounds(Left, Top, Size, Size); Panel.Parent:= Form
with TBitmapImage.Create(Panel) do begin Parent:= Panel; with Bitmap do begin
Width:= Size; Height:= Size; Rect.Right:= Size; Rect.Bottom:= Size; Canvas.Brush.Color:= BColor; Canvas.FillRect(Rect);
DrawIconEx(Canvas.Handle, 0,0, ExtractIcon(GetModuleHandle(0), ExpandConstant(File), nIcon), Size, Size,0,0,3); end; end;
End;

Function StringToArray(Text, Cut: String): array of String; var t, i, k: Integer; Begin    { создать массив из текста}
SetArrayLength(Result, 0);
Repeat SetArrayLength(Result, GetArrayLength(Result) + 1); t:= 1; k:= Pos(Cut, Text);
if k > 0 then t:= Length(Cut) else k:= Pos(#10, Text); i:= GetArrayLength(Result) - 1;
if k > 0 then begin Result[i]:= Copy(Text, 1, k - 1); Text:= Copy(Text, k + t, Length(Text)) end else begin Result[i]:= Text; SetLength(Text, 0) end;
Until Length(Text) = 0;
End;

Procedure ResizeLabel(Obj: TLabel; Text: String; MaxWidth: Integer); var k, w, h: integer; Begin { размер формы подгоняется под текст}
Obj.AutoSize:= true; Obj.WordWrap:= false; Obj.Caption:= Text; { авторазмер}
w:= Obj.Width; h:= Obj.Height; n:= (w + frame*2)/MaxWidth + 1
Repeat
Obj.Width:= w/n + frame*2*n + k
Obj.Height:= h * n
Obj.WordWrap:= true; k:= k + 4
Until Obj.Height/h = n
End;

Procedure ShowHint(String: string; AIndex: Integer; XCenter, YCenter: Bool); Begin { размер формы подгоняется под текст, если AIndex = 0, значок не рисуется}
    HintLock:= true; frame:= 10; if AIndex <> 0 then String:= ' '+ String;
GetCursorPos(Point); MessageLabel.Left:= frame; MessageLabel.Top:= frame
ResizeLabel(MessageLabel, String, WizardForm.ClientWidth)
if XCenter then Point.X:= WizardForm.Left + WizardForm.Width/2 - (MessageLabel.Width + frame*2 -2)/2 else Point.X:= Point.X + 12;
if YCenter then Point.Y:= WizardForm.Top + WizardForm.BeveledLabel.Top else Point.Y:= Point.Y + 12;
MessageForm.SetBounds(Point.X, Point.Y, MessageLabel.Width + frame*2 -2, MessageLabel.Height + frame*2 -2)
if AIndex <> 0 then DrawIcon(MessageForm, '{sys}\shell32.dll', AIndex, 9, 8, 16, MessagePanel.Color);
MessageForm.Show; SetWindowPos(MessageForm.Handle, -1, 0, 0, 0, 0, 3);
End;

Procedure CompKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); Begin
CompUpKey:= true
n:= WizardForm.ComponentsList.ItemIndex
if n >= 0 then ShowHint(CompHints[n], -1001, true, true) else MessageForm.Hide;
End;

Procedure CompMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
Begin
    if (Index < 0) or (Index + 1 > GetArrayLength(CompHints)) then begin MessageForm.Visible:= false; Exit; end;
    if HintLock then HintLock:= false else if Index < 0 then MessageForm.Hide else ShowHint(CompHints[Index], -1001, true, false)
End;

Procedure ObjectOnClick(Sender: TObject);
Begin
Case TObject(Sender) of { событие объекта}
CompDesc:
if CompDesc.Text > '' then
if CompUpKey then CompUpKey:= false else ShowHint(CompDesc.Text, -1001, false, false)
else MessageForm.Hide;
MessageForm:
WizardForm.BringToFront;
end;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if CurPageID <> wpSelectComponents then MessageForm.Hide;
End;

Procedure InitializeWizard;
Begin
CompDesc:= TEdit.Create(WizardForm)
CompDesc.Parent:= WizardForm
CompDesc.Visible:= false
CompDesc.OnChange:= @ObjectOnClick
MessageForm:= CreateCustomForm;
MessageForm.BorderStyle:= bsNone
MessageForm.OnActivate:= @ObjectOnClick
MessagePanel:= TPanel.Create(MessageForm)
MessagePanel.BevelInner:= bvLowered;
MessagePanel.Align:= alClient;
MessagePanel.Color:= $E1FFFF;
MessagePanel.Parent:= MessageForm
MessageLabel:= TLabel.Create(MessagePanel)
MessageLabel.Transparent:= true
MessageLabel.Font.Name:= 'Arial'
MessageLabel.Font.Size:= WizardForm.Font.Size + 1
MessageLabel.Parent:= MessagePanel
WizardForm.ComponentsList.OnKeyUp:= @CompKeyUp
Descriptions:=
'Демонстрационный режим. Действия по изменению настроек системы или параметров безопасности не выполняются. Компоненты и их описания даны только для примера. Описания отделяются друг от друга точкой с запятой и должны содержать не более 255 символов.;' +
'Отключить «Центр обеспечения безопасности» (рекомендуется отключить эту практически бесполезную службу);' +
'Разрешить установку неподписанных драйверов (упрощает настройку компьютера сразу после установки системы);' +
'«Мой компьютер» - Секция настроек, влияющих на работу компьютера;' +
'ярлыки Корзина и Сетевые подключения будут созданы в папке «Мой компьютер»;' +
'Изменить порог срабатывание уведомления о недостатке свободного места на диске;' +
'Изменить порог срабатывания с 10 % (значение по-умолчанию) до 1% (необходимо для дисков большой ёмкости);' +
'Выдача всплывающей подсказки о переполнении дисков будет отключена;' +
'Общие настройки обозревателя Internet Explorer;' +
'Папка временных файлов Internet Explorer будет сжата средствами файловой системы NTFS;' +
'Параметры входа в систему;' +
'Пользователи - использовать страницу приветствия (новый экран загрузки, появившийся в Windows XP);' +
'Классический вид - выводить запрос имени и пароля (экран загрузки, использующийся в Windows 2000);' +
'Задействовать автоматический вход в систему для текущего пользователя без запроса имени и пароля;' +
'Не сопровождать звуком загрузку и завершение работы (немного ускоряет загрузку «Рабочего стола»);' +
'Английский язык ввода по умолчанию для всех (для новых пользователей);' +
'Настройка системы на имеющийся объём оперативной памяти и процессорного кэша, оптимизация файловой подсистемы;' +
'После установке данной опции уменьшать объём оперативной памяти НЕЖЕЛАТЕЛЬНО;' +
'Вычисленный объём установленной физической памяти на этом компьютере;' +
'Разрешить быстрое завершение работы (сетевые соединения могут быть разорваны преждевременно)';
CompHints:= StringToArray(Descriptions,';')
    WizardForm.ComponentsList.OnItemMouseMove:= @CompMouseMove;
End;
[/more] использования свойства OnItemMouseMove из расширенной сборки Inno Setup от ResTools.
Автор: YurCompMan2
Дата сообщения: 13.10.2008 15:31
Victor_Dobrov

Огромное спасибо!
Есть небольшая неудобность, которая не наблюдалась с использованием dll: при перемещении курсора над компонентом подсказка обновляется много раз; а также подсказка не исчезает после перемещения курсора вправо или влево, что загораживает список компонентов.
Автор: Victor_Dobrov
Дата сообщения: 13.10.2008 16:29
YurCompMan2

Цитата:
при перемещении курсора над компонентом подсказка обновляется много раз; а также подсказка не исчезает после перемещения курсора вправо или влево, что загораживает список компонентов.

Я дал только пример для OnItemMouseMove. Всё остальное для твоего скрипта делай сам. Например [more=вот так]
; только для расширенной сборки Inno Setup by ResTools

[Setup]
AppName=Components Descriptions
AppVerName=Components Descriptions
CreateAppDir=false

[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl

[Types]
Name: tweak; Description: Оптимальный выбор
Name: full; Description: Выбрать все компоненты
Name: deselect; Description: Сбросить все компоненты
Name: custom; Description: Пользовательский режим; Flags: iscustom

[Components]
Name: Safe; Description: Параметры безопасности; Types: deselect
Name: Safe\wscsvc; Description: Отключить 'Центр обеспечения безопасности'; Types: full tweak
Name: Safe\Signing; Description: Разрешить установку неподписанных драйверов; Types: full
Name: WB; Description: 'Мой компьютер' - Настройки; Types: deselect
Name: WB\Computer; Description: Добавить ярлыки - Корзина, Сетевые подключения; Types: full tweak
Name: WB\Low; Description: Уведомление о недостатке свободного места на диске
Name: WB\Low\1; Description: Изменить порог срабатывания с 10 % до 1%; Flags: exclusive; Types: tweak
Name: WB\Low\No; Description: Не предупреждать о переполнении дисков; Flags: exclusive; Types: full
Name: IE; Description: Настройки обозревателя Internet Explorer; Types: deselect
Name: IE\Cache; Description: Временные файлы Internet - использовать сжатие; Types: full tweak
Name: User; Description: Параметры входа в систему
Name: User\Logon; Description: Пользователи - использовать страницу приветствия; Flags: exclusive; Types: full
Name: User\Logon2K; Description: Классический вид - выводить запрос имени и пароля; Flags: exclusive; Types: tweak
Name: User\Autologon; Description: Задействовать автоматический вход в систему; Types: full tweak
Name: User\Sound; Description: Не сопровождать звуком загрузку и завершение работы; Types: full
Name: User\English; Description: Английский язык ввода по умолчанию для всех; Types: full
Name: Sys; Description: Настройки системы и оборудования; Types: deselect
Name: Sys\Memory; Description: Память - оптимизировать работу ядра Windows
Name: Sys\Memory\1024; Description: 1024Мб физической памяти на этом компьютере; Flags: exclusive
Name: Sys\Timeout; Description: Разрешить быстрое завершение работы; Types: full tweak

[Code]
var HintLock: Boolean; Point: TPoint; CompDesc: TEdit; MessageForm: TForm; MessagePanel: TPanel; MessageLabel: TLabel; n, frame: integer; CompUpKey: Boolean; Descriptions: String; CompHints: array of String;

procedure GetCursorPos(var Point: TPoint); external 'GetCursorPos@user32 stdcall delayload';
function SetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, wFlags: Longint):Boolean; external 'SetWindowPos@user32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32 stdcall delayload';
function DrawIconEx(hdc, x, y, hIcon, cx, cy, AniCur, Draw, Flags: Longint): Longint; external 'DrawIconEx@user32 stdcall delayload';
function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32 stdcall delayload';

Procedure DrawIcon(Form: TWinControl; File: String; nIcon, Left, Top, Size, BColor: Integer); var Panel: TPanel; Rect: TRect; Begin
Panel:= TPanel.Create(Form); Panel.SetBounds(Left, Top, Size, Size); Panel.Parent:= Form
with TBitmapImage.Create(Panel) do begin Parent:= Panel; with Bitmap do begin
Width:= Size; Height:= Size; Rect.Right:= Size; Rect.Bottom:= Size; Canvas.Brush.Color:= BColor; Canvas.FillRect(Rect);
DrawIconEx(Canvas.Handle, 0,0, ExtractIcon(GetModuleHandle(0), ExpandConstant(File), nIcon), Size, Size,0,0,3); end; end;
End;

Function StringToArray(Text, Cut: String): array of String; var t, i, k: Integer; Begin    { создать массив из текста}
SetArrayLength(Result, 0);
Repeat SetArrayLength(Result, GetArrayLength(Result) + 1); t:= 1; k:= Pos(Cut, Text);
if k > 0 then t:= Length(Cut) else k:= Pos(#10, Text); i:= GetArrayLength(Result) - 1;
if k > 0 then begin Result[i]:= Copy(Text, 1, k - 1); Text:= Copy(Text, k + t, Length(Text)) end else begin Result[i]:= Text; SetLength(Text, 0) end;
Until Length(Text) = 0;
End;

Procedure ResizeLabel(Obj: TLabel; Text: String; MaxWidth: Integer); var k, w, h: integer; Begin { размер формы подгоняется под текст}
Obj.AutoSize:= true; Obj.WordWrap:= false; Obj.Caption:= Text; { авторазмер}
w:= Obj.Width; h:= Obj.Height; n:= (w + frame*2)/MaxWidth + 1
Repeat
Obj.Width:= w/n + frame*2*n + k
Obj.Height:= h * n
Obj.WordWrap:= true; k:= k + 4
Until Obj.Height/h = n
End;

Procedure ShowHint(String: string; AIndex: Integer; XCenter, YCenter: Bool); Begin { размер формы подгоняется под текст, если AIndex = 0, значок не рисуется}
    HintLock:= true; frame:= 10; if AIndex <> 0 then String:= ' '+ String;
GetCursorPos(Point); MessageLabel.Left:= frame; MessageLabel.Top:= frame
ResizeLabel(MessageLabel, String, WizardForm.ClientWidth)
if XCenter then Point.X:= WizardForm.Left + WizardForm.Width/2 - (MessageLabel.Width + frame*2 -2)/2 else Point.X:= Point.X + 12;
if YCenter then Point.Y:= WizardForm.Top + WizardForm.BeveledLabel.Top else Point.Y:= Point.Y + 12;
MessageForm.SetBounds(Point.X, Point.Y, MessageLabel.Width + frame*2 -2, MessageLabel.Height + frame*2 -2)
if AIndex <> 0 then DrawIcon(MessageForm, '{sys}\shell32.dll', AIndex, 9, 8, 16, MessagePanel.Color);
MessageForm.Show; SetWindowPos(MessageForm.Handle, -1, 0, 0, 0, 0, 3);
End;

Procedure CompKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); Begin
CompUpKey:= true
n:= WizardForm.ComponentsList.ItemIndex
if n >= 0 then ShowHint(CompHints[n], -1001, true, true) else MessageForm.Hide;
End;

Procedure CompMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
Begin
    if (Index < 0) or (Index + 1 > GetArrayLength(CompHints)) then CompDesc.Text:= '' else CompDesc.Text:= CompHints[Index]
End;

Procedure ObjectOnClick2(Sender: TObject);
Begin
MessageForm.Hide;
End;

Procedure ObjectOnClick(Sender: TObject);
Begin
Case TObject(Sender) of { событие объекта}
CompDesc:
if CompDesc.Text > '' then
if CompUpKey then CompUpKey:= false else ShowHint(CompDesc.Text, -1001, false, false)
else MessageForm.Hide;
// MessageForm: WizardForm.BringToFront;
end;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if CurPageID <> wpSelectComponents then MessageForm.Hide;
End;

Procedure InitializeWizard;
Begin
CompDesc:= TEdit.Create(WizardForm)
CompDesc.Parent:= WizardForm
CompDesc.Visible:= false
CompDesc.OnChange:= @ObjectOnClick
MessageForm:= CreateCustomForm;
MessageForm.BorderStyle:= bsNone
MessageForm.OnActivate:= @ObjectOnClick
MessagePanel:= TPanel.Create(MessageForm)
MessagePanel.BevelInner:= bvLowered;
MessagePanel.Align:= alClient;
MessagePanel.Color:= $E1FFFF;
MessagePanel.Parent:= MessageForm
MessageLabel:= TLabel.Create(MessagePanel)
MessageLabel.Font.Name:= 'Arial'
MessageLabel.Font.Size:= WizardForm.Font.Size + 1
MessageLabel.Parent:= MessagePanel
    MessageLabel.OnClick:= @ObjectOnClick2
WizardForm.ComponentsList.OnKeyUp:= @CompKeyUp
Descriptions:=
'Демонстрационный режим. Действия по изменению настроек системы или параметров безопасности не выполняются. Компоненты и их описания даны только для примера. Описания отделяются друг от друга точкой с запятой и должны содержать не более 255 символов.;' +
'Отключить «Центр обеспечения безопасности» (рекомендуется отключить эту практически бесполезную службу);' +
'Разрешить установку неподписанных драйверов (упрощает настройку компьютера сразу после установки системы);' +
'«Мой компьютер» - Секция настроек, влияющих на работу компьютера;' +
'ярлыки Корзина и Сетевые подключения будут созданы в папке «Мой компьютер»;' +
'Изменить порог срабатывание уведомления о недостатке свободного места на диске;' +
'Изменить порог срабатывания с 10 % (значение по-умолчанию) до 1% (необходимо для дисков большой ёмкости);' +
'Выдача всплывающей подсказки о переполнении дисков будет отключена;' +
'Общие настройки обозревателя Internet Explorer;' +
'Папка временных файлов Internet Explorer будет сжата средствами файловой системы NTFS;' +
'Параметры входа в систему;' +
'Пользователи - использовать страницу приветствия (новый экран загрузки, появившийся в Windows XP);' +
'Классический вид - выводить запрос имени и пароля (экран загрузки, использующийся в Windows 2000);' +
'Задействовать автоматический вход в систему для текущего пользователя без запроса имени и пароля;' +
'Не сопровождать звуком загрузку и завершение работы (немного ускоряет загрузку «Рабочего стола»);' +
'Английский язык ввода по умолчанию для всех (для новых пользователей);' +
'Настройка системы на имеющийся объём оперативной памяти и процессорного кэша, оптимизация файловой подсистемы;' +
'После установке данной опции уменьшать объём оперативной памяти НЕЖЕЛАТЕЛЬНО;' +
'Вычисленный объём установленной физической памяти на этом компьютере;' +
'Разрешить быстрое завершение работы (сетевые соединения могут быть разорваны преждевременно)';
CompHints:= StringToArray(Descriptions,';')
    WizardForm.ComponentsList.OnItemMouseMove:= @CompMouseMove;
End;
[/more].
Чтобы хинт исчезал, создай на WizardForm прозрачный TLabel и при наведении на него скрывай форму.
Автор: YurCompMan2
Дата сообщения: 13.10.2008 17:21
Ещё раз большое спасибо.

Добавлено:
Создать на WizardForm прозрачный TLabel? А как ему сделать координаты и какие они нужны? Помоги.
Автор: serg_aka_lain
Дата сообщения: 13.10.2008 17:56
Diawer

Цитата:
Но появился ещё вопрос, что бы по умолчанию был выбран язык в твоём коде относительно выбранного языка в самом начале.

Тут уже приводил пример использования функции ActiveLanguage
Автор: Mistique
Дата сообщения: 14.10.2008 07:26
Не подскажите в чем пробелма?
Есть установка корп. аськи...
Используется переменная для пути установки: {userappdata}.
При входе на терминальный сервак начал выдавать ошибку установки, которая связана с неправильным определением пути(лезет в каталог админа)...
то есть переменная должна быть:
{userappdata}=C:\Documents and Settings\ivanov
а лезет:
{userappdata}=C:\Documents and Settings\administrator

Не могу найти такой проблемы ни у кого...8(
Автор: Dimika
Дата сообщения: 14.10.2008 18:13
Привет!

Подскажите плз.
Никак не могу найти ключ/способ, чтобы после завершения установки и перезагрузки компьютера приложение запустилось.
Автор: serg_aka_lain
Дата сообщения: 14.10.2008 19:34
Dimika

Цитата:
Подскажите плз.
Никак не могу найти ключ/способ, чтобы после завершения установки и перезагрузки компьютера приложение запустилось.


Использовать этот ключ, для однократного запуска приложения.
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
Автор: mikutu
Дата сообщения: 15.10.2008 09:00
У меня возникло несколько вопросов по Corona Skin
1) Можно ли отключить подсчет места папок на вкладке система (просто если кто-то выберет например диск c:\ на котором занято например 20 Гб то этот процесс будет очень долгим и пользователь особено если он переключался на другие программы может подумать что инсталятор завис и завершить его через диспечер задач). Если на данный момент это не возможно может в следующих версиях сделать отключение этой опции или чтобы человек мог ее в любой момент прервать нажав например esc
2) Можно ли сделать если например не установлен netframework и есть проверка установлен ли он что бы выводилась кнопка установить netframework (конечно его дистрибутив будет внутри инсталятора) ии дальнейшая установка без него была бы не возможна.
Автор: Victor_Dobrov
Дата сообщения: 15.10.2008 11:20
mikutu

Цитата:
Corona Skin: можно ли отключить подсчет места папок на вкладке система (просто если кто-то выберет например диск c:\ на котором занято например 20 Гб то этот процесс будет очень долгим и пользователь особено если он переключался на другие программы может подумать что инсталятор завис

При показе сведений о системе подсчёт папок и так отключен, он начинается, если юзер установит чекбокс 'Объём папок'.
И если юзер это нажал, то подсчитывается только объём папок Temp и Temporary Internet Files, которые от размера диска не зависят. При этом сообщение 'Идёт подсчёт размера папок...' вовсе не говорит о том, что инстяллятор завис.

Цитата:
Можно ли сделать если например не установлен netframework и есть проверка установлен ли он что бы выводилась кнопка установить netframework

Это можно сделать стандартно: проверить реестр и создать чекбокс для запуска дистрибутива, который будет выбран, если ключ реестра отсутствует. Скриптов проверки netframework в этом топике множество.
Кнопка установки NetFramework будет нужна в очень редких случаях, поэтому я не считаю, что это необходимо в Corona Skin.
Автор: Diawer
Дата сообщения: 15.10.2008 13:03
serg_aka_lain
[more= Код][Setup]
AppName=MyProg
AppVerName=MyProg 1.0
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg

[Files]
Source: MyProgENG.exe; DestDir: {app}; DestName: MyProg.exe; Check: english;
Source: MyProgRUS.exe; DestDir: {app}; DestName: MyProg.exe; Check: russian;

[_Code]
var
RadioButton1, RadioButton2: TNewRadioButton;

function russian: Boolean;
begin
Result := RadioButton1.Checked;
end;

function english: Boolean;
begin
Result := RadioButton2.Checked;
end;

procedure InitializeWizard();
var
MsgStr: TNewStaticText;
begin
MsgStr := TNewStaticText.Create(WizardForm);
with MsgStr do
begin
Top := ScaleY(130);
Left := ScaleX(3);
Width := ScaleX(400);
AutoSize := False;
Caption := 'Выберите какой язык установить для MyProg:';
Parent := WizardForm.SelectDirPage;
end;

RadioButton1 := TNewRadioButton.Create(WizardForm);
with RadioButton1 do
begin
Top := ScaleY(150);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Русский';
if ActiveLanguage = 'russian' then
begin
Checked := True;
end;
Parent := WizardForm.SelectDirPage;
end;

RadioButton2 := TNewRadioButton.Create(WizardForm);
with RadioButton2 do
begin
Top := ScaleY(170);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Английский';
if ActiveLanguage = 'english' then
begin
Checked := True;
end;
Parent := WizardForm.SelectDirPage;
end;
end;

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
S: String;
begin
S := S + MemoDirInfo + NewLine + NewLine;
S := S + 'Выберите какой язык установить для MyProg:' + NewLine;
if RadioButton1.Checked then
begin
S := S + Space + 'Русский' + NewLine;
end else
begin
S := S + Space + 'Английский' + NewLine;
end;
S := S + NewLine + NewLine;
Result := S;
end;[/more] твой очень хороший и мне подходит, но есть косяк, я пробовал его убрать но не получилось, не отображаются список выбранных действий (после выполнения твоего кода) на самой последней странице (Все готово к установке) которая перед началом установки. Окно остается практически пустое. В чем там дело?

Автор: YurCompMan2
Дата сообщения: 15.10.2008 14:36
Victor_Dobrov

Я плохо понимаю принцип создания форм в паскале, помоги, пожалуйста, создать на WizardForm прозрачный TLabel, который будет скрываться при наведении на него.
Автор: Victor_Dobrov
Дата сообщения: 15.10.2008 15:08
YurCompMan2

Я не знаю, как сделать, чтобы список компонентов перекрывается TLabel со всех сторон. В скине это работает, а если в стандартном инсталляторе создать TLabel на WizardForm.InnerPage, то список будет перекрыт только слева.
Автор: serg_aka_lain
Дата сообщения: 15.10.2008 18:43
Diawer

Цитата:
но есть косяк, я пробовал его убрать но не получилось, не отображаются список выбранных действий


Нет там косяка, в функции "UpdateReadyMemo" все действия надо писать руками,
или не использовать эту функцию, но тогда в ней не будет отображена обработка "Russian - English".
Автор: Artem_Butenko
Дата сообщения: 16.10.2008 03:18
Ребята -- м.б. кто-нибудь встречал подобную проблему, когда при реализации скрипта абсолютно тихой установки, в конце инсталляции на секунду проскакивала страница прогресса установки (скрипт из рук. Kindly). И еще, можно ли (и как) заставить инсталлятор удаляться с жесткого диска в конце установки?
Автор: SotM
Дата сообщения: 16.10.2008 07:43

Цитата:
можно ли (и как) заставить инсталлятор удаляться с жесткого диска в конце установки?

Тут ведь уже поднимался вопрос по этому поводу. Какой смысл данного действия?
Автор: mikutu
Дата сообщения: 16.10.2008 09:16

Цитата:
При этом сообщение 'Идёт подсчёт размера папок...' вовсе не говорит о том, что инстяллятор завис.

просто если при подсчете места занимаемого папками переключатся на другие программы потом при возвращении в инсталятор будет просто белый экран (предполагаю от того что в данном случае не совсем правильно реализована многопоточность).

Еще вопрос при определении параметров системы для чего нужны права администратора просто если только для запуска всяких утилит (установка удаления программ и т.п.) не проще ли еще сделать упрощеный вариант только с выводом минимальных требований и текущей конфигурации компьютера
Автор: Diawer
Дата сообщения: 16.10.2008 10:07
, проверил еще раз, на чистом коде без лишнего, скомпиль его, я добавил секцию [Icons] и на странице где показываются выбранные пользователем действия перед установкой, ты не увидишь инфо. об иконке, как и обо всем, что еще может быть после. Показывается только путь куда прога устанавливается (потому- что она выполняется перед твоим кодом), потом инфо. из твоего "UpdateReadyMemo", а все что должно быть, после не отображается. [more=Попробуй][Setup]
AppName=MyProg
AppVerName=MyProg 1.0
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg
AllowNoIcons=yes
OutputBaseFilename=MyProg


[Files]
Source: compiler:license.txt; DestDir: {app}; DestName: MyProg.exe; Check: english;
Source: compiler:license.txt; DestDir: {app}; DestName: MyProg.exe; Check: russian;

[Icons]
Name: {group}\MyProg; Filename: {app}\MyProg.exe; WorkingDir: {app}
Name: {group}\Uninstall MyProg; Filename: {uninstallexe}; WorkingDir: {app}

[_Code]
var
RadioButton1, RadioButton2: TNewRadioButton;

function russian: Boolean;
begin
Result := RadioButton1.Checked;
end;

function english: Boolean;
begin
Result := RadioButton2.Checked;
end;

procedure InitializeWizard();
var
MsgStr: TNewStaticText;
begin
MsgStr := TNewStaticText.Create(WizardForm);
with MsgStr do
begin
Top := ScaleY(130);
Left := ScaleX(3);
Width := ScaleX(400);
AutoSize := False;
Caption := 'Выберите какой язык установить для MyProg:';
Parent := WizardForm.SelectDirPage;
end;

RadioButton1 := TNewRadioButton.Create(WizardForm);
with RadioButton1 do
begin
Top := ScaleY(150);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Русский';
if ActiveLanguage = 'russian' then
begin
Checked := True;
end;
Parent := WizardForm.SelectDirPage;
end;

RadioButton2 := TNewRadioButton.Create(WizardForm);
with RadioButton2 do
begin
Top := ScaleY(170);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Английский';
if ActiveLanguage = 'english' then
begin
Checked := True;
end;
Parent := WizardForm.SelectDirPage;
end;
end;

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
S: String; //сделать, чтобы отмеченные данные вносились на страницу wpReady
begin
S := S + MemoDirInfo + NewLine + NewLine;
S := S + 'Выберите какой язык установить для MyProg:' + NewLine;
if RadioButton1.Checked then
begin
S := S + Space + 'Русский' + NewLine;
end else
begin
S := S + Space + 'Английский' + NewLine;
end;
S := S + NewLine + NewLine;
Result := S;
end;[/more]


Добавлено:
serg_aka_lain
Можно, конечно убрать этот кусок, но если можно исправить, то будет здорово.
Автор: Artem_Butenko
Дата сообщения: 16.10.2008 11:55
SotM - смысл в этом есть! Например, инсталлятор упакован еще в SFX-архив WinRAR, который распаковывает его в C:\MyProgs. Откуда инсталлятор автоматически начинает работу. В конце работы исполняемый файл нужно удалить из C:\MyProgs, чтобы он не занимал место на HDD . Надеюсь, объяснил все доходчиво!
Автор: Victor_Dobrov
Дата сообщения: 16.10.2008 12:03
mikutu

Цитата:
если при подсчете места, занимаемого папками, переключатся на другие программы, то при возвращении в инсталятор будет просто белый экран

Видимо, это ограничение самого Inno Setup. Прерывание подсчёта объёма папок пока сделать не могу, может позже.

Цитата:
при определении параметров системы для чего нужны права администратора?

Проверяется параметр PrivilegesRequired секции Setup. Если при сборке были выставлены права администратора, а инсталлятор запущен из под ограниченной учётной записи, то пользователю нужно об этом сообщить, иначе установка может быть неполной.
Автор: boss911
Дата сообщения: 16.10.2008 17:26

Цитата:
Русская справка к версиям 5.0.x, автор перевода BagIra

Заметил, что справка уже немного устарела от текущей версии 5.2.3. Кто-то может перевесить текущую версию, хотя бы самые необходимые разделы?
Автор: serg_aka_lain
Дата сообщения: 16.10.2008 19:46
Diawer

Цитата:
но если можно исправить, то будет здорово.

-[more=Не вопрос]

[Setup]
AppName=MyProg
AppVerName=MyProg 1.0
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg
AllowNoIcons=yes
OutputBaseFilename=MyProg
ShowLanguageDialog=True

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl";
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl";

[Files]
Source: compiler:license.txt; DestDir: {app}; DestName: MyProg.exe; Check: english;
Source: compiler:license.txt; DestDir: {app}; DestName: MyProg.exe; Check: russian;

[Icons]
Name: {group}\MyProg; Filename: {app}\MyProg.exe; WorkingDir: {app}
Name: {group}\Uninstall MyProg; Filename: {uninstallexe}; WorkingDir: {app}

[Code]
var
RadioButton1, RadioButton2: TNewRadioButton;

function russian: Boolean;
begin
Result := RadioButton1.Checked;
end;

function english: Boolean;
begin
Result := RadioButton2.Checked;
end;

procedure InitializeWizard();
var
MsgStr: TNewStaticText;
begin
MsgStr := TNewStaticText.Create(WizardForm);
with MsgStr do
begin
Top := ScaleY(130);
Left := ScaleX(3);
Width := ScaleX(400);
AutoSize := False;
Caption := 'Выберите какой язык установить для MyProg:';
Parent := WizardForm.SelectDirPage;
end;

RadioButton1 := TNewRadioButton.Create(WizardForm);
with RadioButton1 do
begin
Top := ScaleY(150);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Русский';
Parent := WizardForm.SelectDirPage;
end;

RadioButton2 := TNewRadioButton.Create(WizardForm);
with RadioButton2 do
begin
Top := ScaleY(170);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Английский';
Parent := WizardForm.SelectDirPage;
end;

if ActiveLanguage = 'russian' then
begin
RadioButton1.Checked := True;
end else
begin
RadioButton2.Checked := True;
end;

end;

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
S: String;
begin
S := S + MemoDirInfo + NewLine + NewLine;

S := S + 'Выберите какой язык установить для MyProg:' + NewLine;
if RadioButton1.Checked then
begin
S := S + Space + 'Русский' + NewLine + NewLine;
end else
begin
S := S + Space + 'Английский' + NewLine + NewLine;
end;

if (WizardForm.NoIconsCheck.Checked) = False then
begin
S := S + MemoGroupInfo + NewLine + NewLine;
end;

Result := S;
end;

[/more]
Автор: Don_Juan
Дата сообщения: 16.10.2008 19:59
Подскажите, можно ли убрать сообщение, которое появляется когда недостаточно свободного места на диске? Или можно его изменить?
Автор: serg_aka_lain
Дата сообщения: 16.10.2008 21:45
Don_Juan

Цитата:
Подскажите, можно ли убрать сообщение, которое появляется когда недостаточно свободного места на диске? Или можно его изменить?

Изменить можно так
[Messages]
DiskSpaceWarning=Установка требует не менее .... Вы желаете тем не менее продолжить установку?
Отключить пока не знаю как,
Не понятен смысл сего действия

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.