Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 5]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]
Скрипты Inno Setup. Помощь и советы [часть 4]

Отправлено: 03:49, 21-05-2012

 

Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата R.i.m.s.k.y.:
Цитировать »

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

Отправлено: 13:31, 21-11-2012 | #1301



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


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

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

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Последний раз редактировалось R.i.m.s.k.y., 21-11-2012 в 13:48.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:37, 21-11-2012 | #1302


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата R.i.m.s.k.y.:
Цитировать »

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

Отправлено: 14:08, 21-11-2012 | #1303


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


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;

в общем прошу по возможности помочь, тк иконки хороши (есть диск, сис, диск, флэшка)

PS: можно б было их и напрямую грузить, но не знаю где они лижат

Последний раз редактировалось Johny777, 22-11-2012 в 12:09.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:57, 22-11-2012 | #1304


Аватара для pritoreanic

Новый участник


Сообщения: 8
Благодарности: 2

Профиль | Отправить PM | Цитировать


Помогите пожалуйста убрать "выбор установки", затемнить правую половинку окна где описание к компонентам и еще почему то не работает строка "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;



Последний раз редактировалось pritoreanic, 23-11-2012 в 03:19.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:15, 22-11-2012 | #1305


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день! Имеется следующая конструкция

читать дальше »


Код: Выделить весь код
#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(фрейворк) они ставились по очереди(те поставилось приложение, а далее идет установка фрейворка). Сейчас, у меня происходит просто распаковка файла фрейворка в директорию, но он не запускается.
Спасибо.

Отправлено: 12:17, 22-11-2012 | #1306


Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


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

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:40, 22-11-2012 | #1307


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


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;

и убирай пожалуйста крупные коды и скрины под спойлер!
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:47, 22-11-2012 | #1308


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


R.i.m.s.k.y. Спасибо.

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

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

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

Код: Выделить весь код
#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

Отправлено: 14:40, 22-11-2012 | #1309


Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


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

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

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:49, 22-11-2012 | #1310



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход