Войти

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


Страниц : 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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Respin
06-10-2012, 08:03
Можно ли как-то обойти окно выбора языка при старте установщика, задав "насильно" устанавливаемый язык? »

Можно как-то "обощить" инсталлер на множество нерусских языков? если система русская - инсталлер выбирал русский язык (что собственно в секции Setup и указано), но если ОС любая кроме русской (китайская, корейская, бразильская etc) - то принудительно выбирался английский язык? естественно без окна выбора языка »

Вариант первый:
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[_Code]
type
LCID = LongInt;

function GetSystemDefaultLCID() : LCID; external 'GetSystemDefaultLCID@kernel32.dll stdcall';

procedure InitializeWizard();
begin
with WizardForm.WelcomeLabel1 do begin
if GetSystemDefaultLCID = 1049 then WizardForm.WelcomeLabel1.Caption:= 'По умолчанию' else WizardForm.WelcomeLabel1.Caption:= 'On Default';
end;
end;

Вариант второй:
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: "compiler:Languages\Russian.isl"; DestDir: {tmp}; Flags: dontcopy;
Source: "compiler:Languages\English.isl"; DestDir: {tmp}; Flags: dontcopy

[_Code]
type
LCID = LongInt;

var
LangFile: String;

function GetSystemDefaultLCID() : LCID; external 'GetSystemDefaultLCID@kernel32.dll stdcall';

function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\Russian.isl')) then ExtractTemporaryFile('Russian.isl');
if not FileExists(ExpandConstant('{tmp}\English.isl')) then ExtractTemporaryFile('English.isl');
Result:=True;
end;

procedure InitializeWizard();
begin
with WizardForm.WelcomeLabel1 do begin
if GetSystemDefaultLCID = 1049 then begin
LangFile:= ExpandConstant('{tmp}\Russian.isl');
WizardForm.WelcomeLabel1.Caption:= GetIniString('Messages', 'WelcomeLabel1', '', LangFile)
end else begin
LangFile:= ExpandConstant('{tmp}\English.isl');
WizardForm.WelcomeLabel1.Caption:= GetIniString('Messages', 'WelcomeLabel1', '', LangFile);
end;
end;
end;

P.S. Во втором варианте нужно создать INI-Файл, так как лейблы с ISL-Файла отображаются коряво (это так, для примера).

Gnom_aka_Lexander
06-10-2012, 09:26
Respin, так веселее, я думаю - зачем лишний раз обращаться к одному и томуже. если все надписи делать таким образом, то придется кучу времени потратить на оптимизацию, поэтому начинать нужно сразу.
var
LangFile: String;

function GetSystemDefaultLCID() : LCID; external 'GetSystemDefaultLCID@kernel32.dll stdcall';
function InitializeSetup:boolean;
var
lngF : String;
begin
if GetSystemDefaultLCID = 1049 then
lngF := 'Russian.isl';
else
lngF := 'English.isl';

