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

al70
21-11-2012, 13:31
Цитировать »


Вы не поняли. Поставить на последнюю страницу URL или файл я могу и в этом сложного ничего нет. Мне надо после того как прошла установка в зависимости от результата показать чекбокс "порейти на сайт", а вот урл должен иметь возможность измениться в зависимости от результатов установки.

R.i.m.s.k.y.
21-11-2012, 13:37
al70, использовать Check не вариант?


[CODE]
Function Check1():boolean;
begin
//твоя проверка
end;
Function Check2():boolean;
begin
//твоя проверка нумер 2
end;

[RUN]
Check: Check1; Filename: http://www.svp-team.com/wiki/Main_Page/ru; Description: посетить сайт; Flags: shellexec skipifsilent postinstall
Check: not Check1; Filename: http://microsoft.com; Description: посетить другой сайт; Flags: shellexec skipifsilent postinstall


Если подчековая функция возвращает ТРУ - строчка скрипта выполняется, если фолсе - строчка пропускается и следов от нее нет.
Или опять не то?

al70
21-11-2012, 14:08
Цитировать »


В точку, спасибо!

Johny777
22-11-2012, 11:57
El Sanchez, я заметил, что в TFolderTreeView иконки другие (покрасивее). Судя по исходному коду инно там используется функция ShellAPI:
function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall';
твой код вывода данных о хардах у меня в 2-х видах:
1: малость упрощённый для инсталла халфы (без процентов и инфы о файловой системе)
2: оригинал как есть
я портировал вот этот код http://delphiworld.narod.ru/base/get_filetype_ico.html в свою модифицированную версию
работает, но код стал медленнее

[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

const
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVABLE = 2;
DRIVE_FIXED = 3;
MAX_PATH = 260;
SHGFI_SYSICONINDEX = 16384;
SHGFI_SMALLICON = 1;
SHGFI_LARGEICON = 0;
SFGAO_SHARE = 131072;

type
_SHFILEINFO = record
hIcon: HICON; { out: icon }
iIcon: Integer; { out: icon index }
dwAttributes: DWORD; { out: SFGAO_ flags }
szDisplayName: array [0..MAX_PATH-1] of Char; { out: display name (or path) }
szTypeName: array [0..79] of Char; { out: type name }
end;

TIconType = (itSmall, itLarge);

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

DriveInfo = record
DriveLetter: String;
DriveName: String;
DriveSize: Extended;
DriveFreeSize: Extended;
DriveType: String;
end;


function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall';
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].DriveSize := Size64(TotalNumberOfBytes);
DriveArray[e].DriveFreeSize := Size64(TotalNumberOfFreeBytes);
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;

