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

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

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

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

Ветеран


Contributor


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


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

Профиль | Отправить 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

 

Аватара для Gnom_aka_Lexander

Ветеран


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

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


RodionSabitov, autorun.inf

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

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

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



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

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


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


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

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


Gnom_aka_Lexander, а в inno setup нет такой встроенной функции? в install shield'e была...

Отправлено: 14:41, 15-11-2012 | #1272


Аватара для Gnom_aka_Lexander

Ветеран


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

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


RodionSabitov, файл autorun.inf совершенно несложно заполнить вручную, для написания пары слов в текстовом файле нет нужды встраивать целый механизм его создания. К тому-же install shield - инструмент платный, и разработчикам необходимо оправдывать его платность. В том числе и ненужными опциями.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.


Отправлено: 14:53, 15-11-2012 | #1273


Аватара для Johny777

Ветеран


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

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


Цитата Gnom_aka_Lexander:
CD-ром-то зачем? С сд-ромом, инно и сама довольно красиво с помощью драйвтривива в одну строчку делает. дополнительные ухищрения как раз были нужны, чтоб исключить его, поскольку попытка установить туда что-либо приводит как минимум к ошибке и является маразмом. »
не собирался его добавлять. Закоментировал а сейчас и подавно удалил. Остались только
DRIVE_REMOVABLE = $2;
DRIVE_FIXED = $3;
Цитата Gnom_aka_Lexander:
ByteOrTB - несколько месяцев назад уважаемый Serega давал гораздо более корректный код. примерно в тех-же краях есть решение проблемы с определением размеров. Правда там с файлами, но по сути своей любой элемент системы является файлом, так что решение наверняка неподалеку. И не нужно копи ровать манеру форматирования кода Виктора Доброва, читать невозможно, чесслово. »
есть 2 функции на перевод байтов в удобочитаемую форму
1. http://forum.oszone.net/post-1882481-1175.html (юзаю в основном инсталле, тк он у меня двухязычный)
2. http://forum.oszone.net/post-1882594-1184.html (юзаю в остальных случаях. В том числе и для кода ниже)
и у меня нет размер файлов. Он не нужен. А размер дисков и инфа о них
короче вот допилил код
скрин:


в отличии от передыдущего кода это процедура которая пишет инфу в входную переменнную
свой тип
Код: Выделить весь код
type
  DriveInfo = record
    DriveLetter: String; // буква
    DriveName: String; // имя
    DriveFileSystemName: String; // файловая система
    DriveSize: Extended; // объём
    DriveFreeSize: array [0..1] of Extended; // 0) свободно и 1) в неокруглённом виде проценты 
    DriveType: String; // тип диска (локальный или съёмный)
  end;
используется массив DriveInfo
длина массива - кол-во хардов
каждый элемент массива содржит7 свойств