LangFile:= ExpandConstant('{tmp}\'+lngF);
if not FileExists(LangFile) then ExtractTemporaryFile(lngF);
Result:=True;
end;

procedure InitializeWizard();
begin
with WizardForm do
begin
WelcomeLabel1.Caption:= GetIniString('Messages', 'WelcomeLabel1', '', LangFile); // и так для каждого статика и лейбела инсталла
WelcomeLabel2.Caption:= GetIniString('Messages', 'WelcomeLabel2', '', LangFile); // и так для каждого статика и лейбела инсталла
end;
end;

Respin
06-10-2012, 10:00
зачем лишний раз обращаться к одному и томуже. если все надписи делать таким образом, то придется кучу времени потратить на оптимизацию, поэтому начинать нужно сразу. »

Там уже у кого на сколько фантазии хватит. Вот только он будет читать c ISL-Файла: "Вас приветствует Мастер установки [name]"
"Программа установит [name/ver] на Ваш компьютер"...

Вообщем кто как хочет, пусть так и делает. Главное суть вопроса.

Gnom_aka_Lexander
06-10-2012, 10:11
Respin, да при чем тут фантазия? Запусти свой вариант с прописью для каждой надписи и просмотри на скорость его выполнения. в любом случае, единственный правильный вариант - тут (http://forum.oszone.net/post-2000255-1121.html). Любой другой способ ведет к потерям производительности и к совершенно ненужным телодвижениям - зачем писать километр кода, который будет отнимать процессорное время для того, что и так делается самим инсталлом, при указании ему пары параметров?

SatHan
06-10-2012, 17:15
SoftLine, не работает. что мне с этим делать?
подскажите что можно сделать чтобы подсказка плавала за курсором мыши в области компонента?

insombia
06-10-2012, 18:22
del

Raf-9600
06-10-2012, 20:39
Можно как-то "обощить" инсталлер на множество нерусских языков? если система русская - инсталлер выбирал русский язык (что собственно в секции Setup и указано), но если ОС любая кроме русской (китайская, корейская, бразильская etc) - то принудительно выбирался английский язык? естественно без окна выбора языка »
Если можно, я покритикую такой подход.
Есть множество украинцев устанавливающих украиноязычную винду, и я уверен, что подавляющее большинство из них русский понимают гораздо лучше, чем английский.

R.i.m.s.k.y.
06-10-2012, 21:41
Raf-9600, здровую критику воспринимаю здраво. Так бы я и рассудил и оставил выбор языка руками.
Но пришлось делать одном скрипте два инсталлера (разный набор компонентов): один рус/англ с выбором, и один рус/англ-автомат без выбора языка.
"Автомат"предназначался для non-exUUSR и вообще отправился в Южную Омеригу на бета-тест :) (http://www.svp-team.com/)
Релизов это не касается

insombia
07-10-2012, 10:52
как сделать чтобы при выборе русского языка в реестр вписывался русский язык,а при английском английский?

R.i.m.s.k.y.
07-10-2012, 10:59
insombia,
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl;
Name: english; MessagesFile: compiler:Languages\English.isl;

[Registry]
Languages: russian; Root: HKCU; SubKey: твой ключ реестра для русского
Languages: english; Root: HKCU; SubKey: твой ключ реестра для собачьего

Dark_Delphin
07-10-2012, 21:38
Всем привет.

Дайте пожалуйста пример Сплэш картинки png для скрипта.

Заранее благодарен.

SoulSide
08-10-2012, 00:40
Дайте пожалуйста пример Сплэш картинки png для скрипта. »

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program

[Files]
Source: isgsg.dll; DestDir: {tmp}; Flags: dontcopy nocompression
Source: splash.png; DestDir: {tmp}; Flags: dontcopy nocompression

[*Code]
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

procedure Splash();
begin
ExtractTemporaryFile('Splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False, $FFFFFF,10);
end;

procedure InitializeWizard();
begin
Splash();
end;

insombia
08-10-2012, 16:49
как называется флаг для компонентов что его можно снять и поставить(галочка)

R.i.m.s.k.y.
08-10-2012, 16:55
insombia,
WizardForm.ComponentsList.Checked[N] := True - выбрать компонент номер N
WizardForm.ComponentsList.ItemEnabled[N] := False - сделатьк компонент номер N неактивным (будет засвечен и недоступен для выбора)

insombia
08-10-2012, 19:03
R.i.m.s.k.y. а по проще можно?типа как Flags: Exclusive

R.i.m.s.k.y.
08-10-2012, 19:16
insombia,

Flags
This parameter is a set of extra options. Multiple options may be used by separating them by spaces. The following options are supported:

checkablealone
Specifies that the component can be checked when none of its children are. By default, if no Components parameter directly references the component, unchecking all of the component's children will cause the component to become unchecked.

dontinheritcheck
Specifies that the component should not automatically become checked when its parent is checked. Has no effect on top-level components, and cannot be combined with the exclusive flag.

exclusive
Instructs Setup that this component is mutually exclusive with sibling components that also have the exclusive flag.

fixed
Instructs Setup that this component can not be manually selected or unselected by the end user during installation.

restart
Instructs Setup to ask the user to restart the system if this component is installed, regardless of whether this is necessary (for example because of [Files] section entries with the restartreplace flag). Like AlwaysRestart but per component.

disablenouninstallwarning
Instructs Setup not to warn the user that this component will not be uninstalled after he/she deselected this component when it's already installed on his/her machine.
Depending on the complexity of your components, you can try to use the [InstallDelete] section and this flag to automatically 'uninstall' deselected components.

insombia
08-10-2012, 19:16
нашел disablenouninstallwarning называется

R.i.m.s.k.y.
08-10-2012, 19:19
как называется флаг для компонентов что его можно снять и поставить(галочка) »
нашел disablenouninstallwarning называется »
http://bm.img.com.ua/img/prikol/images/large/6/6/160166.jpg

insombia
08-10-2012, 20:04
ой checkablealone,перепутал

Johny777
09-10-2012, 19:36
Gnom_aka_Lexander, El Sanchez, ваши выкатывающиеся панели очень классные, но есть один недостаток - после завершения таймера не выгружается оперативка
те после каждого выката прибавляется по 4кб при закате по 4 = 8кб на один закат/выкат


поэтому я прикинул создать похожий код без использования таймеров (на основе циклов с задержкой)
но проблема с закатом во время выката и наоборот
вот ранняя версия (пока что ещё примитивная)


[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[ Code]
var
SettingPanel : TPanel;
Flag : boolean;
Stop: boolean;


function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';

procedure Delay(dwMilliseconds: Longint);
var
iStart, iStop: DWORD;
begin
iStart := GetTickCount;
repeat
iStop := GetTickCount;
Application.ProcessMessages;
until (iStop - iStart) >= DWORD(dwMilliseconds);
end;

procedure Roll(Ctrl:TControl);
begin
if Ctrl.Top < 0 then
begin
repeat
Ctrl.Top := Ctrl.Top + ScaleY(1);
Delay(1);
if Stop then
begin
Stop := False;

Break;
Exit;
end;
until Ctrl.Top = 0;
Exit;
end;

if Ctrl.Top > -Ctrl.Height then
begin
repeat
Ctrl.Top := Ctrl.Top - ScaleY(1);
Delay(0);
if Stop then
begin
Stop := False;

Break;
Exit;
end;
until Ctrl.Top = -Ctrl.Height;
Exit;
end;
end;

procedure HideShow(Sender: TObject);
begin
Roll(SettingPanel);
end;



procedure InitializeWizard();
begin
Flag:= False;
Stop := False;

SettingPanel := TPanel.Create(WizardForm);
with SettingPanel do
begin
Parent := WizardForm;
SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
ParentBackground := False;
end;

with TButton.Create(WizardForm) do
begin
OnClick:= @HideShow;
SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
Caption:='Show';
Parent:= WizardForm;
end;
end;


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




© OSzone.net 2001-2012