function GetIcon(const FileName: string): TIcon;
var
FileInfo: _SHFILEINFO;
ImageList: TImageList;
IT: DWORD;
begin
IT := SHGFI_SMALLICON;
Result := TIcon.Create;
ImageList := TImageList.Create(nil);
// FillChar(FileInfo, Sizeof(FileInfo), #0);
ImageList.ShareImages := true;
ImageList.Handle := SHGetFileInfo(
PChar(FileName),
SFGAO_SHARE,
FileInfo,
sizeof(FileInfo),
IT or SHGFI_SYSICONINDEX
);
ImageList.GetIcon(FileInfo.iIcon, Result);
ImageList.Free;
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);
for i := 0 to GetArrayLength(ReadyArray)-1 do ImgList.AddIcon(GetIcon(ReadyArray[i].DriveLetter));
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(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(BytesToSize(ReadyArray[i].DriveSize));
SubItems.Add(BytesToSize(ReadyArray[i].DriveFreeSize));
SubItems.Add(ReadyArray[i].DriveType);
ImageIndex := i;
end;
end;
end;
end;

решил улучшить
и заметил что в структуре

type
_SHFILEINFO = record
hIcon: HICON; { out: icon }
iIcon: Integer; { out: icon index }
dwAttributes: DWORD; { out: SFGAO_ flags }
szDisplayName: array [0..MAX_PATH-1] of Char; { out: display name (or path) }
szTypeName: array [0..79] of Char; { out: type name }
end;


есть инфа о икинке hIcon: HICON;
а это как я понимаю тоже самое что в твоей функции загрузки иконки
function ExtractIcon(hInst: THandle; lpszExeFileName: String; nIconIndex: UINT): HICON; external 'ExtractIcon{#A}@shell32.dll stdcall';
получился такой код, но иконки не отобржаются (не пойму что не так сделал)

[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
const
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVABLE = 2;
DRIVE_FIXED = 3;
MAX_PATH = 260;
SHGFI_SYSICONINDEX = 16384;
SHGFI_SMALLICON = 1;
SHGFI_LARGEICON = 0;
SFGAO_SHARE = 131072;

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

_SHFILEINFO = record
hIcon: HICON; { out: icon }
iIcon: Integer; { out: icon index }
dwAttributes: DWORD; { out: SFGAO_ flags }
szDisplayName: array [0..MAX_PATH-1] of Char; { out: display name (or path) }
szTypeName: array [0..79] of Char; { out: type name }
end;

TIconType = (itSmall, itLarge);

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

function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall';
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;
FileInfo: _SHFILEINFO;
ImageList: TImageList;
IT: DWORD;
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 := 'Локальный диск';
SHGetFileInfo(UndefDriveLetter, SFGAO_SHARE, DriveArray[e].DriveIcon, sizeof(DriveArray[e].DriveIcon), IT or SHGFI_SYSICONINDEX );
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, e: 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);
e := GetArrayLength(ReadyArray)-1;

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);
for i := 0 to e do
begin
ico := TIcon.Create;
ico.Handle := ReadyArray[0].DriveIcon.hIcon;
ImgList.AddIcon(ico);
ico.Free;
end;
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 e 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 := i;
// end;
end;
end;
end;
end;

в общем прошу по возможности помочь, тк иконки хороши (есть диск, сис, диск, флэшка)
http://img12.imageshack.us/img12/939/54815219.png (http://imageshack.us/photo/my-images/12/54815219.png/)
PS: можно б было их и напрямую грузить, но не знаю где они лижат :(

pritoreanic
22-11-2012, 12:15
Помогите пожалуйста убрать "выбор установки", затемнить правую половинку окна где описание к компонентам и еще почему то не работает строка "russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание." когда курсор не наведен с право в окне пусто.


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

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

[CustomMessages]
russian.Desc=Описание:
russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание.
russian.ComponentsDescription1=Minecraft 1.4.5
russian.ComponentsDescription2=1.
russian.ComponentsDescription3=12.
russian.ComponentsDescription4=123.
russian.ComponentsDescription5=1234.
russian.ComponentsDescription6=12345.
russian.ComponentsDescription7=123456.
russian.ComponentsDescription8=1234567.
russian.ComponentsDescription9=12345678.
russian.ComponentsDescription10=123456789.
russian.ComponentsDescription11=SMP-123.

[Components]
Name: main; Description: Minecraft; Flags: fixed; Types: custom compact full
Name: c\1; Description: rus; Flags: exclusive
Name: c\2; Description: eng; Flags: exclusive
Name: Component1; Description: kom;
Name: c\1; Description: AudioMod; Flags: fixed; Types: custom compact full
Name: c\2; Description: ModLoader; Flags: fixed; Types: custom compact full
Name: c\3; Description: Optifine;
Name: c\4; Description: TooManyItem;
Name: c\5; Description: Rei's Minimap;
Name: Component2; Description: s;
Name: c\1; Description: SMP-s;

[Files]
Source: "C:\InstallFiles\main\Minecraft.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: C:\InstallFiles\main\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: main
Source: C:\InstallFiles\comp1\*; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: C:\InstallFiles\comp2\*; DestDir: {app}; Flags: ignoreversion; Components: Component2

[.code]
procedure RedesignWizardForm;
begin
end;

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
RedesignWizardForm;
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;

http://s1.ipicture.ru/uploads/20121122/JUXvWUsR.jpg

InnoQuest
22-11-2012, 12:17
Добрый день! Имеется следующая конструкция





#define MyAppName "KMBD"
#define MyAppVerName "KMBD Setup"
#define MyAppPublisher "NIC MVD"
#define MyAppExeName "ModelApp.exe"
#define MyFrameWorkName "dotNetFx40_Full_x86_x64.exe"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=C:\OutPUt
OutputBaseFilename=setup
SetupIconFile=C:\Users\NIC\Desktop\Install\res\KMBD1311\RunApp\tank.ico
Compression=lzma
SolidCompression=yes

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Languages]
Name: "russian"; MessagesFile: "compiler:Default.isl"

