PDA

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


Страниц : 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

ZVSRus
16-11-2022, 09:59
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

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

[Files]
Source: "Image\ReadmeRu.rtf"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Image\ReadmeEn.rtf"; DestDir: "{tmp}"; Flags: dontcopy

Source: "Image\ReadmeRu.rtf"; DestDir: "{app}"; Check: LangRusCheck; Flags: ignoreversion
Source: "Image\ReadmeEn.rtf"; DestDir: "{app}"; Check: LangEngCheck; Flags: ignoreversion

Source: "{app}\Language\English.lng"; DestDir: "{app}\Language"; Check: LangEngCheck; Flags: ignoreversion
Source: "{app}\Language\Russian.lng"; DestDir: "{app}\Language"; Check: LangRusCheck; Flags: ignoreversion

[Code*]
var
LangRus : TNewRadioButton;
LangEng : TNewRadioButton;

function LangRusCheck: Boolean;
begin
Result:= LangRus.Checked;
end;

function LangEngCheck: Boolean;
begin
Result:= LangEng.Checked;
end;

procedure InitializeWizard();
begin
LangRus := TNewRadioButton.Create(WizardForm);
with LangRus do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0),ScaleY(120),ScaleX(60),ScaleY(17));
Caption := 'Русский';
Checked := True;
end;

LangEng := TNewRadioButton.Create(WizardForm);
with LangEng do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0),ScaleY(140),ScaleX(80),ScaleY(17));
Caption := 'Английский';
end;
end;

DA-Bro
16-11-2022, 11:47
ZVSRus, Спасибо! Код выше работает. Но не совсем то что нужно.

Надо чтобы по тихому молчком копировались файлы.
Запустил допустим я инталлятор и выбрал RU или EN фейс для дальнейшей установки.
И в зависимости от выбора языка установки по тихому копируются нужные файлы в соответствии выбранного языка.

Вот тут например копируется файл в зависимости от разрядности Check: "Такой то";

Source: "{app}\AlarmClock,1.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "Is64BitInstallMode"; Flags: ignoreversion
Source: "{app}\AlarmClock,2.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "not Is64BitInstallMode"; Flags: ignoreversion

И если я не ошибаюсь то должно вроде быть например Check: "Russian"; или Check: "English"; да хоть или Check: "Китайский"; если в выборе инсталлятора такой язык есть.

Как-то вот так:

Source: "{app}\AlarmClockEN.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "English"; Flags: ignoreversion
Source: "{app}\AlarmClockRU.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "Russian"; Flags: ignoreversion

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

ZVSRus
16-11-2022, 12:27
Надо чтобы по тихому молчком копировались файлы.
Запустил допустим я инталлятор и выбрал RU или EN фейс для дальнейшей установки.
И в зависимости от выбора языка установки по тихому копируются нужные файлы в соответствии выбранного языка.

Вопрос не совсем понятен. Запустил допустим я инталлятор и выбрал RU или EN фейс для дальнейшей установки.
И в зависимости от выбора языка установки по тихому копируются нужные файлы в соответствии выбранного языка. Это вы сейчас о чём. Если о секции [Languages], то эта секция служит для того чтобы видеть какой текст на всех страницах читать (русский человек будет читать на русском, англичанин на английском).

Source: "{app}\AlarmClock,1.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "Is64BitInstallMode"; Flags: ignoreversion
Source: "{app}\AlarmClock,2.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "not Is64BitInstallMode"; Flags: ignoreversion

Этот пример понятен, вы хотите чтобы у ReadmeRu или ReadmeEn в конечной папке не было приставки Ru или En? или как.

nik1967
16-11-2022, 12:27
DA-Bro,
[Setup]
AppName=Test
AppVersion=1.5
DefaultDirName={pf}\Test
DisableWelcomePage=False
OutputDir=.

[Languages]
Name: "RU"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "EN"; MessagesFile: "compiler:Default.isl"