всё это выводится в TListView
код:
читать дальше »
Код: Выделить весь код
[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
  PDWORD = DWORD;
  

  DriveInfo = record
    DriveLetter: String;
    DriveName: String;
    DriveFileSystemName: String;
    DriveSize: Extended;
    DriveFreeSize: array [0..1] of Extended;
    DriveType: String;
  end;
  
const
  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: String; lpVolumeNameBuffer: String; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; 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 GetDiskFreeSpace(lpRootPathName: String; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; external 'GetDiskFreeSpace{#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;

procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
  i, e: Integer;
  UndefDriveLetter: String;
  DriveType: UINT;
  DriveSpecFullString: String;
  DrivePath: string;
  VolumeName, FileSystemName : string;
  ComponentLength, SerialNumber, FileSystemFlags: DWORD;
  Sec_Cluster, Bytes_Sec, Free_Clusters, Total_Clusters : DWORD;
  WinDrive: String;
begin
  WinDrive := Copy(ExpandConstant('{win}'),0,3);
  for i := 66 to 90 do // Loop from B..Z to determine available drives  (not A (65 to 90))
  begin
    UndefDriveLetter := chr(i) + ':\';
    DriveType := GetDriveType(UndefDriveLetter);
    case DriveType of
      DRIVE_REMOVABLE:
      begin
        VolumeName := StringOfChar(#32, MAX_PATH);
        FileSystemName := StringOfChar(#32, MAX_PATH);
        GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
        GetDiskFreeSpace(UndefDriveLetter, Sec_Cluster, Bytes_Sec, Free_Clusters, Total_Clusters);
        VolumeName := Trim(VolumeName)
        if 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 := Bytes_Sec * Sec_Cluster * Total_Clusters;
        DriveArray[e].DriveFreeSize[0] := Bytes_Sec * Sec_Cluster * Free_Clusters;
        DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]/DriveArray[e].DriveSize*100;
        DriveArray[e].DriveType := 'Съёмный диск';
      end;
      DRIVE_FIXED:                                          
      begin
        VolumeName := StringOfChar(#32, MAX_PATH);
        FileSystemName := StringOfChar(#32, MAX_PATH);
        GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
        GetDiskFreeSpace(UndefDriveLetter, Sec_Cluster, Bytes_Sec, Free_Clusters, Total_Clusters);     
        VolumeName := Trim(VolumeName)
        if 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 := Bytes_Sec * Sec_Cluster * Total_Clusters;
        DriveArray[e].DriveFreeSize[0] := Bytes_Sec * Sec_Cluster * Free_Clusters;
        DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]/DriveArray[e].DriveSize*100;
        if UndefDriveLetter = WinDrive then DriveArray[e].DriveType := 'Локальный диск(сис.)' else DriveArray[e].DriveType := 'Локальный диск';
      end;
    end;
  end;
end;


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


procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
  If Column = TListView(Sender).Column[1] then
end;


procedure InitializeWizard;
var
  ReadyArray: array of DriveInfo;
  DriveListView: TListView;
  NewColumn: TListColumn;
  ListItem: TListItem;
  ImgList: TImageList;
  bmp: TBitmap;
  i: Integer;
begin
  GetDrivesInfo(ReadyArray);
  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));


  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;

    ImgList := TImageList.Create(DriveListView);
    bmp := TBitmap.Create;
    bmp.LoadFromResourceName(HInstance, '_IS_DRIVE');
    ImgList.AddMasked(bmp, clFuchsia);
    bmp.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(65);

    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(110);

    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(BytesToSize(ReadyArray[i].DriveFreeSize[0]) + ' ' + '(' + IntToStr(Round(ReadyArray[i].DriveFreeSize[1])) + '%' + ')');
        SubItems.Add(ReadyArray[i].DriveType);
        case ReadyArray[i].DriveType of
            'Локальный диск': ImageIndex := 2
            'Локальный диск(сис.)': ImageIndex := 0
        else ImageIndex := 1;
        end;
      end;
    end;
  end;
  for i := 0 to DriveListView.Items.Count-1 do if Copy(WizardForm.DirEdit.Text, 0, 3) = DriveListView.Items.Item[i].Caption then DriveListView.Items.Item[i].Selected := True;// Focused := True;
end;


пацаны помогите пожалуйста
не знаю как сортировать элементы например по размеру свободному или полному
работает это метод метод CustomSort( @имя_каллбэк_функции, 0);
как здесь http://www.az-design.ru/index.shtml?.../SB58OnCompare
но прототип в инно TLVCompare = function(lParam1, lParam2, lParamSort: Integer): Integer;
и как им пользоваться фиг знает

и вторая просьба (не такая важная)
как правильно портировать функцию
function GetDiskFreeSpaceEx(lpDirectoryName: PWideChar;
var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes; lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;

function GetDiskFreeSpaceExA(lpDirectoryName: PAnsiChar;
var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes; lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;

function GetDiskFreeSpaceExW(lpDirectoryName: PWideChar;
var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes; lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;

я без понятия что такое PLargeInteger

буквы в ListView кликабельны

вот текстура для кода выше

Последний раз редактировалось Johny777, 22-04-2013 в 16:16.

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

Отправлено: 14:33, 17-11-2012 | #1274


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Johny777:
я без понятия что такое PLargeInteger »
Int64 я в ней использовал, когда в листвив делал.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

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

Отправлено: 14:37, 17-11-2012 | #1275


Аватара для Johny777

Ветеран


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

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


Gnom_aka_Lexander,
спасибо добрый человек ! понял
читать дальше »
Код: Выделить весь код
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

type
  Int64 = record
    Lo, Hi: Integer;
  end;
    
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: PAnsiChar; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: Int64): 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 Size64(Hi, Lo: Integer): Extended;
begin
  Result := Lo;
  if Lo < 0 then  Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
  for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
end;


procedure InitializeWizard;
var
  A, B, C : Int64;
begin
  GetDiskFreeSpaceEx('C:\', A, B, C);
  MsgBox('диск C:' + #13#10 +
         'Свободно' + ' ' + BytesToSize(Size64(A.Hi, A.Lo)) + #13#10 +
         'Общий размер' + ' ' + BytesToSize(Size64(B.Hi, B.Lo)) + #13#10 +
         'Ещё раз свободно:' + ' ' +  BytesToSize(Size64(C.Hi, C.Lo)), mbError, MB_OK);
end;


обновлённый код инфы о хардах:
читать дальше »
Код: Выделить весь код
[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
  PDWORD = DWORD;

  Int64 = record
    Lo, Hi: Integer;
  end;

  DriveInfo = record
    DriveLetter: String;
    DriveName: String;
    DriveFileSystemName: String;
    DriveSize: Extended;
    DriveFreeSize: array [0..1] of Extended;
    DriveType: String;
  end;
  
const
  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: String; lpVolumeNameBuffer: String; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; 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 GetDiskFreeSpace(lpRootPathName: String; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; external 'GetDiskFreeSpace{#A}@kernel32.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: PAnsiChar; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: Int64): 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 Size64(Hi, Lo: Integer): Extended;
begin
  Result := Lo;
  if Lo < 0 then  Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
  for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
end;


procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
  i, e: Integer;
  UndefDriveLetter: String;
  DriveType: UINT;
  DriveSpecFullString: String;
  DrivePath: string;
  VolumeName, FileSystemName : string;
  ComponentLength, SerialNumber, FileSystemFlags: DWORD;
  FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes : Int64;
  WinDrive: String;
begin
  WinDrive := Copy(ExpandConstant('{win}'),0,3);
  for i := 66 to 90 do // Loop from B..Z to determine available drives  (not A (65 to 90))
  begin
    UndefDriveLetter := chr(i) + ':\';
    DriveType := GetDriveType(UndefDriveLetter);
    case DriveType of
      DRIVE_REMOVABLE:
      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);
        VolumeName := Trim(VolumeName)
        if 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.Hi, TotalNumberOfBytes.Lo);
        DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes.Hi, TotalNumberOfFreeBytes.Lo);
        DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]/DriveArray[e].DriveSize*100;
        DriveArray[e].DriveType := 'Съёмный диск';
      end;
      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);
        VolumeName := Trim(VolumeName)
        if 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.Hi, TotalNumberOfBytes.Lo);
        DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes.Hi, TotalNumberOfFreeBytes.Lo);
        DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]/DriveArray[e].DriveSize*100;
        if UndefDriveLetter = WinDrive then DriveArray[e].DriveType := 'Локальный диск(сис.)' else DriveArray[e].DriveType := 'Локальный диск';
      end;
    end;
  end;