[Components]
Name: KMBD; Description: Пакет KMBD; Types: full custom;
Name: MAP; Description: Карта; Types: full custom;
Name: Framework; Description: .NET Framework 4.0; Types:custom;

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
;Source: "C:\Users\NIC\Desktop\Install\res\KMBD1311\RunApp\ModelApp.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\NIC\Desktop\Install\res\KMBD1311\*"; DestDir: "{app}"; Components: KMBD; Flags: ignoreversion recursesubdirs createallsubdirs
;Source: "C:\Users\NIC\Desktop\Install\res\100_BL_G v4\*"; DestDir: "{app}\Map";Components: MAP; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\NIC\Desktop\Install\res\.NET Framework 4.0\dotNetFx40_Full_x86_x64.exe*"; DestDir: "{app}\.NET Framework 4.0"; Components:Framework ; Flags: ignoreversion recursesubdirs createallsubdirs


[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\RunApp\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
Filename: "{app}\.NET Framework 4.0\{#MyFrameWorkName}"; Description: "{cm:LaunchProgram,{#MyFrameWorkName}}"; Flags: nowait postinstall skipifsilent





3 компонента которые можно устанавливать по выбору. 1 главный компонент с exe файлом, с возможностью создания ярлыка на рабочем столе запуске приложения после установки. 2 компонент это просто папка с файлами там нет exe 3 компонент фрейворк (один экзешник).
Подскажите как сделать чтобы, например, когда мы хотим установить только компонент два, не было пункта (чекбоксов) хотите ли вы поместить ярлык на рабочих стол или запуск после установки(так как будет высыпаться ошибка, оно и понятно там нет исполняемых файлов). Эти пункты должны быть только для первого приложения.
Как сделать чтобы при выборе компонента 1 с компонентом 3(фрейворк) они ставились по очереди(те поставилось приложение, а далее идет установка фрейворка). Сейчас, у меня происходит просто распаковка файла фрейворка в директорию, но он не запускается.
Спасибо.

R.i.m.s.k.y.
22-11-2012, 12:40
InnoQuest, а ответ один - добавлять к строчкам параметр Components: 1 2 3
1.
[Files]
Components:KMBD; Source: "C:\Users\NIC\Desktop\Install\res\KMBD1311\*"; DestDir: "{app}"; Components: KMBD; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Components:KMBD; Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"

2.
[Tasks]
Components: MAP and not (KMBD and Framework); Name: desktopicon; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Components: MAP and not (KMBD and Framework); Name: quicklaunchicon; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Tasks: desktopicon; Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}";
Tasks: quicklaunchicon; Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}";

3. не надо было ставить флаг nowait, вот установщик и nowait. Флаг postinstall формирует галочку на последней странице установщика с описанием Description
[Run]
Components: KMBD; Filename: "{app}\RunApp\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: postinstall skipifsilent
Components: Framework; Filename: "{app}\.NET Framework 4.0\{#MyFrameWorkName}"; Description: "{cm:LaunchProgram,{#MyFrameWorkName}}"; Flags: skipifsilent

Johny777
22-11-2012, 13:47
pritoreanic, пардон за недоработку. Исправил!

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

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

[CustomMessages]
russian.Desc=Описание:
russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание.
russian.ComponentsDescription1=Minecraft 1.4.5
russian.ComponentsDescription2=1.
russian.ComponentsDescription3=12.
russian.ComponentsDescription4=123.
russian.ComponentsDescription5=1234.
russian.ComponentsDescription6=12345.
russian.ComponentsDescription7=123456.
russian.ComponentsDescription8=1234567.
russian.ComponentsDescription9=12345678.
russian.ComponentsDescription10=123456789.
russian.ComponentsDescription11=SMP-123.

