Войти

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


Страниц : 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 101 102 103 104 105 106 [107] 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

diman_21Ru
04-02-2014, 21:12
не могу не как добавить в свой скрипт функцию от Цитата innot20: а возможно ли это вывести при выборе папки установки? »Конечно. читать дальше »

saurn
04-02-2014, 21:48
на 7 и 8 все норм. а на xp отображается другая иконка. »
А через LoadIcon?
[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function LoadIcon(hInstance: UINT; lpIconName: UINT): HICON; external 'LoadIcon{#A}@user32.dll stdcall';


const
IDI_APPLICATION = 32512; //Default application icon.
IDI_ASTERISK = 32516; //Asterisk icon. Same as IDI_INFORMATION.
IDI_ERROR = 32513; //Hand-shaped icon.
IDI_EXCLAMATION = 32515; //Exclamation point icon. Same as IDI_WARNING.
IDI_HAND = 32513; //Hand-shaped icon. Same as IDI_ERROR.
IDI_INFORMATION = 32516; //Asterisk icon.
IDI_QUESTION = 32514; //Question mark icon.
IDI_SHIELD = 32518; //Security Shield icon.
IDI_WARNING = 32515; //Exclamation point icon.
IDI_WINLOGO = 32517; //Default application icon. Windows 2000: Windows logo icon.


procedure InitializeWizard();
begin
MsgBoxEx(WizardForm.Handle, 'Test', 'Test', MB_OK, LoadIcon(0, IDI_ASTERISK), 0);
end;

diman_21Ru
04-02-2014, 21:56
А как тут указать путь чтобы папку видел без разделов т.е это для бекапа папки res_mods Source: C:\Windows\Fonts\*; DestDir: {app}\res-mods; Flags: external overwritereadonly ignoreversion;

sergey3695
04-02-2014, 22:45
saurn, все норм спасибо. Я не знал как LoadIcon использовать в inno, скорее как прописать функцию.

saurn
04-02-2014, 22:53
C:\Windows\Fonts\*; DestDir: {app}\res-mods; Flags: external overwritereadonly ignoreversion; »
Причем здесь папка шрифтов, я же сказал: это для примера.
Source: путь к папке с устанавливаемыми файлами (здесь указываете местоположение файлов, которые будут устанавливатся)
DestDir: папка, в которую будут установленны файлы
Справку читайте.

PerfectLove
05-02-2014, 02:37
Как сменить цвет текста »
« скрыть
Код:
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(100 + i*24), ScaleX(400), ScaleY(15));
Color := clRed;
case i of
0: Caption := 'Backup res_mods folder';
Len: Caption := 'Backup xvm folder only';
end;
end; »

Я так и сам делал, но результата никакого. Текст как был чёрным так и остается.

saurn
05-02-2014, 03:07
Я так и сам делал, но результата никакого. Текст как был чёрным так и остается. »
[code]
#define A = (Defined UNICODE) ? "W" : "A"