[Files]
Source: "Image\ReadmeRu.rtf"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Image\ReadmeEn.rtf"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Image\ReadmeRu.rtf"; DestDir: "{app}"; Languages: RU; Flags: ignoreversion
Source: "Image\ReadmeEn.rtf"; DestDir: "{app}"; Languages: EN; Flags: ignoreversion
Source: "Language\Russian.lng"; DestDir: "{app}\Language"; Languages: RU; Flags: ignoreversion
Source: "Language\English.lng"; DestDir: "{app}\Language"; Languages: EN; Flags: ignoreversion
Есть три дополнительные параметры, которые могут использоваться во всех секциях, содержащих параметры. Это:

Languages
Список поддерживаемых языков, разделенных пробелами, которые указывают инсталлятору, к какому языку относится запись. Если пользователь выберет язык, указанный в этом списке, запись будет обработан (например, установится файл).

Запись без указанного параметра Languages всегда обрабатывается, если только другой параметр этого не запретит.

Кроме списка, можно использовать логические выражения. Для справки обратитесь к параметрам секций [Components] и [Tasks].

Например:
Languages: en nl

ZVSRus
16-11-2022, 12:33
nik1967
Хотя пардон, Languages: RU данная формулировка совсем из головы вылетела, или не внимательно понял вопрос.

DA-Bro
16-11-2022, 19:58
nik1967, Спасибо! Вот это у меня сработало как я и хотел. Вроде как раз то что искал.

Source: "{app}\*.*"; DestDir: "{app}"; Flags: ignoreversion

Source: "{app}\Language\Russian.lng"; DestDir: "{app}\Language"; Languages: ru; Flags: ignoreversion
Source: "{app}\Language\English.lng"; DestDir: "{app}\Language"; Languages: en; Flags: ignoreversion

А вот эти строчки не срабатывают.
То есть почему оба файла появляются в системной папке "Temp".

Source: "{tmp}\ReadmeRu.rtf"; DestDir: "{tmp}"; Languages: ru; Flags: dontcopy
Source: "{tmp}\ReadmeEn.rtf"; DestDir: "{tmp}"; Languages: en; Flags: dontcopy

В инсталляторе то все нормально, показывает "Описание программы" на каком языке и нужно.
Эти файлы ReadmeRu.rtf и ReadmeEn.rtf для справки описания программы в инсталляторе.
В папку с программой их не нужно копировать.

Нужны для этого кода:
http://forum.oszone.net/post-2996460-875.html

И когда я запускаю инсталлятор, выбираю Русский, появляется окно "Мастер установки".
Захожу в папку "C:\Users\Я\AppData\Local\Temp" и вижу это:

https://i.imgur.com/o8S5OFZ.png

Файла ReadmeEn.rtf по идее не должно там быть.
Может код их все сразу туда копирует. И параметры в "Source:" уже не сработают.

Как Вы говорили: если только другой параметр этого не запретит.

Не пойму где засада.

nik1967
16-11-2022, 20:53
DA-Bro, а тебе так важно, чтобы во временную папку копировался либо RU, либо EN? Всё равно ведь после установки эта папка удаляется. На твоём месте я бы забил на это.

procedure InitializeWizard();
begin
if ActiveLanguage='RU' then begin
ExtractTemporaryFile('ReadMeRu.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeRu.rtf', ReadmeRu);
end else
if ActiveLanguage='EN' then begin
ExtractTemporaryFile('ReadMeEn.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeEn.rtf', ReadmeEn);
end;
И ещё одна странность: почему ты из папки назначения (Source: "{app}\Language\Russian.lng"; ) копируешь в папку назначения же (DestDir: "{app}\Language"; )?

Vanadiy777
16-11-2022, 21:05
Не пойму где засада. »
DA-Bro,
В процедуре прописано извлечение сразу обоих файлов:
procedure InitializeWizard();
begin
ExtractTemporaryFile('ReadMeRu.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeRu.rtf', ReadmeRu);
ExtractTemporaryFile('ReadMeEn.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeEn.rtf', ReadmeEn);

DA-Bro
16-11-2022, 21:53
Vanadiy777, да чет попробовал, не выходит.

nik1967, да в принципе не критично конечно.
Просто глянул у некоторых репакеров так происходит. У них файл появляется один в соответствии RU / EN.
Подумал что также типа Languages: ru; обойдётся.

nik1967
16-11-2022, 22:02
DA-Bro,