[Components]
Name: main; Description: Minecraft; Flags: fixed; Types: custom compact full
Name: c\1; Description: rus; Flags: exclusive
Name: c\2; Description: eng; Flags: exclusive
Name: Component1; Description: kom;
Name: c\1; Description: AudioMod; Flags: fixed; Types: custom compact full
Name: c\2; Description: ModLoader; Flags: fixed; Types: custom compact full
Name: c\3; Description: Optifine;
Name: c\4; Description: TooManyItem;
Name: c\5; Description: Rei's Minimap;
Name: Component2; Description: s;
Name: c\1; Description: SMP-s;

[Files]
Source: "C:\InstallFiles\main\Minecraft.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: C:\InstallFiles\main\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: main
Source: C:\InstallFiles\comp1\*; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: C:\InstallFiles\comp2\*; DestDir: {app}; Flags: ignoreversion; Components: Component2

[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
with WizardForm do
begin
ComponentsList.SetBounds(ScaleX(0), SelectComponentsLabel.Top + SelectComponentsLabel.Height + ScaleY(5), (SelectComponentsPage.Width - ScaleX(5)) div 2, ScaleY(165));
ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;
TypesCombo.Hide;


DescRTV := TRichEditViewer.Create(nil)
with DescRTV do
begin
Parent := SelectComponentsPage;
SetBounds(ComponentsList.Left + ComponentsList.Width + ScaleX(5), ComponentsList.Top, ComponentsList.Width, ComponentsList.Height);
ReadOnly := True;
ScrollBars := ssVertical;
Color := clBtnFace;
RTFText := CustomMessage('ComponentsDescription0');
end;
end;
end;

и убирай пожалуйста крупные коды и скрины под спойлер!

InnoQuest
22-11-2012, 14:40
R.i.m.s.k.y. Спасибо.

Еще 3 проблемы возникло, если не трудно дайте наводку куда копать

1) При обычной установки (те когда выбран 1и/или второй компонент), вылазит ошибка, что мол не могу запустить 3компонент(хотя он и не был выбран для установки), установка проходит нормально, но не пойму почему он пытается выполнить 3 компонент?
2) Если устанавливать только второй компонент(это простая папка с файлами без экзешника, по сути нужно е просто распаковать), в конце тоже появляется окно предлагающее запустить KMBD, ну и естественно ошибка из вопроса номер 1 вылазит.
3) Если устанавливаем только 3 компонент(фрейворк- простой экзешник), все проходит нормально(тут кстати нет ошибки что не удается запустить 1 компонент), но в конце опять тоже окошко о запуске KMBD(хоть мы его и не выбирали) .

Я так понимаю нужно какую-то проверку написать в тегах на то какие компоненты выбраны и какой из [Run] запускать в завимости от выбранного
В принципе если закомментить все Source вы можете посмотреть логику работы установщика
Буду благодарен за помощь, а то завтра нужно проект показывать уже, а установщик сырой
Сейчас выглядит так

[CODE]

#define MyAppName "KMBD"
#define MyAppVerName "KMBD Setup"
#define MyAppPublisher "NIC MVD"
#define MyAppExeName "ModelApp.exe"
#define MyFrameWorkName "dotNetFx40_Full_x86_x64.exe"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=C:\OutPUt
OutputBaseFilename=setup
SetupIconFile=C:\Users\NIC\Desktop\Install\res\KMBD1311\RunApp\tank.ico
Compression=lzma
SolidCompression=yes

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Languages]
Name: "russian"; MessagesFile: "compiler:Default.isl"

[Components]
Name: KMBD; Description: Пакет KMBD; Types: full custom;
Name: MAP; Description: Карта; Types: full custom;
Name: Framework; Description: .NET Framework 4.0; Types:custom;