end;


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


procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
  If Column = TListView(Sender).Column[1] then
end;


procedure InitializeWizard;
var
  ReadyArray: array of DriveInfo;
  DriveListView: TListView;
  NewColumn: TListColumn;
  ListItem: TListItem;
  ImgList: TImageList;
  bmp: TBitmap;
  i: Integer;
begin
  GetDrivesInfo(ReadyArray);
  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));


  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;

    ImgList := TImageList.Create(DriveListView);
    bmp := TBitmap.Create;
    bmp.LoadFromResourceName(HInstance, '_IS_DRIVE');
    ImgList.AddMasked(bmp, clFuchsia);
    bmp.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(65);

    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(110);

    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(BytesToSize(ReadyArray[i].DriveFreeSize[0]) + ' ' + '(' + IntToStr(Round(ReadyArray[i].DriveFreeSize[1])) + '%' + ')');
        SubItems.Add(ReadyArray[i].DriveType);
        case ReadyArray[i].DriveType of
            'Локальный диск': ImageIndex := 2
            'Локальный диск(сис.)': ImageIndex := 0
        else ImageIndex := 1;
        end;
      end;
    end;
  end;
  for i := 0 to DriveListView.Items.Count-1 do if Copy(WizardForm.DirEdit.Text, 0, 3) = DriveListView.Items.Item[i].Caption then DriveListView.Items.Item[i].Selected := True;// Focused := True;
end;

проверьте пожалуйста у кого юникодная инно под рукой. Всё ли правильно работает. Чисто для статистики

теперь осталось только соритровать элементы. Не знаю как
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:44, 17-11-2012 | #1276


Аватара для nik1967

Старожил


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

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


Цитата Johny777:
проверьте пожалуйста у кого юникодная инно под рукой. Всё ли правильно работает. Чисто для статистики»
Добавил пару точек с запятой, но в результате пишет, что

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".

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

Отправлено: 08:56, 18-11-2012 | #1277


Аватара для Gnom_aka_Lexander

Ветеран


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

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


поэтому я и отказался делать на инно, что очень сложно сделать так, чтоб и в анси и в юникоде работало и сделал в длл-ке.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.


Отправлено: 10:08, 18-11-2012 | #1278


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Johny777:
BitmapResource »
во первых, желательно сохранить совместимость со стандартной версией инно - могу сказать, что это возможно. Во вторых - иконки можно и лучше брать системные - это тоже возможно и намного лучше, чем использовать левые изображения. к примеру меня напрягает, когда флешку отображает иконка нормального жесткого диска.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

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

Отправлено: 14:11, 18-11-2012 | #1279


Аватара для Johny777

Ветеран


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

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


Gnom_aka_Lexander, как системные иконки прикрутить?
можешь пожалуйста подправить код?
меня например замки не устраивают. Но картинки такие маленькие, что ничего лучше не нашёл
на юникоде тестил? У тебя работает?

Отправлено: 14:20, 18-11-2012 | #1280



Компьютерный форум 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




 
Переход