PDA

Показать полную графическую версию : Скрипты 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

El Sanchez
18-11-2012, 18:49
как системные иконки прикрутить? »
Johny777, держи. На основе твоего предыдущего кода.


[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
;BitmapResource=Drive:img_small.bmp

[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

type
_ULARGE_INTEGER = record
LowPart: DWORD;
HighPart: DWORD;
end;

DriveInfo = record
DriveLetter: String;
DriveName: String;
DriveFileSystemName: String;
DriveSize: Extended;
DriveFreeSize: array [0..1] of Extended;
DriveType: String;
end;

const
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVABLE = $2;
DRIVE_FIXED = $3;
MAX_PATH = 260;

function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _ULARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';
function ExtractIcon(hInst: THandle; lpszExeFileName: String; nIconIndex: UINT): HICON; external 'ExtractIcon{#A}@shell32.dll stdcall';

function BytesToSize(Bytes: Extended): String;
var
pszBuf: array [0..15] of Char;
begin
try
Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
except end;
end;


function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
Result := $7FFFFFFF;
Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;


procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
i, e: Integer;
UndefDriveLetter: String;
DriveType: UINT;
DrivePath: String;
VolumeName, FileSystemName: String;
ComponentLength, SerialNumber, FileSystemFlags: DWORD;
FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _ULARGE_INTEGER;
begin
for i := 67 to 90 do // Loop from C..Z to determine available drives
begin
UndefDriveLetter := Chr(i) + ':\';
DriveType := GetDriveType(UndefDriveLetter);
case DriveType of
DRIVE_REMOVABLE, DRIVE_FIXED: begin
VolumeName := StringOfChar(#32, MAX_PATH);
FileSystemName := StringOfChar(#32, MAX_PATH);
GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
GetDiskFreeSpaceEx(UndefDriveLetter, FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes);
if Trim(VolumeName) = '' then VolumeName := 'Без имени';
SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
e := GetArrayLength(DriveArray)-1;
DriveArray[e].DriveLetter := UndefDriveLetter;
DriveArray[e].DriveName := VolumeName;
DriveArray[e].DriveFileSystemName := FileSystemName;
DriveArray[e].DriveSize := Size64(TotalNumberOfBytes);
DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes);
if DriveArray[e].DriveSize > 0 then DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]*100/DriveArray[e].DriveSize;
if DriveType = DRIVE_REMOVABLE then DriveArray[e].DriveType := 'Съёмный диск';
if DriveType = DRIVE_FIXED then if CompareText(UndefDriveLetter, ExpandConstant('{drive:{win}}\')) = 0 then DriveArray[e].DriveType := 'Локальный диск (сис.)' else DriveArray[e].DriveType := 'Локальный диск';
end;
DRIVE_NO_ROOT_DIR: Continue;
end;
end;
end;


procedure DriveListViewOnClick(Sender: TObject);
begin
if Assigned(TListView(Sender).Selected) then
WizardForm.DirEdit.Text := TListView(Sender).Selected.Caption + Copy(WizardForm.DirEdit.Text, 4, Length(WizardForm.DirEdit.Text));
end;

procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
TListView(Sender).Tag := Column.Index;
with TListView(Sender) do
begin
if DesignInfo = 0 then DesignInfo := 1 else DesignInfo := -DesignInfo;
AlphaSort;
end;
end;

procedure DriveListViewOnCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
begin
with TListView(Sender) do
begin
if Tag = 0 then
Compare := DesignInfo*CompareText(Item1.Caption, Item2.Caption)
else
Compare := DesignInfo*CompareText(Item1.SubItems[Tag-1], Item2.SubItems[Tag-1]);
end;
end;

procedure InitializeWizard;
var
ReadyArray: array of DriveInfo;
DriveListView: TListView;
NewColumn: TListColumn;
ListItem: TListItem;
ImgList: TImageList;
i: Integer;
ico: TIcon;
begin
WizardForm.OuterNotebook.Hide;
WizardForm.Width := ScaleX(700);
WizardForm.Bevel.Hide;
WizardForm.DirEdit.Parent := WizardForm;
WizardForm.DirEdit.SetBounds(ScaleX(27), ScaleY(27), WizardForm.Width-ScaleX(71), ScaleY(21));

GetDrivesInfo(ReadyArray);

DriveListView := TListView.Create(nil);
with DriveListView do
begin
Parent := WizardForm;
ViewStyle := vsReport;
ReadOnly := True;
SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + ScaleY(40), WizardForm.DirEdit.Width, ScaleY(200));
OnClick := @DriveListViewOnClick;
OnColumnClick := @DriveListViewColumnClick;
OnCompare := @DriveListViewOnCompare;

ImgList := TImageList.Create(DriveListView);
ico := TIcon.Create;
ico.Handle := ExtractIcon(HInstance, ExpandConstant('{sys}\shell32.dll'), 8);
ImgList.AddIcon(ico);
ico.Handle := ExtractIcon(HInstance, ExpandConstant('{sys}\shell32.dll'), 7);
ImgList.AddIcon(ico);
ico.Free;
SmallImages := ImgList;

NewColumn := Columns.Add;
NewColumn.Caption := 'Диск';
NewColumn.Width := ScaleX(65);

NewColumn := Columns.Add;
NewColumn.Caption := 'Имя';
NewColumn.Width := ScaleX(90);

NewColumn := Columns.Add;
NewColumn.Caption := 'Файловая система';
NewColumn.Width := ScaleX(105);

NewColumn := Columns.Add;
NewColumn.Caption := 'Ёмкость';
NewColumn.Width := ScaleX(65);

NewColumn := Columns.Add;
NewColumn.Caption := 'Свободно';
NewColumn.Width := ScaleX(90);

NewColumn := Columns.Add;
NewColumn.Caption := 'Тип';
NewColumn.Width := ScaleX(130);

for i := 0 to GetArrayLength(ReadyArray)-1 do
begin
ListItem := Items.Add;
with ListItem do
begin
Caption := ReadyArray[i].DriveLetter;
SubItems.Add(ReadyArray[i].DriveName);
SubItems.Add(ReadyArray[i].DriveFileSystemName);
SubItems.Add(BytesToSize(ReadyArray[i].DriveSize));
SubItems.Add(Format('%s (%d%%)', [BytesToSize(ReadyArray[i].DriveFreeSize[0]), Round(ReadyArray[i].DriveFreeSize[1])]));
SubItems.Add(ReadyArray[i].DriveType);
case ReadyArray[i].DriveType of
'Локальный диск', 'Локальный диск (сис.)': ImageIndex := 0;
'Съёмный диск': ImageIndex := 1;
else
ImageIndex := 1;
end;
end;
end;
end;
end;

ToBeLife
19-11-2012, 18:44
Доброго времени суток.
Не хотел отрывать вас от более продвинутых ситуаций, но буду признателен за помощь.

задача такова:
необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения.
или как это реализовать через [Run], что бы первоначально запускался именно батник.

Спасибо

R.i.m.s.k.y.
19-11-2012, 19:02
ToBeLife, нихао
В справке читай installation order, RUN выполняется самой последней секцией.

Так что через код

[Files]
Source: cmd.cmd; DestDir: {tmp}; Flags: ignoreversion noencryption solidbreak dontcopy

[CODE]
var
res : integer;

procedure InitializeWizard();
begin
ExtractTemporaryFile(ExpandConstant('cmd.cmd'));
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
if FileExists(ExpandConstant('{tmp}\cmd.cmd')) then begin
res := -1;
Exec('cmd.exe', ' /C ' + ExpandConstant('{tmp}\cmd.cmd'),ExpandConstant('{tmp}'),SW_HIDE,ewWaitUntilTerminated,res);
if (res > 0) then MsgBox('упс, ошибка выполнения батника' + ExpandConstant('{tmp}\cmd.cmd') + #13#10 + SysErrorMessage(res), mbInformation, MB_OK);
end
else
MsgBox('упс, файлика ' + ExpandConstant('{tmp}\cmd.cmd') + ' нет', mbInformation, MB_OK);
end; //if CurStep=ssInstall then begin
end;

end. //секции Code


могут быть орфографические ошибки, скобки или запятой не хватать.

Но вообще если батник мелкий лучше его в код инно перенести, а то может быть нестыковка, инно работает в кодировке СР1251, а батник - СР866. Привет ДОСу

ToBeLife
20-11-2012, 06:24
R.i.m.s.k.y.,
Спасибо за помощь.
Воспользуюсь вашим советом.

pritoreanic
20-11-2012, 07:01
Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.
http://s1.ipicture.ru/uploads/20121120/T1IVpTD3.jpg

Johny777
20-11-2012, 14:04
pritoreanic,

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
DirExistsWarning=no

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

[CustomMessages]
russian.ComponentsDescription0=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения. или как это реализовать через [Run], что бы первоначально запускался именно батник. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.
russian.ComponentsDescription2=В справке читай installation order, RUN выполняется самой последней секцией.
russian.ComponentsDescription3=Но вообще если батник мелкий лучше его в код инно перенести, а то может быть нестыковка, инно работает в кодировке СР1251, а батник - СР866. Привет ДОСу
russian.ComponentsDescription4=Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;

[Code]
var
DescRTV: TRichEditViewer;

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

procedure InitializeWizard;
begin
WizardForm.ComponentsList.Width := ScaleX(209);
WizardForm.ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;

DescRTV := TRichEditViewer.Create(nil)
with DescRTV do
begin
SetBounds(ScaleX(216), WizardForm.ComponentsList.Top, ScaleX(201), WizardForm.ComponentsList.Height);
Parent := WizardForm.SelectComponentsPage;
ReadOnly := True;
ScrollBars := ssVertical;
end;
end;

JHeavy
20-11-2012, 14:12
Приветствую, может быть вопрос задавался, но все же может кто нибудь ответит как в описании компонентов (как в примере выше), перенести строку описания на новую (ниже), 'описание' + 'описание' не помогает, хотя может не так что то делаю.
Спасибо.

pritoreanic
20-11-2012, 14:24
pritoreanic,
читать дальше » »

Спасибо тебе за код, но возникла проблема при попытке компиляции, выдает ошибку, можешь помочь с проблемой ?

http://s1.ipicture.ru/uploads/20121120/kcrH0eb2.jpg

Johny777
20-11-2012, 14:34
pritoreanic, скачай и поставь расширенную версию инно из шапки (ANSI)

JHeavy, так что-ли? описание начинается со слова "описание"

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
DirExistsWarning=no

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

[CustomMessages]
russian.Desc=описание:
russian.ComponentsDescription0=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения. или как это реализовать через [Run], что бы первоначально запускался именно батник. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.
russian.ComponentsDescription2=В справке читай installation order, RUN выполняется самой последней секцией.
russian.ComponentsDescription3=Но вообще если батник мелкий лучше его в код инно перенести, а то может быть нестыковка, инно работает в кодировке СР1251, а батник - СР866. Привет ДОСу
russian.ComponentsDescription4=Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;

[ Code]
var
DescRTV: TRichEditViewer;

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
if Index = -1 then DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1)) else DescRTV.Text := CustomMessage('Desc') + ' ' + CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

procedure InitializeWizard;
begin
WizardForm.ComponentsList.Width := ScaleX(209);
WizardForm.ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;

DescRTV := TRichEditViewer.Create(nil)
with DescRTV do
begin
SetBounds(ScaleX(216), WizardForm.ComponentsList.Top, ScaleX(201), WizardForm.ComponentsList.Height);
Parent := WizardForm.SelectComponentsPage;
ReadOnly := True;
ScrollBars := ssVertical;
end;
end;

JHeavy
20-11-2012, 14:56
Johny777, спасибо за ответ, а как сделать чтобы все что после "описание:" начиналось с новой строки типа-
Описание:
1. бла
2. блабла
3. блаблабла
Спасибо.

pritoreanic
20-11-2012, 15:25
Johny777

А как сделать выбор из двух одно, например выбор языка как на картинке
http://s1.ipicture.ru/uploads/20121120/T1IVpTD3.jpg

R.i.m.s.k.y.
20-11-2012, 15:56
pritoreanic, дык ответ в примере выше
[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;

pritoreanic
20-11-2012, 16:21
pritoreanic, дык ответ в примере выше »
[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;

Там ведь только обычные разделы и под разделы я же говорю про те "кругляшки" из двух кругляшков можно выбрать только один. как это сделать ?

R.i.m.s.k.y.
20-11-2012, 16:25
pritoreanic, или может ты флаг exclusive имел ввиду?
[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3; Flags: exclusive
Name: c\2; Description: 4; Flags: exclusive


чтение справки облегчает понимание, да

Johny777
20-11-2012, 19:25
JHeavy,

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
if Index = -1 then DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1)) else
DescRTV.Text := CustomMessage('Desc') + #13#10 + ' ' + CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

#13#10 - переход на новую строку
' ' - отступ. Неплохо ведь начать описание с абзаца :)

al70
21-11-2012, 00:16
Друзья, может кто сталкивался?
Нужно на самой последней странице инсталлятора, когда пользователю предлогают например:

[x] запустить приложение
[x] прочитать какой-либо файл
[x] посетить сайт

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

SoulSide
21-11-2012, 02:44
А как сделать выбор из двух одно, например выбор языка как на картинке »
Там ведь только обычные разделы и под разделы я же говорю про те "кругляшки" из двух кругляшков »
Используйте флаг (flags) в конце

Например у вас идёт что-то вроде:
[Components]
Name: a; Description: A
то, для того чтобы добавить флаг, нужно после Description: A сначала добавить точку с запятой ; а потом Flags: exclusive или Flags: fixed и.т.д. чтоб получилось примерно так Name: a; Description: A; Flags: exclusive


http://i5.imageban.ru/out/2012/11/21/19feb8b1af7ca424b2289330bc9c7d19.png
Flags: exclusive
Пример:
Name: a; Description: A; Flags: exclusive

http://i5.imageban.ru/out/2012/11/21/8eb8be170e8a4d900696b662b7e22e15.png
Flags: fixed
Пример:
Name: a; Description: A; Flags: fixed

http://i2.imageban.ru/out/2012/11/21/65e0af5f296b83786d62679135673790.png
Flags: checkablealone
Пример:
Name: a; Description: A; Flags: checkablealone


чтение справки облегчает понимание, да »Ни разу в руки не брал. Тут всего без справок хватает.

SoulSide
21-11-2012, 03:10
Нужно на самой последней странице инсталлятора, когда пользователю предлогают например:
[x] запустить приложение
[x] прочитать какой-либо файл
[x] посетить сайт »
Если совсем без заморочек, например через секцию [RUN]:
Запустить приложение
Filename: {app}\MyProg.exe; Description: запустить приложение; Flags: nowait postinstall skipifsilent

Прочитать какой-либо файл
Filename: {app}\readme.txt; Description: прочитать какой-либо файл; Flags: nowait postinstall skipifsilent
или
Filename: {src}\readme.txt; Description: прочитать какой-либо файл 2; Flags: nowait postinstall skipifsilent

Посетить сайт
Filename: {app}\site.url; Description: посетить сайт; Flags: nowait postinstall skipifsilent
или
Filename: {pf}\Internet Explorer\iexplore.exe; Description: посетить сайт; Parameters: http://www.google.com/; Flags: nowait postinstall skipifsilent
или
Filename: {pf}\Mozilla Firefox\firefox.exe; Description: посетить сайт; Parameters: http://www.google.com/; Flags: nowait postinstall skipifsilent
или
Filename: {pf}\Opera\opera.exe; Description: посетить сайт; Parameters: http://www.google.com/; Flags: nowait postinstall skipifsilent

JHeavy
21-11-2012, 11:30
Здравствуйте, подскажите как сделать чтобы в списке компонентов (чекбоксы) можно было выбрать только один из компонентов?

R.i.m.s.k.y.
21-11-2012, 11:41
JHeavy, проще пристрелить
на прошлой странице два раза ответили

________________

чтение справки облегчает понимание, да »
Ни разу в руки не брал. Тут всего без справок хватает. »
Я за инно взялся просто: из шапки качнул простых примеров, почитал в справке про что непонятно.
Именно тот случай когда Лучше день потерять, потом за пять минут долететь!

________________

al70 SoftLine

Посетить сайт можно проще

[RUN]
Filename: http://www.svp-team.com/wiki/Main_Page/ru; Description: посетить сайт; Flags: shellexec skipifsilent postinstall


Для открытия файла нужно добавлять shellexec для запуска приложения, привязанного к этому типу файлов

[RUN]
Filename: {app}\readme.txt; Description: прочитать какой-либо файл; Flags: shellexec postinstall skipifsilent




© OSzone.net 2001-2012