[Tasks]
Components: KMBD and not (MAP and Framework);Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Components: KMBD and not (MAP and Framework);Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
;Source: "C:\Users\NIC\Desktop\Install\res\KMBD1311\RunApp\ModelApp.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\NIC\Desktop\Install\res\KMBD1311\*"; DestDir: "{app}"; Components: KMBD; Flags: ignoreversion recursesubdirs createallsubdirs
;Source: "C:\Users\NIC\Desktop\Install\res\100_BL_G v4\*"; DestDir: "{app}\Map";Components: MAP; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\NIC\Desktop\Install\res\.NET Framework 4.0\dotNetFx40_Full_x86_x64.exe*"; DestDir: "{app}\.NET Framework 4.0"; Components:Framework ; Flags: ignoreversion recursesubdirs createallsubdirs


[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\RunApp\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: postinstall skipifsilent
Filename: "{app}\.NET Framework 4.0\{#MyFrameWorkName}"; Description: "{cm:LaunchProgram,{#MyFrameWorkName}}"; Flags: skipifsilent

R.i.m.s.k.y.
22-11-2012, 14:49
Еще 3 проблемы возникло, если не трудно дайте наводку куда копать
1) При обычной установки (те когда выбран 1и/или второй компонент), вылазит ошибка, что мол не могу запустить 3компонент(хотя он и не был выбран для установки), установка проходит нормально, но не пойму почему он пытается выполнить 3 компонент?
2) Если устанавливать только второй компонент(это простая папка с файлами без экзешника, по сути нужно е просто распаковать), в конце тоже появляется окно предлагающее запустить KMBD, ну и естественно ошибка из вопроса номер 1 вылазит.
3) Если устанавливаем только 3 компонент(фрейворк- простой экзешник), все проходит нормально(тут кстати нет ошибки что не удается запустить 1 компонент), но в конце опять тоже окошко о запуске KMBD(хоть мы его и не выбирали) . »
потому что ты его запускаешь в секции Run второй строчкой, ты
а) не понял что я писал в прошлом посте для тебя и
б) недокопировал что я писал в прошлом посте для тебя

Я так понимаю нужно какую-то проверку написать в тегах[code] на то какие компоненты выбраны и какой из [Run] запускать в завимости от выбранного »
не нужно

El Sanchez
22-11-2012, 14:53
Судя по исходному коду инно там используется функция ShellAPI:
function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall'; »
Johny777, хорошая функция, пригодится.

получился такой код, но иконки не отобржаются (не пойму что не так сделал) »
Johny777, функция SHGetFileInfo с флагом SHGFI_SYSICONINDEX не возвращала хэндл иконки, плюс ошибка в строке ico.Handle := ReadyArray[0].DriveIcon.hIcon;. Предлагаю так:


[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

const
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVABLE = 2;
DRIVE_FIXED = 3;
MAX_PATH = 260;
SHGFI_ICON = $100;
SHGFI_SMALLICON = $1;
SHGFI_DISPLAYNAME = $200;
SHGFI_TYPENAME = $400;

type
_SHFILEINFO = record
hIcon: HICON;
iIcon: Integer;
dwAttributes: DWORD;
szDisplayName: array [0..MAX_PATH-1] of Char;
szTypeName: array [0..79] of Char;
end;

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

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


function SHGetFileInfo(pszPath: String; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall';
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 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 CharArrayToString(cArray: array of Char): String;
begin
Result := '';
while cArray[Length(Result)] <> #0 do Insert(cArray[Length(Result)], Result, Length(Result)+1);
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;
iIcon: WORD;
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);
SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
e := GetArrayLength(DriveArray)-1;
SHGetFileInfo(UndefDriveLetter, FILE_ATTRIBUTE_DIRECTORY, DriveArray[e].DriveIcon, sizeof(DriveArray[e].DriveIcon), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_TYPENAME or SHGFI_DISPLAYNAME);
DriveArray[e].DriveName := CharArrayToString(DriveArray[e].DriveIcon.szDisplayName);
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;
DriveArray[e].DriveType := CharArrayToString(DriveArray[e].DriveIcon.szTypeName);
end;
DRIVE_NO_ROOT_DIR: Continue;
end;
end;
end;


procedure DriveListViewOnClick(Sender: TObject);
begin
if Assigned(TListView(Sender).Selected) then
WizardForm.DirEdit.Text := AddBackSlash(Copy(TListView(Sender).Selected.Caption, Pos('(', TListView(Sender).Selected.Caption)+1, 2)) + 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, e: 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);
e := GetArrayLength(ReadyArray)-1;

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);
ImgList.BkColor := Color;
for i := 0 to e do
begin
ico := TIcon.Create;
ico.Handle := ReadyArray[i].DriveIcon.hIcon;
ImgList.AddIcon(ico);
ico.Free;
end;
SmallImages := ImgList;

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

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 e do
begin
ListItem := Items.Add;
with ListItem do
begin
Caption := 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);
ImageIndex := i;
end;
end;
end;
end;