[Setup]
AppName=Test
AppVersion=1.5
DefaultDirName={pf}\Test
DisableWelcomePage=False
OutputDir=.

[Languages]
Name: "RU"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "EN"; MessagesFile: "compiler:Default.isl"

[Files]
Source: "Image\ReadmeRu.rtf"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Image\ReadmeEn.rtf"; DestDir: "{tmp}"; Flags: dontcopy
//Source: "Language\Russian.lng"; DestDir: "{app}\Language"; Languages: RU; Flags: ignoreversion
//Source: "Language\English.lng"; DestDir: "{app}\Language"; Languages: EN; Flags: ignoreversion

[CustomMessages]
EN.text=More detailed
RU.text=Подробнее
EN.text1=Close
RU.text1=Закрыть
EN.text2=About the program
RU.text2=О программе
EN.text3=Website
RU.text3=Сайт

[code]
var
Flag: Boolean;
WebButton,AboutButton: TNewButton;
RichEditViewer: TRichEditViewer;
Readme: AnsiString;
r: integer;

procedure WebButtonOnClick(Sender: TObject);
begin
ShellExec('open', 'http://forum.oszone.net/post-2996351-870.html', '','', SW_SHOW, ewNoWait, r);
end;

procedure SettingHideShowOnClick(Sender: TObject);
begin
Wizardform.NextButton.Enabled := True;
if Flag = False then begin
RichEditViewer.Hide;
Flag:= True;
AboutButton.Caption := CustomMessage('text');
end else begin
RichEditViewer.Show;
Flag:= False;
AboutButton.Caption:= CustomMessage('text1');
Wizardform.NextButton.Enabled:= True;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpWelcome: begin
Wizardform.NextButton.Enabled:= False;
RichEditViewer.Hide;
AboutButton.Caption:= CustomMessage('text');
Flag:= True;
end;
end;
end;

procedure InitializeWizard();
begin
case ActiveLanguage of
'RU': begin
ExtractTemporaryFile('ReadMeRu.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeRu.rtf', Readme);
end;
'EN': begin
ExtractTemporaryFile('ReadMeEn.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeEn.rtf', Readme);
end;
end;

WebButton:= TNewButton.Create(WizardForm);
with WebButton do begin
Parent := WizardForm.WelcomePage;
SetBounds(ScaleX(42),ScaleY(250),ScaleX(80),ScaleY(23));
Caption := CustomMessage('text3');
WebButton.OnClick := @WebButtonOnClick;
end;

AboutButton:= TNewButton.Create(WizardForm);
with AboutButton do begin
AboutButton.SetBounds(ScaleX(42),ScaleY(280),ScaleX(80),ScaleY(23));
AboutButton.Caption:= CustomMessage('text');
AboutButton.ShowHint:= True;
AboutButton.Hint:= CustomMessage('text2');
AboutButton.OnClick:= @SettingHideShowOnClick;
AboutButton.Parent:= WizardForm.WelcomePage;
AboutButton.Cursor:= crHand;
Flag:= True;
end;

RichEditViewer:= TRichEditViewer.Create(WizardForm);
with RichEditViewer do begin
Parent:= WizardForm.WelcomePage;
SetBounds(ScaleX(164),ScaleY(0),ScaleX(333),ScaleY(314));
ScrollBars:= ssVertical;
ReadOnly:= True;
RTFText:= Readme;
end;
end;

DA-Bro
16-11-2022, 22:09
Немного "причесал" скрипт примера »

Чет у меня файлы Readme.rtf пропали. Ни в "Temp" нет ни одного.
И на кнопку "О программе" жму, там пусто.

nik1967
17-11-2022, 04:57
DA-Bro, а предыдущий скрипт работает? Сейчас скопировал скрипт из сообщения, работает. Не знаю, что у тебя не так.

DA-Bro
17-11-2022, 05:58
nik1967, понял где у меня косяк.

У меня было прописано:

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

Изменил на заглавные RU EN и всё нормально стало. Не знал что из-за верхнего-нижнего регистра такое может случиться.

В общем получилось как я и хотел. Лишнего файла Readme.rtf теперь нет. Спасибо!

А может подскажите с иконкой.
Я вот в справке увидел два варианта кода.

