Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
Неадекватный
11-06-2012, 15:03
Привет всем!
Примеры смотрел, но это не то. Всё очень сложно. Код реализации xml большой и не понятный.
В общем задача такая
Имеется NetworkCfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<AllNetworkConfigs>
<NetworkConfig isNDIS="0" canbeDelete="1" isPreferred="1">
<ConfigFileName></ConfigFileName>
<UserName></UserName>
<Password></Password>
<LoginNumber></LoginNumber>
<AutoGetAPN>0</AutoGetAPN>
<APN></APN>
<AutoGetDNS>1</AutoGetDNS>
<MainDNS>0.0.0.0</MainDNS>
<StandbyDNS>0.0.0.0</StandbyDNS>
<AutoGetPDP>1</AutoGetPDP>
<PDPAddress>0.0.0.0</PDPAddress>
<PDPType>IP</PDPType>
<AuthType>PAP</AuthType>
<AskUserAndPwd>0</AskUserAndPwd>
<SaveUserAndPwd>0</SaveUserAndPwd>
</NetworkConfig>
</AllNetworkConfigs>
Пояснения к xml
<?xml version="1.0" encoding="UTF-8"?> - Создаётся по умолчанию;
<AllNetworkConfigs> - Создаётся по умолчанию;
<NetworkConfig isNDIS="0" canbeDelete="1" isPreferred="1"> - Создаётся по умолчанию;
<ConfigFileName></ConfigFileName> - Создаётся по умолчанию, но между <ConfigFileName></ConfigFileName> должно вводиться Название профиля; Например <ConfigFileName>MTS Internet</ConfigFileName>
<UserName></UserName> - Создаётся по умолчанию, но между <UserName></UserName> должно вводиться Имя пользователя; Например <UserName>MTS</UserName>
<Password></Password> - Создаётся по умолчанию, но между <Password></Password> должен вводиться Пароль; Например <Password>mts</Password>
<LoginNumber></LoginNumber> - Создаётся по умолчанию, но между <LoginNumber></LoginNumber> должен вводиться номер дозвона; Например <LoginNumber>*99***1#</LoginNumber>
<AutoGetAPN>0</AutoGetAPN> - Создаётся по умолчанию;
<APN></APN> - Создаётся по умолчанию, но между <APN></APN> должна вводиться Точка доступа; Например <APN>internet.mts.ru</APN>
<AutoGetDNS>1</AutoGetDNS> - Создаётся по умолчанию;
<MainDNS>0.0.0.0</MainDNS> - Создаётся по умолчанию;
<StandbyDNS>0.0.0.0</StandbyDNS> - Создаётся по умолчанию;
<AutoGetPDP>1</AutoGetPDP> - Создаётся по умолчанию;
<PDPAddress>0.0.0.0</PDPAddress> - Создаётся по умолчанию;
<PDPType>IP</PDPType> - Создаётся по умолчанию;
<AuthType>PAP</AuthType> - Создаётся по умолчанию;
<AskUserAndPwd>0</AskUserAndPwd> - Создаётся по умолчанию;
<SaveUserAndPwd>0</SaveUserAndPwd> - Создаётся по умолчанию;
</NetworkConfig> - Создаётся по умолчанию;
</AllNetworkConfigs> - Создаётся по умолчанию;
Если быть точнее, этот NetworkCfg.xml должен создаваться в папке программы, т.е %ProgramFiles%\Моё Программное Обеспечение.
То что в коде "но между XXX должно вводиться Название XXX; Например XXX" это должно работать в инсталляторе "вводиться в окошках"
Вот код
[Setup]
AppName=Моё Программное Обеспечение
AppVersion=1.5
;AppVerName=Моё Программное Обеспечение 1.5
DefaultDirName={pf}\Моё Программное Обеспечение
DefaultGroupName=Моё Программное Обеспечение
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Icons]
Name: "{group}\{cm:UninstallProgram,Моё Программное Обеспечение}"; Filename: "{uninstallexe}"
[CustomMessages]
Russian.Caption=Настройка профиля по умолчанию
Russian.Description=Настройте профиль в соответствии с вашим оператором
Russian.SettingsProfile=Настройка профиля
Russian.Operator=Оператор:
Russian.UserName=Имя пользователя:
Russian.Password=Пароль:
Russian.NumberDial=Номер набора:
Russian.APN=Точка доступа:
[*Code]
var
ISCustomPage1: TWizardPage;
NewGroupBox1: TNewGroupBox;
NewStaticText1: TNewStaticText;
NewEdit1: TNewEdit;
NewStaticText2: TNewStaticText;
NewEdit2: TNewEdit;
NewStaticText3: TNewStaticText;
NewEdit3: TNewEdit;
NewStaticText4: TNewStaticText;
NewEdit4: TNewEdit;
NewStaticText5: TNewStaticText;
NewEdit5: TNewEdit;
procedure RedesignWizardForm;
begin
ISCustomPage1 := CreateCustomPage(wpSelectDir, CustomMessage('Caption'), CustomMessage('Description'));
with ISCustomPage1.Surface do
begin
Name := 'ISCustomPage1';
end;
NewGroupBox1 := TNewGroupBox.Create(WizardForm);
with NewGroupBox1 do
begin
Name := 'NewGroupBox1';
Parent := ISCustomPage1.Surface;
Left := ScaleX(16);
Top := ScaleY(8);
Width := ScaleX(377);
Height := ScaleY(209);
Caption := CustomMessage('SettingsProfile');
end;
NewStaticText1 := TNewStaticText.Create(WizardForm);
with NewStaticText1 do
begin
Name := 'NewStaticText1';
Parent := NewGroupBox1;
Caption := CustomMessage('Operator');
Left := ScaleX(32);
Top := ScaleY(31);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit1 := TNewEdit.Create(WizardForm);
with NewEdit1 do
begin
Name := 'NewEdit1';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(28);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText2 := TNewStaticText.Create(WizardForm);
with NewStaticText2 do
begin
Name := 'NewStaticText2';
Parent := NewGroupBox1;
Caption := CustomMessage('UserName');
Left := ScaleX(32);
Top := ScaleY(57);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit2 := TNewEdit.Create(WizardForm);
with NewEdit2 do
begin
Name := 'NewEdit2';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(53);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText3 := TNewStaticText.Create(WizardForm);
with NewStaticText3 do
begin
Name := 'NewStaticText3';
Parent := NewGroupBox1;
Caption := CustomMessage('Password');
Left := ScaleX(32);
Top := ScaleY(80);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit3 := TNewEdit.Create(WizardForm);
with NewEdit3 do
begin
Name := 'NewEdit3';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(77);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText4 := TNewStaticText.Create(WizardForm);
with NewStaticText4 do
begin
Name := 'NewStaticText4';
Parent := NewGroupBox1;
Caption := CustomMessage('NumberDial');
Left := ScaleX(32);
Top := ScaleY(103);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit4 := TNewEdit.Create(WizardForm);
with NewEdit4 do
begin
Name := 'NewEdit4';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(100);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText5 := TNewStaticText.Create(WizardForm);
with NewStaticText5 do
begin
Name := 'NewStaticText5';
Parent := NewGroupBox1;
Caption := CustomMessage('APN');
Left := ScaleX(32);
Top := ScaleY(127);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit5 := TNewEdit.Create(WizardForm);
with NewEdit5 do
begin
Name := 'NewEdit5';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(124);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText1.TabOrder := 0;
NewEdit1.TabOrder := 1;
NewStaticText2.TabOrder := 2;
NewEdit2.TabOrder := 3;
NewStaticText3.TabOrder := 4;
NewEdit3.TabOrder := 5;
NewStaticText4.TabOrder := 6;
NewEdit4.TabOrder := 7;
NewStaticText5.TabOrder := 8;
NewEdit5.TabOrder := 9;
NewGroupBox1.TabOrder := 0;
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
end;
Как это реализовать?
Dark_Delphin
11-06-2012, 15:10
Всем привет)
Кто знает как сделать кнопочку "Язык инсталлятора"?
Скриншот:
http://i37.fastpic.ru/big/2012/0609/2f/5043e11831f51e6748b23bea3747cc2f.png
Johny777
11-06-2012, 16:14
как сделать кнопочку "Язык инсталлятора" »
вот пример
остальное сам допили
так NextButton.Caption := GetIniString('Messages', 'ButtonNext', '', ExpandConstant('{src}\Russian.ini'));
где Russian.ini это переименованный Russian.isl (для теста я его гружу снаружи, рядом с инсталлом, хоя в конечном итоге ему дорога в temp)
Messages это секция ини
ButtonNext это назвние ключа (в файле ButtonNext= )
можно было бы и не из ини брать, а напрямую вписывать названия, но тогда будет много копипаста
можешь смело подредактировать и укоротить ини для своего инсталла
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
[ code]
var
Flag: boolean;
procedure HideShow(Sender: TObject);
begin
If not Flag then
begin
with WizardForm do
begin
NextButton.Caption := GetIniString('Messages', 'ButtonNext', '', ExpandConstant('{src}\Russian.ini'));
case
WizardForm.CurPageID of
wpReady: NextButton.Caption := GetIniString('Messages', 'ButtonInstall', '', ExpandConstant('{src}\Russian.ini'));
wpFinished: NextButton.Caption := GetIniString('Messages', 'ButtonFinish', '', ExpandConstant('{src}\Russian.ini'));
end;
BackButton.Caption := GetIniString('Messages', 'ButtonBack', '', ExpandConstant('{src}\Russian.ini'));
CancelButton.Caption := GetIniString('Messages', 'ButtonCancel', '', ExpandConstant('{src}\Russian.ini'));
WelcomeLabel1.Caption := 'Вас приветствует мастер установки {#SetupSetting("AppName")}';
WelcomeLabel2.Caption := 'Программа установит {#SetupSetting("AppName")} на Ваш компьютер.%n%nРекомендуется закрыть все прочие приложения перед тем, как продолжить.'
end;
TButton(Sender).Caption:='En';
Flag:= True;
end
else
begin
with WizardForm do
begin
NextButton.Caption := GetIniString('Messages', 'ButtonNext', '', ExpandConstant('{src}\English.ini'));
case
WizardForm.CurPageID of
wpReady: NextButton.Caption := GetIniString('Messages', 'ButtonInstall', '', ExpandConstant('{src}\English.ini'));
wpFinished: NextButton.Caption := GetIniString('Messages', 'ButtonFinish', '', ExpandConstant('{src}\English.ini'));
end;
BackButton.Caption := GetIniString('Messages', 'ButtonBack', '', ExpandConstant('{src}\English.ini'));
CancelButton.Caption := GetIniString('Messages', 'ButtonCancel', '', ExpandConstant('{src}\English.ini'));
WelcomeLabel1.Caption := 'Welcome to the {#SetupSetting("AppName")} Setup Wizard';
WelcomeLabel2.Caption := GetIniString('Messages', 'WelcomeLabel2', '', ExpandConstant('{src}\English.ini'));
end;
TButton(Sender).Caption:='Ru';
Flag:= False;
end;
end;
procedure InitializeWizard();
begin
with TButton.Create(WizardForm) do
begin
SetBounds(ScaleX(20), ScaleY(325), ScaleX(25), ScaleY(25));
OnClick:= @HideShow;
Caption:= 'En';
Parent:= WizardForm;
end;
Flag:= True;
end;
(хотя считаю, что эта кнопка чистой воды понт, тк смысл = 0, если ты уже выбрал язык перед запуском инсталла или он выбрался автоматически в зависимости от настроек )
El Sanchez
11-06-2012, 21:27
NetworkCfg.xml должен создаваться в папке программы, т.е %ProgramFiles%\Моё Программное Обеспечение.
То что в коде "но между XXX должно вводиться Название XXX; Например XXX" это должно работать в инсталляторе "вводиться в окошках" »
Неадекватный, способов несколько.
1. Использовать уже готовый шаблон без значений NetworkCfg.xml (как в вашем посте, первый код) и методы объекта XMLDOM:
[Files]
Source: NetworkCfg.xml; Flags: dontcopy
[Code]
procedure CreateNetworkCfg;
var
objXMLDoc: Variant;
begin
objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
objXMLDoc.async := False;
objXMLDoc.load(ExpandConstant('{tmp}\networkcfg.xml'));
if objXMLDoc.parseError.errorCode <> 0 then Exit;
objXMLDoc.selectSingleNode('//AllNetworkConfigs/NetworkConfig/ConfigFileName').Text := NewEdit1.Text;
objXMLDoc.selectSingleNode('//AllNetworkConfigs/NetworkConfig/UserName').Text := NewEdit2.Text;
objXMLDoc.selectSingleNode('//AllNetworkConfigs/NetworkConfig/Password').Text := NewEdit3.Text;
objXMLDoc.selectSingleNode('//AllNetworkConfigs/NetworkConfig/LoginNumber').Text := NewEdit4.Text;
objXMLDoc.selectSingleNode('//AllNetworkConfigs/NetworkConfig/APN').Text := NewEdit5.Text;
objXMLDoc.save(ExpandConstant('{app}\networkcfg.xml'));
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssPostInstall: CreateNetworkCfg;
end;
end;
procedure InitializeWizard();
begin
ExtractTemporaryFile('networkcfg.xml');
RedesignWizardForm;
end;
2. Использовать SaveStringToFile с длинной строкой.
[Code]
procedure CreateNetworkCfg;
begin
SaveStringToFile(
ExpandConstant('{app}\networkcfg.xml'),
'<?xml version="1.0" encoding="UTF-8"?>'#13#10 +
'<AllNetworkConfigs>'#13#10#9 +
'<NetworkConfig isNDIS="0" canbeDelete="1" isPreferred="1">'#13#10#9#9 +
'<ConfigFileName>' + NewEdit1.Text + '</ConfigFileName>'#13#10#9#9 +
'<UserName>' + NewEdit2.Text + '</UserName>'#13#10#9#9 +
'<Password>' + NewEdit3.Text + '</Password>'#13#10#9#9 +
'<LoginNumber>' + NewEdit4.Text + '</LoginNumber>'#13#10#9#9 +
'<AutoGetAPN>0</AutoGetAPN>'#13#10#9#9 +
'<APN>' + NewEdit5.Text + '</APN>'#13#10#9#9 +
'<AutoGetDNS>1</AutoGetDNS>'#13#10#9#9 +
'<MainDNS>0.0.0.0</MainDNS>'#13#10#9#9 +
'<StandbyDNS>0.0.0.0</StandbyDNS>'#13#10#9#9 +
'<AutoGetPDP>1</AutoGetPDP>'#13#10#9#9 +
'<PDPAddress>0.0.0.0</PDPAddress>'#13#10#9#9 +
'<PDPType>IP</PDPType>'#13#10#9#9 +
'<AuthType>PAP</AuthType>'#13#10#9#9 +
'<AskUserAndPwd>0</AskUserAndPwd>'#13#10#9#9 +
'<SaveUserAndPwd>0</SaveUserAndPwd>'#13#10#9 +
'</NetworkConfig>'#13#10 +
'</AllNetworkConfigs>'
, False
);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssPostInstall: CreateNetworkCfg;
end;
end;
R.i.m.s.k.y.
11-06-2012, 22:02
El Sanchez, что такое objXMLDoc? стандартная функция? или какой-то модуль?
El Sanchez
11-06-2012, 22:06
что такое objXMLDoc? стандартная функция? или какой-то модуль? »
R.i.m.s.k.y., переменная типа Variant, результат функции CreateOleObject, короче, ссылка на объект.
Неадекватный
12-06-2012, 06:16
способов несколько. »
[Setup]
AppName=Моё Программное Обеспечение
AppVersion=1.5
;AppVerName=Моё Программное Обеспечение 1.5
DefaultDirName={pf}\Моё Программное Обеспечение
DefaultGroupName=Моё Программное Обеспечение
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Icons]
Name: "{group}\{cm:UninstallProgram,Моё Программное Обеспечение}"; Filename: "{uninstallexe}"
[CustomMessages]
Russian.Caption=Настройка профиля по умолчанию
Russian.Description=Настройте профиль в соответствии с вашим оператором
Russian.SettingsProfile=Настройка профиля
Russian.Operator=Оператор:
Russian.UserName=Имя пользователя:
Russian.Password=Пароль:
Russian.NumberDial=Номер набора:
Russian.APN=Точка доступа:
[*Code]
var
ISCustomPage1: TWizardPage;
NewGroupBox1: TNewGroupBox;
NewStaticText1: TNewStaticText;
NewEdit1: TNewEdit;
NewStaticText2: TNewStaticText;
NewEdit2: TNewEdit;
NewStaticText3: TNewStaticText;
NewEdit3: TNewEdit;
NewStaticText4: TNewStaticText;
NewEdit4: TNewEdit;
NewStaticText5: TNewStaticText;
NewEdit5: TNewEdit;
procedure RedesignWizardForm;
begin
ISCustomPage1 := CreateCustomPage(wpSelectDir, CustomMessage('Caption'), CustomMessage('Description'));
with ISCustomPage1.Surface do
begin
Name := 'ISCustomPage1';
end;
NewGroupBox1 := TNewGroupBox.Create(WizardForm);
with NewGroupBox1 do
begin
Name := 'NewGroupBox1';
Parent := ISCustomPage1.Surface;
Left := ScaleX(16);
Top := ScaleY(8);
Width := ScaleX(377);
Height := ScaleY(209);
Caption := CustomMessage('SettingsProfile');
end;
NewStaticText1 := TNewStaticText.Create(WizardForm);
with NewStaticText1 do
begin
Name := 'NewStaticText1';
Parent := NewGroupBox1;
Caption := CustomMessage('Operator');
Left := ScaleX(32);
Top := ScaleY(31);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit1 := TNewEdit.Create(WizardForm);
with NewEdit1 do
begin
Name := 'NewEdit1';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(28);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText2 := TNewStaticText.Create(WizardForm);
with NewStaticText2 do
begin
Name := 'NewStaticText2';
Parent := NewGroupBox1;
Caption := CustomMessage('UserName');
Left := ScaleX(32);
Top := ScaleY(57);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit2 := TNewEdit.Create(WizardForm);
with NewEdit2 do
begin
Name := 'NewEdit2';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(53);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText3 := TNewStaticText.Create(WizardForm);
with NewStaticText3 do
begin
Name := 'NewStaticText3';
Parent := NewGroupBox1;
Caption := CustomMessage('Password');
Left := ScaleX(32);
Top := ScaleY(80);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit3 := TNewEdit.Create(WizardForm);
with NewEdit3 do
begin
Name := 'NewEdit3';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(77);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText4 := TNewStaticText.Create(WizardForm);
with NewStaticText4 do
begin
Name := 'NewStaticText4';
Parent := NewGroupBox1;
Caption := CustomMessage('NumberDial');
Left := ScaleX(32);
Top := ScaleY(103);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit4 := TNewEdit.Create(WizardForm);
with NewEdit4 do
begin
Name := 'NewEdit4';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(100);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText5 := TNewStaticText.Create(WizardForm);
with NewStaticText5 do
begin
Name := 'NewStaticText5';
Parent := NewGroupBox1;
Caption := CustomMessage('APN');
Left := ScaleX(32);
Top := ScaleY(127);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit5 := TNewEdit.Create(WizardForm);
with NewEdit5 do
begin
Name := 'NewEdit5';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(124);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText1.TabOrder := 0;
NewEdit1.TabOrder := 1;
NewStaticText2.TabOrder := 2;
NewEdit2.TabOrder := 3;
NewStaticText3.TabOrder := 4;
NewEdit3.TabOrder := 5;
NewStaticText4.TabOrder := 6;
NewEdit4.TabOrder := 7;
NewStaticText5.TabOrder := 8;
NewEdit5.TabOrder := 9;
NewGroupBox1.TabOrder := 0;
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
end;Т.е один из способов нужно вписать в код выше так?
Mafia_forever
12-06-2012, 08:29
как сделать чтоб инсталл выводил окошко . идет подготовка к установке и отображения точного прогресса . в прогресс баре или в процентах . плиз хелп .
Mafia_forever, по моему должен по-умолчанию производится.
Johny777
12-06-2012, 10:22
Неадекватный,
небольшой апдейт к твоему скрипту
блокировка/разблокировка кнопки "далее" в зависимости от того есть ли текст во всех эдитах
припиши всем эдитам OnChange := @EditsOnChange; *(или в дизайнере во вкладке события назначь)
procedure EditsOnChange(Sender: TObject);
begin
WizardForm.NextButton.Enabled := (NewEdit1.Text <> '') and (NewEdit2.Text <> '') and (NewEdit3.Text <> '') and (NewEdit4.Text <> '')and (NewEdit5.Text <> '');
end;
procedure RedesignWizardForm;
begin
....
NewEdit1 := TNewEdit.Create(WizardForm);
with NewEdit1 do
begin
....
OnChange := @EditsOnChange; /// пример
end;
....
end;
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
ISCustomPage1.ID: WizardForm.NextButton.Enabled := (NewEdit1.Text <> '') and (NewEdit2.Text <> '') and (NewEdit3.Text <> '') and (NewEdit4.Text <> '')and (NewEdit5.Text <> '');
end;
end;
хотя не знаю являются ли твои настройки xml опициональными
полный код:
[Setup]
AppName=Моё Программное Обеспечение
AppVersion=1.5
;AppVerName=Моё Программное Обеспечение 1.5
DefaultDirName={pf}\Моё Программное Обеспечение
DefaultGroupName=Моё Программное Обеспечение
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Icons]
Name: "{group}\{cm:UninstallProgram,Моё Программное Обеспечение}"; Filename: "{uninstallexe}"
[CustomMessages]
Russian.Caption=Настройка профиля по умолчанию
Russian.Description=Настройте профиль в соответствии с вашим оператором
Russian.SettingsProfile=Настройка профиля
Russian.Operator=Оператор:
Russian.UserName=Имя пользователя:
Russian.Password=Пароль:
Russian.NumberDial=Номер набора:
Russian.APN=Точка доступа:
[ code]
var
ISCustomPage1: TWizardPage;
NewGroupBox1: TNewGroupBox;
NewStaticText1: TNewStaticText;
NewEdit1: TNewEdit;
NewStaticText2: TNewStaticText;
NewEdit2: TNewEdit;
NewStaticText3: TNewStaticText;
NewEdit3: TNewEdit;
NewStaticText4: TNewStaticText;
NewEdit4: TNewEdit;
NewStaticText5: TNewStaticText;
NewEdit5: TNewEdit;
procedure EditsOnChange(Sender: TObject);
begin
WizardForm.NextButton.Enabled := (NewEdit1.Text <> '') and (NewEdit2.Text <> '') and (NewEdit3.Text <> '') and (NewEdit4.Text <> '')and (NewEdit5.Text <> '');
end;
procedure RedesignWizardForm;
begin
ISCustomPage1 := CreateCustomPage(wpSelectDir, CustomMessage('Caption'), CustomMessage('Description'));
with ISCustomPage1.Surface do
begin
Name := 'ISCustomPage1';
end;
NewGroupBox1 := TNewGroupBox.Create(WizardForm);
with NewGroupBox1 do
begin
Name := 'NewGroupBox1';
Parent := ISCustomPage1.Surface;
Left := ScaleX(16);
Top := ScaleY(8);
Width := ScaleX(377);
Height := ScaleY(209);
Caption := CustomMessage('SettingsProfile');
end;
NewStaticText1 := TNewStaticText.Create(WizardForm);
with NewStaticText1 do
begin
Name := 'NewStaticText1';
Parent := NewGroupBox1;
Caption := CustomMessage('Operator');
Left := ScaleX(32);
Top := ScaleY(31);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit1 := TNewEdit.Create(WizardForm);
with NewEdit1 do
begin
Name := 'NewEdit1';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(28);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
OnChange := @EditsOnChange;
end;
NewStaticText2 := TNewStaticText.Create(WizardForm);
with NewStaticText2 do
begin
Name := 'NewStaticText2';
Parent := NewGroupBox1;
Caption := CustomMessage('UserName');
Left := ScaleX(32);
Top := ScaleY(57);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit2 := TNewEdit.Create(WizardForm);
with NewEdit2 do
begin
Name := 'NewEdit2';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(53);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
OnChange := @EditsOnChange;
end;
NewStaticText3 := TNewStaticText.Create(WizardForm);
with NewStaticText3 do
begin
Name := 'NewStaticText3';
Parent := NewGroupBox1;
Caption := CustomMessage('Password');
Left := ScaleX(32);
Top := ScaleY(80);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit3 := TNewEdit.Create(WizardForm);
with NewEdit3 do
begin
Name := 'NewEdit3';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(77);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
OnChange := @EditsOnChange;
end;
NewStaticText4 := TNewStaticText.Create(WizardForm);
with NewStaticText4 do
begin
Name := 'NewStaticText4';
Parent := NewGroupBox1;
Caption := CustomMessage('NumberDial');
Left := ScaleX(32);
Top := ScaleY(103);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit4 := TNewEdit.Create(WizardForm);
with NewEdit4 do
begin
Name := 'NewEdit4';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(100);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
OnChange := @EditsOnChange;
end;
NewStaticText5 := TNewStaticText.Create(WizardForm);
with NewStaticText5 do
begin
Name := 'NewStaticText5';
Parent := NewGroupBox1;
Caption := CustomMessage('APN');
Left := ScaleX(32);
Top := ScaleY(127);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit5 := TNewEdit.Create(WizardForm);
with NewEdit5 do
begin
Name := 'NewEdit5';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(124);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
OnChange := @EditsOnChange;
end;
NewStaticText1.TabOrder := 0;
NewEdit1.TabOrder := 1;
NewStaticText2.TabOrder := 2;
NewEdit2.TabOrder := 3;
NewStaticText3.TabOrder := 4;
NewEdit3.TabOrder := 5;
NewStaticText4.TabOrder := 6;
NewEdit4.TabOrder := 7;
NewStaticText5.TabOrder := 8;
NewEdit5.TabOrder := 9;
NewGroupBox1.TabOrder := 0;
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
ISCustomPage1.ID: WizardForm.NextButton.Enabled := (NewEdit1.Text <> '') and (NewEdit2.Text <> '') and (NewEdit3.Text <> '') and (NewEdit4.Text <> '')and (NewEdit5.Text <> '');
end;
end;
R.i.m.s.k.y.
12-06-2012, 13:01
R.i.m.s.k.y., переменная типа Variant, результат функции CreateOleObject, короче, ссылка на объект. »
пример выше достаточен или надо что-то еще?
El Sanchez
12-06-2012, 15:20
Т.е один из способов нужно вписать в код выше так? »
пример выше достаточен или надо что-то еще? »
Неадекватный, да, вставьте один из вариантов в ваш код.
Dark_Delphin
12-06-2012, 16:16
Всем привет!
Подскажите код, чтобы картинка (PNG) вылазила за пределы инсталлятора и не было фона?
Пример
http://s012.radikal.ru/i319/1011/64/54aa2b155663.jpg
Johny777
12-06-2012, 18:35
Dark_Delphin,
думаю через ботву
могу предложить такой вариант :) на основе ...\Inno Setup 5\Scripts\WindowEffects\Transperent Color.iss
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Files]
Source: "S17Logo.bmp"; Flags: dontcopy solidbreak
[ Code]
const
TransparentPercent = 80; // процент прозрачности
TransparentColor = $506a5a; // прозрачный цвет
WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);
function SetLayeredWindowAttributes(hwnd: hWnd; crKey: TColor; bAlpha: byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
//
type
TANewStatic = record
Static : TNewStaticText;
end;
var
ANewStatic : array of TANewStatic;
function ReleaseCapture(): Longint; external 'ReleaseCapture@user32.dll stdcall';
procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(WizardForm.Handle,$0112,$F012,0)
end;
procedure AddStaticToArray(st:TNewStaticText);
var
i:integer;
begin
i:=GetArrayLength(ANewStatic);
SetArrayLength(ANewStatic,i+1);
ANewStatic[i].Static:=st;
ANewStatic[i].Static.OnMouseDown:=@MouseDown;
end;
procedure StaticChange(c:TWinControl);
var
i:integer;
begin
for i:=0 to c.ControlCount-1 do
if c.Controls[i] is TWinControl then begin
if c.Controls[i] is TNewStaticText then AddStaticToArray(TNewStaticText(c.Controls[i]));
if TWinControl(c.Controls[i]).ControlCount>0 then StaticChange(TWinControl(c.Controls[i]));
end;
end;
//
procedure InitializeWizard();
begin
with WizardForm do
begin
OuterNotebook.Hide;
WizardForm.Width := ScaleX(470);
WizardForm.Height := ScaleY(525);
BorderStyle := bsNone;
CancelButton.Left := ScaleX(200);
CancelButton.Top := ScaleY(230);
end;
with TBitmapImage.Create(WizardForm) do
begin
Parent := WizardForm;
Align := alClient;
Left := ScaleX(0);
Top := ScaleY(0);
ExtractTemporaryFile('S17Logo.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\S17Logo.bmp'));
OnMouseDown := @MouseDown;
end;
SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED)
SetLayeredWindowAttributes(WizardForm.Handle, TransparentColor, (255 * TransparentPercent) / 100, LWA_COLORKEY)
end;
procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.NextButton.Hide;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm := False;
end;
наглядный пример в архиве
прозрачный цвет здесь
$5а6a50 (фотошоп)
$506a5a (инно)
Dark_Delphin
12-06-2012, 20:40
Johny777, Спасибо. Щас буду пробовать)
Неадекватный
13-06-2012, 14:28
да, вставьте один из вариантов в ваш код. »
При первой инсталляции не работает не создаёт XML, если установить поверх ещё раз то XML создаётся. В чём может быть ошибка?
[Setup]
AppName=Моё Программное Обеспечение
AppVersion=1.5
;AppVerName=Моё Программное Обеспечение 1.5
DefaultDirName={pf}\Моё Программное Обеспечение
DefaultGroupName=Моё Программное Обеспечение
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Icons]
Name: "{group}\{cm:UninstallProgram,Моё Программное Обеспечение}"; Filename: "{uninstallexe}"
[CustomMessages]
Russian.Caption=Настройка профиля по умолчанию
Russian.Description=Настройте профиль в соответствии с вашим оператором
Russian.SettingsProfile=Настройка профиля
Russian.Operator=Оператор:
Russian.UserName=Имя пользователя:
Russian.Password=Пароль:
Russian.NumberDial=Номер набора:
Russian.APN=Точка доступа:
[*Code]
var
ISCustomPage1: TWizardPage;
NewGroupBox1: TNewGroupBox;
NewStaticText1: TNewStaticText;
NewEdit1: TNewEdit;
NewStaticText2: TNewStaticText;
NewEdit2: TNewEdit;
NewStaticText3: TNewStaticText;
NewEdit3: TNewEdit;
NewStaticText4: TNewStaticText;
NewEdit4: TNewEdit;
NewStaticText5: TNewStaticText;
NewEdit5: TNewEdit;
procedure RedesignWizardForm;
begin
ISCustomPage1 := CreateCustomPage(wpSelectDir, CustomMessage('Caption'), CustomMessage('Description'));
with ISCustomPage1.Surface do
begin
Name := 'ISCustomPage1';
end;
NewGroupBox1 := TNewGroupBox.Create(WizardForm);
with NewGroupBox1 do
begin
Name := 'NewGroupBox1';
Parent := ISCustomPage1.Surface;
Left := ScaleX(16);
Top := ScaleY(8);
Width := ScaleX(377);
Height := ScaleY(209);
Caption := CustomMessage('SettingsProfile');
end;
NewStaticText1 := TNewStaticText.Create(WizardForm);
with NewStaticText1 do
begin
Name := 'NewStaticText1';
Parent := NewGroupBox1;
Caption := CustomMessage('Operator');
Left := ScaleX(32);
Top := ScaleY(31);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit1 := TNewEdit.Create(WizardForm);
with NewEdit1 do
begin
Name := 'NewEdit1';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(28);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText2 := TNewStaticText.Create(WizardForm);
with NewStaticText2 do
begin
Name := 'NewStaticText2';
Parent := NewGroupBox1;
Caption := CustomMessage('UserName');
Left := ScaleX(32);
Top := ScaleY(57);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit2 := TNewEdit.Create(WizardForm);
with NewEdit2 do
begin
Name := 'NewEdit2';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(53);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText3 := TNewStaticText.Create(WizardForm);
with NewStaticText3 do
begin
Name := 'NewStaticText3';
Parent := NewGroupBox1;
Caption := CustomMessage('Password');
Left := ScaleX(32);
Top := ScaleY(80);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit3 := TNewEdit.Create(WizardForm);
with NewEdit3 do
begin
Name := 'NewEdit3';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(77);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText4 := TNewStaticText.Create(WizardForm);
with NewStaticText4 do
begin
Name := 'NewStaticText4';
Parent := NewGroupBox1;
Caption := CustomMessage('NumberDial');
Left := ScaleX(32);
Top := ScaleY(103);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit4 := TNewEdit.Create(WizardForm);
with NewEdit4 do
begin
Name := 'NewEdit4';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(100);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText5 := TNewStaticText.Create(WizardForm);
with NewStaticText5 do
begin
Name := 'NewStaticText5';
Parent := NewGroupBox1;
Caption := CustomMessage('APN');
Left := ScaleX(32);
Top := ScaleY(127);
Width := ScaleX(100);
Height := ScaleY(14);
end;
NewEdit5 := TNewEdit.Create(WizardForm);
with NewEdit5 do
begin
Name := 'NewEdit5';
Parent := NewGroupBox1;
Left := ScaleX(136);
Top := ScaleY(124);
Width := ScaleX(121);
Height := ScaleY(21);
Text := '';
end;
NewStaticText1.TabOrder := 0;
NewEdit1.TabOrder := 1;
NewStaticText2.TabOrder := 2;
NewEdit2.TabOrder := 3;
NewStaticText3.TabOrder := 4;
NewEdit3.TabOrder := 5;
NewStaticText4.TabOrder := 6;
NewEdit4.TabOrder := 7;
NewStaticText5.TabOrder := 8;
NewEdit5.TabOrder := 9;
NewGroupBox1.TabOrder := 0;
end;
procedure CreateNetworkCfg;
begin
SaveStringToFile(
ExpandConstant('{app}\NetworkCfg.xml'),
'<?xml version="1.0" encoding="UTF-8"?>'#13#10 +
'<AllNetworkConfigs>'#13#10#9 +
'<NetworkConfig isNDIS="0" canbeDelete="1" isPreferred="1">'#13#10#9#9 +
'<ConfigFileName>' + NewEdit1.Text + '</ConfigFileName>'#13#10#9#9 +
'<UserName>' + NewEdit2.Text + '</UserName>'#13#10#9#9 +
'<Password>' + NewEdit3.Text + '</Password>'#13#10#9#9 +
'<LoginNumber>' + NewEdit4.Text + '</LoginNumber>'#13#10#9#9 +
'<AutoGetAPN>0</AutoGetAPN>'#13#10#9#9 +
'<APN>' + NewEdit5.Text + '</APN>'#13#10#9#9 +
'<AutoGetDNS>1</AutoGetDNS>'#13#10#9#9 +
'<MainDNS>0.0.0.0</MainDNS>'#13#10#9#9 +
'<StandbyDNS>0.0.0.0</StandbyDNS>'#13#10#9#9 +
'<AutoGetPDP>1</AutoGetPDP>'#13#10#9#9 +
'<PDPAddress>0.0.0.0</PDPAddress>'#13#10#9#9 +
'<PDPType>IP</PDPType>'#13#10#9#9 +
'<AuthType>PAP</AuthType>'#13#10#9#9 +
'<AskUserAndPwd>0</AskUserAndPwd>'#13#10#9#9 +
'<SaveUserAndPwd>0</SaveUserAndPwd>'#13#10#9 +
'</NetworkConfig>'#13#10 +
'</AllNetworkConfigs>'
, False
);
end;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
ISCustomPage1.ID: CreateNetworkCfg;
end;
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
end;
Johny777
13-06-2012, 14:55
Открыл для себя классное решение при использовании скина!
при закрытии окна на секунду появляется виндовсовские границы окна, что не есть красиво:
http://img543.imageshack.us/img543/246/18817170.png (http://imageshack.us/photo/my-images/543/18817170.png/)
поэтому в процедуре деинициализации использую Sleep и Hide
код:
procedure DeinitializeSetup;
begin
if Initialize then
begin
WizardForm.Hide; /// или с формой Autorun.Hide;
Sleep(200);
ShowWindow(WizardForm.Handle,0);
UnloadSkin();
end;
end;
при сокрытии формы (Hide) вин-границы окна не появляется, а окно плавно исчезает
но если сразу после сокрытия выгружать библиотеку, то вин-границы всё же видно
поэтому у нас есть ещё и Sleep (у меня настройка на 200 миллисекунд)
в итоге библиотека выгружается так же некрасиво, но мы этого уже не видим ! :grin:
Мелочь, но классная
два наглядных примера на основе Авторана в архиве http://sendfile.su/613062
El Sanchez
13-06-2012, 17:18
При первой инсталляции не работает не создаёт XML, если установить поверх ещё раз то XML создаётся. В чём может быть ошибка? »
Неадекватный, пардон, я тестировал сохранение не в {app}. Конечно же, при первой установке папки {app} еще не существует, сохранять нужно позже, поэтому вместо блока функции NextButtonClick напишите:
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssPostInstall: CreateNetworkCfg;
end;
end;
91892823
13-06-2012, 18:49
Здравствуйте!
Мне интересен вопрос более высокой скорости распаковки.. Что-то читал за Фриарк, но не совсем понял. Как же ускорить процесс распаковки? Возможно ли использовать какие-либо библиотеки для ускорения процесса распаковки? Или какими методами достичь этого? Прошу расписать в деталях! Заранее благодарю всех, кто поможет.
Ivan_009
13-06-2012, 20:08
91892823, Используй IsDone там все подробно расписано... :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.