InnoQuest
22-11-2012, 15:31
R.i.m.s.k.y.
Спасибо понял где ошибся

pritoreanic
23-11-2012, 03:22
pritoreanic, пардон за недоработку. Исправил!

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

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

[CustomMessages]
russian.Desc=Описание:
russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание.
russian.ComponentsDescription1=Minecraft 1.4.5
russian.ComponentsDescription2=1.
russian.ComponentsDescription3=12.
russian.ComponentsDescription4=123.
russian.ComponentsDescription5=1234.
russian.ComponentsDescription6=12345.
russian.ComponentsDescription7=123456.
russian.ComponentsDescription8=1234567.
russian.ComponentsDescription9=12345678.
russian.ComponentsDescription10=123456789.
russian.ComponentsDescription11=SMP-123.

[Components]
Name: main; Description: Minecraft; Flags: fixed; Types: custom compact full
Name: c\1; Description: rus; Flags: exclusive
Name: c\2; Description: eng; Flags: exclusive
Name: Component1; Description: kom;
Name: c\1; Description: AudioMod; Flags: fixed; Types: custom compact full
Name: c\2; Description: ModLoader; Flags: fixed; Types: custom compact full
Name: c\3; Description: Optifine;
Name: c\4; Description: TooManyItem;
Name: c\5; Description: Rei's Minimap;
Name: Component2; Description: s;
Name: c\1; Description: SMP-s;

[Files]
Source: "C:\InstallFiles\main\Minecraft.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: C:\InstallFiles\main\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: main
Source: C:\InstallFiles\comp1\*; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: C:\InstallFiles\comp2\*; DestDir: {app}; Flags: ignoreversion; Components: Component2