procedure NewIcon;
begin
var
Icon: TNewIcon;
begin
Icon := TNewIcon.Create; ///Support True Color
Icon.LoadFromFile(ExpandConstant('{tmp}\Icon.ico'));
Icon.Width := 16; ///Selected Icon Size (16x16 ; 32x32; 48x48 ......)
Icon.Height := 16; ///Default Size: 32x32
WizardForm.Icon.Handle := Icon.Handle;
end;

[Setup]
AppName=CheckFile
AppVerName=CheckFile
DefaultDirName={pf}\CheckFile
OutputDir=.
DirExistsWarning=no

[Files]
Source: icon.ico; DestDir: {tmp}; Flags: dontcopy

[Code]
function LoadImage(hInst: THandle; ImageName: PChar; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle; external 'LoadImageA@user32.dll stdcall delayload';

procedure InitializeWizard;
Begin
ExtractTemporaryFile('icon.ico');
SendMessage(WizardForm.Handle, $80, 0, LoadImage(0,ExpandConstant('{tmp}')+'\icon.ico',1,16,16,$1010));
end;;

Попробовал, не срабатывает у меня. Может там что-то поправить нужно.

Или может есть вариант какой, чтобы иконка бралась как-то из ресурса экзешника самой программы и там отображалась..

ZVSRus
17-11-2022, 08:59
А может подскажите с иконкой
[Setup]
SetupIconFile=Icon.ico

Из справки

[Setup]: SetupIconFile

Описание:
Определяет новую иконку для программы-инсталлятора. Этот файл должен быть расположен в исходной папке скрипта, если только для него не указан полный путь или нет приставки "compiler:" - в этом случае компилятор будет искать указанный файл в своем каталоге.

Эта директива не поддерживается в Windows 95/98/Me.

Например:
SetupIconFile=MyProgSetup.ico

DA-Bro
17-11-2022, 10:00
ZVSRus,
Я и иконки везде распихал и переименовывал их. Ничего не срабатывает. Ошибки Ошибки Ошибки.

Чет не то с этими скриптами "Иконка вверху слева". Чего-то не хватает.

ZVSRus
17-11-2022, 11:07
Чет не то с этими скриптами "Иконка вверху слева". Чего-то не хватает.
А я вам про скрипты ничего и не говорил.
Вам надо то одну строку SetupIconFile=Icon.ico прописать в секции [Setup]

[Setup]
SetupIconFile=Icon.ico

Если конечно речь идёт об иконке на верхнем бордюре, слева.

Vanadiy777
17-11-2022, 12:23
Или может есть вариант какой, чтобы иконка бралась как-то из ресурса экзешника самой программы и там отображалась.. »
DA-Bro,
Можно извлечь иконку из экзешника самой программы и положить ее рядом со скриптом.
Затем, как советует коллега ZVSRus,
[Setup]
SetupIconFile=Icon.ico


Чет не то с этими скриптами "Иконка вверху слева". Чего-то не хватает. »
А скрипты эти не работают... Может, устарели, или предназначены для расширенной версии...

DA-Bro
17-11-2022, 17:19
ZVSRus, да я так и прописывал. Не получается.

Vanadiy777, подскажите пожалуйста, где взять расширенную версию попробовать.
Вы сами чем компилируете?

Vanadiy777
17-11-2022, 17:35
где взять расширенную версию попробовать. »
DA-Bro,
Не знаю, никогда ей не пользовался, вроде как она уже давно не поддерживается...
Вы сами чем компилируете? »
Сам пользуюсь версиями 5.6.1, 6.0.5, 6.2.1, в зависимости от ситуации...

ZVSRus
17-11-2022, 17:37
ZVSRus, да я так и прописывал. Не получается.

Vanadiy777, подскажите пожалуйста, где взять расширенную версию попробовать.
Вы сами чем компилируете?


Я сижу на Inno Setup 5.5.1.ee2 Ultra Unicode

Я же вам написал
[Setup]
SetupIconFile=Icon.ico

И ни каких кодов не надо. Удали их. Для иконки что на верхнем бордюре слева есть стандартная директива SetupIconFile=Icon.ico
Покажи секцию [Setup] полностью.




© OSzone.net 2001-2012