function MoveDir(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFile{#A}@kernel32.dll stdcall';


var
arrayChk: array of TCheckBox;
arrayLbl: array of TLabel;


function ChkChecked(const Index: Integer): Boolean;
var
Len: Integer;
begin
Len := GetArrayLength(arrayChk) - 1;

if Index > Len then Exit;
Result := arrayChk[Index].Checked;
end;


procedure CreateBackup();
var
FindDir: TFindRec;
i, Len: Integer;
Dir: array of string;
MyDir, BackDir: string;
begin
Len := GetArrayLength(arrayChk) - 1;
if (ChkChecked(0) and ChkChecked(Len)) then Exit; //Если выбраны оба чекбокса резервная копия создана не будет
if ChkChecked(0) then Dir := ['*']; //Резервное копирование папки
if ChkChecked(Len) then Dir := ['xvm']; //Резервное копирование определенных файлов
MyDir:=ExpandConstant('{app}\res_mods'+'\');
BackDir:=ExpandConstant('{app}'+'\Backup\');
for i:=0 to GetArrayLength(Dir)-1 do
begin
if FindFirst(MyDir + Dir[i], FindDir) then
begin
if FindFirst(MyDir+Dir[i], FindDir) then begin
repeat
if not DirExists(BackDir) then begin
CreateDir(BackDir);
end;
MoveDir(MyDir+FindDir.Name, BackDir+FindDir.Name);
until not FindNext(FindDir);
FindClose(FindDir);
end;
end;
end;
end;


procedure CreateCustomControls();
var
i, Len: Integer;
begin
SetArrayLength(arrayChk, 2);
Len := GetArrayLength(arrayChk) - 1;

for i := 0 to Len do
begin
arrayChk[i] := TCheckBox.Create(nil);
with arrayChk[i] do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(100 + i*24), ScaleX(15), ScaleY(15));
end;
end;

SetArrayLength(arrayLbl, 2);
Len := GetArrayLength(arrayLbl) - 1;

for i := 0 to Len do
begin
arrayLbl[i] := TLabel.Create(nil);
with arrayLbl[i] do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(18), ScaleY(101 + i*24), ScaleX(WizardForm.DirEdit.Width), ScaleY(15));
Font.Color := $008000;
case i of
0: Caption := 'Backup res_mods folder';
Len: Caption := 'Backup xvm folder only';
end;
end;
end;
end;


procedure InitializeWizard();
begin
CreateCustomControls();
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
Len: Integer;
begin
Len := GetArrayLength(arrayChk) - 1;

case CurStep of
ssInstall: if (ChkChecked(0) or ChkChecked(Len)) then CreateBackup();
end;
end;

Nordek
05-02-2014, 04:00
Я так и сам делал, но результата никакого. »Ну так и у меня твой скрипт не сработал - вообще ничего невидно.
Нужно вставлять корректный скрипт - который после компиляции на выходе будет работать.
Уметь правильно (http://forum.oszone.net/post-2270836-1700.html) работать с тегом [CODE].
Помочь - это одно дело, а переделывать и что-то там искать - это другое - чувствуешь разницу?
Перед тем как выложить, нужно предварительно проверить на работоспособность - без этого никак.
Если вам вопрошающим лень рабочий вариант предоставить, то какого тем кто вам помогает?

Да, здесь ещё есть и особенные типажи, которые любят поскринить - скриншот с ошибкой и больше ничего.
Код тоже между прочим необходимо к скриншоту прилагать.
В ответ ничего в голову не приходит как сделать такой-же скриншот с ответом - но так, чтоб было не понятно.
Сорри - пафосно, но справедливо.

diman_21Ru
05-02-2014, 11:21
Всем привет помогите пожалуйста с одним вопросом не как не могу сделать backup папки res-mods и вывести галочку в компоненты ниже в скрине указал , зарание спасибо :)

Ivan_009
05-02-2014, 14:33
Как прописать только сколько Требуется места для установки и Занимаемое место после установки.
Зарание спасибо... (Если можно дайте пожалуйста пример)

saurn
05-02-2014, 16:07
Всем привет помогите пожалуйста с одним вопросом не как не могу сделать backup папки res-mods и вывести галочку в компоненты ниже в скрине указал »
Хватит плодить одинаковые посты. Двумя сообщениями выше только написали: прикрепляйте к сообщению скрипт(желательно с минимальным набором файлов), а не скриншот. Или вам чекбокс надо просто на скрине нарисовать?

innot20
05-02-2014, 16:58
вопрос насчёт backup, галочку не выводит
получается надо добавить это:
Source: {app}\res_mods\*; DestDir: {app}\res_mods_old; Flags: external overwritereadonly ignoreversion; Check: IsBackup(const FromDir: String; const ToDir: String);

но тогда ругается на const ToDir
если просто
Source: {app}\res_mods\*; DestDir: {app}\res_mods_old; Flags: external overwritereadonly ignoreversion; Check: IsBackup();
то тогда пишет ошибку в коде

Invalid prototype for 'IsBackup'
procedure IsBackup(const FromDir: String; const ToDir: String);

Ivan_009
05-02-2014, 17:18
Почему неотображаютя кнопки вперед, назад, отмена... :o

Код:

procedure InitializeWizard();
begin
with WizardForm do begin
ClientWidth:=ScaleX(600);
ClientHeight:=ScaleY(400);
OuterNotebook.SetBounds(ScaleX(0),ScaleY(0),WizardForm.ClientWidth,WizardForm.ClientHeight);
InnerNotebook.SetBounds(ScaleX(0),ScaleY(0),WizardForm.ClientWidth,WizardForm.ClientHeight);
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
Bevel.Hide;
Center;
end;

with WizardForm.NextButton do begin
Left := ScaleX(380);
Top := ScaleY(365);
Width := ScaleX(90);
Height := ScaleY(23);
end;

with WizardForm.CancelButton do begin
Left := ScaleX(490);
Top := ScaleY(365);
Width := ScaleX(90);
Height := ScaleY(23);
end;

with WizardForm.BackButton do begin
Left := ScaleX(270);
Top := ScaleY(365);
Width := ScaleX(90);
Height := ScaleY(23);
end;

with WizardForm.DirBrowseButton do begin
Left := ScaleX(465);
Top := ScaleY(200);
Width := ScaleX(90);
Height := ScaleY(23);
end;

with WizardForm.GroupBrowseButton do begin
Left := ScaleX(465);
Top := ScaleY(200);
Width := ScaleX(90);
Height := ScaleY(23);
end;
end;

saurn
05-02-2014, 18:04
получается надо добавить это:»
Пример, что я вам дал, самодостаточный, в него ничего добавлять не надо, только указать правильные имена папок, так как я их не знаю, ибо не играю в танки:
#define CUR_DIR "res-mods" ;Папка, которую нужно бэкапить.
#define BAK_DIR "old_res-mods" ;Папка, в которую помещается бэкап


Source: {app}res_mods*; DestDir: {app}res_mods_old; Flags: external overwritereadonly ignoreversion; Check: IsBackup(); »
Вы видели в моем примере чековую функцию? Нет. IsBackup(...) не результатирующая функция, а процедура, вызываемая на этапе перед установкой.
галочку не выводит »
Чекбокс создается только в том случае, если в папке назначения есть папка, резервную копию которой нужно создать. Если этой папки нет, то бэкапить нечего, а следовательно и чекбокс не нужен.
----------------------------------------------------------------------------------------------------------------------------------

Почему неотображаютя кнопки вперед, назад, отмена... »
Потому что вы перекрыли их ноутбуками. Переместите кнопки на передний план.
with WizardForm.CancelButton do begin
BringToFront;
end;

Nordek
05-02-2014, 18:34
ниже в скрине указал »Вот так (http://imageshack.com/a/img809/8603/y0vf.png). Ну как, всё понял как делать?

diman_21Ru, Собственно как и обещал (http://forum.oszone.net/post-2302944-2128.html).

diman_21Ru
05-02-2014, 18:35
Nordek , да мне так надо , можешь скинуть код ? зарание спасибо :)

Nordek
05-02-2014, 18:45
да мне так надо , можешь скинуть код ? »Я тебе уже ответ дал (http://imageshack.com/a/img809/8603/y0vf.png), точно так же (forum.oszone.net/attachment.php?attachmentid=109972&d=1391584912) как и ты нам.

Хорошо, подчеркну:
Да, здесь ещё есть и особенные типажи, которые любят поскринить - скриншот с ошибкой и больше ничего.
Код тоже между прочим необходимо к скриншоту прилагать. »

Я всё понимаю что вам новичкам не хочется свой код показывать всему интернету - дабы чтобы никто не повторил и не использовал этот код кроме вас.
Знаете ли вы, то что вы спрашиваете здесь - здесь и остаётся. Все ответы которые вам предоставили - можно собрать и сделать уникальный скрипт без ошибок, а не как вы с кучей камней и дублями на тысячу строк. Затем готовый скрипт который будет лучше вашего как минимум в те же тысячу раз - выложить в интернет (поделиться со всем миром)
Чтоб никто не украл, нужно самим всё делать. Чтоб никто не повторил, нужно быть элитным кодером (которые здесь действительно есть) а не горе-репакером.

Ivan_009
05-02-2014, 19:54
saurn, А если я буду накладывать лэйблы и бэвелы мне все время надо указывать BringToFront; или нет... :not-me:

saurn
05-02-2014, 20:18
А если я буду накладывать лэйблы и бэвелы мне все время надо указывать BringToFront; или нет... »
С бевелами ситуация иная, на них BringToFront здесь не работает. Но вы же будете создавать их на конкретных страницах, так что этот параметр и не нужен.
А чтоб не плодить BringToFront, достаточно поместить ноутбуки на задний план:
procedure InitializeWizard();
begin
with WizardForm do
begin
OuterNotebook.SendToBack;
InnerNotebook.SendToBack;
end;
end;

saurn
05-02-2014, 21:08
Как прописать только сколько Требуется места для установки и Занимаемое место после установки.
Зарание спасибо... (Если можно дайте пожалуйста пример) »

Выдернул из скрипта. Думаю разберетесь)
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=...
DisableWelcomePage=yes


[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}; Flags: external overwritereadonly ignoreversion; ExternalSize: 50000000000;


[CustomMessages]
MESSAGE_23=Требуется места на диске:
MESSAGE_24=Доступно места на диске:
MESSAGE_25=Файловая система:
MESSAGE_26=МБ
MESSAGE_27=ГБ
MESSAGE_28=ТБ


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


const
MAX_PATH = 260;
TARGET_FILE_SYSTEM = 'NTFS';


function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD;
var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL;
external 'GetVolumeInformation{#A}@kernel32.dll stdcall';


var
MinorInfoLabels, MainInfoLabels: array of TNewStaticText;



function GetFreeDriveSpace(const UndefInstallPath: String): Cardinal;
var
TotalMB: Cardinal;
begin
GetSpaceOnDisk(ExtractFileDrive(UndefInstallPath), True, Result, TotalMB);
end;


function GetFloatFromText(const UndefText: String): String;
var
i, Len: Integer;
begin
Len := Length(UndefText);

for i := 1 to Len do
case UndefText[i] of
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9': Result := Result + UndefText[i];
',': Result := Result + '.';
end;
end;


function NumToStr(const Float: Extended): String;
var
Len: Integer;
begin
Result := Format('%.2n', [Float]);
StringChange(Result, ',', '.');
Len := Length(Result);

while ((Result[Len] = '0') or (Result[Len] = '.')) and (Pos('.', Result) > 0) do
begin
Delete(Result, Len, 1);
Len := Length(Result);
end;
end;


function UnitDriveSpace(const Float: Extended): String;
begin
if (Float < 1024) then Result := NumToStr(Float) + #32 + CustomMessage('MESSAGE_26')
else if (Float/1024 < 1024) then Result := NumToStr(Float/1024) + #32 + CustomMessage('MESSAGE_27')
else Result := NumToStr(Float/(1024*1024)) + #32 + CustomMessage('MESSAGE_28');
end;


function CompareDriveRequirements(const FromText: String; const Input: String): Boolean;
var
Len: Integer;
CompareSpace, CompareFileSystem: Boolean;
UndefNeedSize, UndefFreeSize: Extended;
VolumeName, FileSystemName, DriveLetter: String;
ComponentLength, SerialNumber, FileSystemFlags: DWORD;
begin
Len := GetArrayLength(MainInfoLabels) - 1;

UndefNeedSize := StrToFloat(GetFloatFromText(FromText));
UndefFreeSize := Extended(GetFreeDriveSpace(Input));
VolumeName := StringOfChar(#32, MAX_PATH);
FileSystemName := StringOfChar(#32, MAX_PATH);
DriveLetter := AddBackslash(ExtractFileDrive(Input));

GetVolumeInformation(DriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);

MainInfoLabels[0].Caption := UnitDriveSpace(UndefNeedSize);
MainInfoLabels[1].Caption := UnitDriveSpace(UndefFreeSize);
MainInfoLabels[Len].Caption := Trim(FileSystemName);

CompareSpace := (UndefFreeSize > UndefNeedSize);

case CompareSpace of
True: MainInfoLabels[1].Font.Color := clBlack;
False: MainInfoLabels[1].Font.Color := clRed;
end;

CompareFileSystem := (Trim(FileSystemName) >= TARGET_FILE_SYSTEM);

case CompareFileSystem of
True: MainInfoLabels[Len].Font.Color := clBlack;
False: MainInfoLabels[Len].Font.Color := clRed;
end;

Result := (CompareSpace and CompareFileSystem);
WizardForm.NextButton.Enabled := Result;
end;


procedure WizardEditsOnChange(Sender: TObject);
begin
case TEdit(Sender) of
WizardForm.DirEdit: CompareDriveRequirements(WizardForm.DiskSpaceLabel.Caption, WizardDirValue());
end;
end;


procedure CreateCustomControls();
var
i, Len: Integer;
InfoBox: TNewGroupBox;
begin
with WizardForm do
begin
InfoBox := TNewGroupBox.Create(SelectDirPage);
with InfoBox do
begin
Parent := SelectDirPage;
SetBounds(ScaleX(12), ScaleY(120), ScaleX(450), ScaleY(86));

SetArrayLength(MinorInfoLabels, 3);
Len := GetArrayLength(MinorInfoLabels) - 1;

for i := 0 to Len do
begin
MinorInfoLabels[i] := TNewStaticText.Create(InfoBox);
with MinorInfoLabels[i] do
begin
Parent := InfoBox;
SetBounds(ScaleX(16), ScaleY(13 + i*23), ScaleX(138), ScaleY(14));
AutoSize := False;

case i of
0: Caption := CustomMessage('MESSAGE_23');
1: Caption := CustomMessage('MESSAGE_24');
Len: Caption := CustomMessage('MESSAGE_25');
end;
end;
end;

SetArrayLength(MainInfoLabels, 3);
Len := GetArrayLength(MainInfoLabels) - 1;

for i := 0 to Len do
begin
MainInfoLabels[i] := TNewStaticText.Create(InfoBox);
with MainInfoLabels[i] do
begin
Parent := InfoBox;
SetBounds(ScaleX(165), ScaleY(13 + i*23), ScaleX(268), ScaleY(14));
AutoSize := False;
end;
end;
end;
end;
end;


procedure ModifyWizardForm();
begin
with WizardForm do
begin
ClientWidth := ScaleX(498);
ClientHeight := ScaleY(354);
BorderStyle := bsDialog;
Position := poScreenCenter;

OuterNotebook.SetBounds(ScaleX(0), ScaleY(0), ScaleX(498), ScaleY(302));
InnerNotebook.SetBounds(ScaleX(12), ScaleY(62), ScaleX(474), ScaleY(238));
MainPanel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(498), ScaleY(60));
Bevel1.SetBounds(ScaleX(0), ScaleY(60), ScaleX(498), ScaleY(3));
BeveledLabel.Top := ScaleY(294);
BackButton.SetBounds(ScaleX(252), ScaleY(318), ScaleX(75), ScaleY(23));
NextButton.SetBounds(ScaleX(327), ScaleY(318), ScaleX(75), ScaleY(23));
CancelButton.SetBounds(ScaleX(412), ScaleY(318), ScaleX(75), ScaleY(23));
PageNameLabel.SetBounds(ScaleX(16), ScaleY(10), ScaleX(324), ScaleY(14));
PageDescriptionLabel.SetBounds(ScaleX(24), ScaleY(26), ScaleX(316), ScaleY(28));
SelectDirLabel.SetBounds(ScaleX(68), ScaleY(9), ScaleX(262), ScaleY(14));
SelectDirBitmapImage.Left := ScaleX(12);
SelectDirBrowseLabel.Left := ScaleX(12);

with DirEdit do
begin
Left := ScaleX(12);
Width := ScaleX(370);
OnChange := @WizardEditsOnChange;
end;

DirBrowseButton.Left := ScaleX(387);
DiskSpaceLabel.Hide;
end;
end;


procedure InitializeWizard();
begin
ModifyWizardForm();
CreateCustomControls();
end;


procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpSelectDir: WizardEditsOnChange(WizardForm.DirEdit);
end;
end;




© OSzone.net 2001-2012