[.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
with WizardForm do
begin
ComponentsList.SetBounds(ScaleX(0), SelectComponentsLabel.Top + SelectComponentsLabel.Height + ScaleY(5), (SelectComponentsPage.Width - ScaleX(5)) div 2, ScaleY(165));
ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;
TypesCombo.Hide;


DescRTV := TRichEditViewer.Create(nil)
with DescRTV do
begin
Parent := SelectComponentsPage;
SetBounds(ComponentsList.Left + ComponentsList.Width + ScaleX(5), ComponentsList.Top, ComponentsList.Width, ComponentsList.Height);
ReadOnly := True;
ScrollBars := ssVertical;
Color := clBtnFace;
RTFText := CustomMessage('ComponentsDescription0');
end;
end;
end;

Спасибо тебе за помощь.
Есть еще проблема с появлением сообщения на скриншоте.
Еще когда наводишь на все компоненты кроме SMP-s сообщение "russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание." не показывает.

http://s1.ipicture.ru/uploads/20121123/7jZO4wll.jpg

R.i.m.s.k.y.
23-11-2012, 08:32
Есть еще проблема с появлением сообщения на скриншоте. »

Используй флаг disablenouninstallwarning в секции [Components]

По второму вопросу, не знаю поможет или нет, я бы в конце процедуры ComponentsListOnItemMouseMove добавил WizardForm.ComponentsList.Repaint.

JHeavy
23-11-2012, 11:49
R.i.m.s.k.y.,
проще пристрелить
на прошлой странице два раза ответили »
Ну вообще то, меня интересовало как сделать такой выбор чекбоксами, т.е. если выбрать один чекбокс выбор с другого снимается, а не флагом exclusive, но все равно спасибо.

R.i.m.s.k.y.
23-11-2012, 11:51
Ну вообще то, меня интересовало как сделать такой выбор чекбоксами, а не флагом exclusive, но все равно спасибо »
убрать флаг exclusive, или задача сложнее описываемой?

JHeavy
23-11-2012, 11:54
Да я просто не правильно объясняю похоже, если есть группа чекбоксов, как правило можно выбрать несколько, а мне нужно чтобы при выборе одного снималась галка с другого

pritoreanic
23-11-2012, 13:50
R.i.m.s.k.y. спасибо с первой проблемой помог.

У меня тут проблема, сообщение "russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание." не появляется если выводить мышку в стороны красных стрелок и появляется где зеленая стрелка, как сделать что бы это сообщение появлялось в любом случае ?
http://s1.ipicture.ru/uploads/20121123/Q1xQFEpL.jpg

R.i.m.s.k.y.
23-11-2012, 13:55
pritoreanic, хз

Mailchik
23-11-2012, 15:45
pritoreanic, [Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

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

[CustomMessages]
russian.Desc=Описание:
russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание.
russian.ComponentsDescription1=Minecraft 1.4.5
russian.ComponentsDescription2=1.
russian.ComponentsDescription3=12.
russian.ComponentsDescription4=123.
russian.ComponentsDescription5=1234.
russian.ComponentsDescription6=12345.
russian.ComponentsDescription7=123456.
russian.ComponentsDescription8=1234567.
russian.ComponentsDescription9=12345678.
russian.ComponentsDescription10=123456789.
russian.ComponentsDescription11=SMP-123.

[Components]
Name: main; Description: Minecraft; Flags: fixed; Types: custom compact full
Name: c\1; Description: rus; Flags: exclusive
Name: c\2; Description: eng; Flags: exclusive
Name: Component1; Description: kom;
Name: c\1; Description: AudioMod; Flags: fixed; Types: custom compact full
Name: c\2; Description: ModLoader; Flags: fixed; Types: custom compact full
Name: c\3; Description: Optifine;
Name: c\4; Description: TooManyItem;
Name: c\5; Description: Rei's Minimap;
Name: Component2; Description: s;
Name: c\1; Description: SMP-s;

[Files]
Source: "C:\InstallFiles\main\Minecraft.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: C:\InstallFiles\main\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: main
Source: C:\InstallFiles\comp1\*; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: C:\InstallFiles\comp2\*; DestDir: {app}; Flags: ignoreversion; Components: Component2

[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 ComponentsListOnMouseLeave(Sender: TObject);
begin
DescRTV.Text := CustomMessage('ComponentsDescription0');
end;

procedure InitializeWizard;
begin
with WizardForm do
begin
ComponentsList.SetBounds(ScaleX(0), SelectComponentsLabel.Top + SelectComponentsLabel.Height + ScaleY(5), (SelectComponentsPage.Width - ScaleX(5)) div 2, ScaleY(165));
ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;
ComponentsList.OnMouseLeave := @ComponentsListOnMouseLeave;
TypesCombo.Hide;


DescRTV := TRichEditViewer.Create(nil)
with DescRTV do
begin
Parent := SelectComponentsPage;
SetBounds(ComponentsList.Left + ComponentsList.Width + ScaleX(5), ComponentsList.Top, ComponentsList.Width, ComponentsList.Height);
ReadOnly := True;
ScrollBars := ssVertical;
Color := clBtnFace;
RTFText := CustomMessage('ComponentsDescription0');
end;
end;
end;
JHeavy, [Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: Test; Description: Test1; Types: Full;
Name: Test2; Description: Test22;

[Code]
procedure CompOnClick(Sender: TObject);
begin
with WizardForm.ComponentsList do begin
case ItemIndex of
0 : Checked[1] := False;
1 : Checked[0] := False;
end;
end;
end;

procedure InitializeWizard();
begin
with WizardForm.ComponentsList do begin
OnClickCheck:= @CompOnClick;
CompOnClick(nil);
end;
end;




© OSzone.net 2001-2012