Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
Mailchik
14-11-2012, 17:09
ChVL, так не пойдёт?ExpandConstant('{win}\system32')
Gnom_aka_Lexander
14-11-2012, 17:50
Johny777, CD-ром-то зачем? С сд-ромом, инно и сама довольно красиво с помощью драйвтривива в одну строчку делает. дополнительные ухищрения как раз были нужны, чтоб исключить его, поскольку попытка установить туда что-либо приводит как минимум к ошибке и является маразмом.
ByteOrTB - несколько месяцев назад уважаемый Serega давал гораздо более корректный код. примерно в тех-же краях есть решение проблемы с определением размеров. Правда там с файлами, но по сути своей любой элемент системы является файлом, так что решение наверняка неподалеку. И не нужно копи ровать манеру форматирования кода Виктора Доброва, читать невозможно, чесслово.
Mailchik,
А какую использовать функцию или процедуру?
Gnom_aka_Lexander
14-11-2012, 18:45
ChVL, если секция файлов, то именно так и указывать : {win}\system32, Mailchik, дал пример для секции кода.
но есть у меня сомнения, что прокатит, правда мизерные - теоретически должно.
Gnom_aka_Lexander,
Понял. Это я пробовал, и даже начиная с С:\ не проходит.
Похоже, дохлый номер... На ru-board'e молчат. Задал вопрос на сайте inno в Newsgroups, вдруг кто-то знает - это уже последняя инстанция.
А жаль... Очень надо.
Gnom_aka_Lexander
14-11-2012, 22:07
Я подозревал такое дело. от имени админа с путем {win}\system32 тоже никак?
Стандартные папки (http://forum.oszone.net/post-1218002-103.html) из шапки с флагом CSIDL_SYSTEM не пробовал?
El Sanchez
14-11-2012, 22:42
Как прописать путь к папке System32 в Win 7 х64?
Любой способ записи через секцию [Files] приводит к тому, что файлы попадают в папку SysWOW64, а надо именно System32. »
ChVL, нужно использовать флаг 64bit для отключения перенаправления.
[Files]
Source: file.txt; DestDir: {sys}; Flags: 64bit; Check: IsWin64
El Sanchez,
Yes-s!! Работает. Спасибо!
Дык, об этом флаге надо знать. Задача, видимо, достаточно редкая, раз о её решении мало кто знает.
Я уж пытался решить левым путём: скопировать из папки SysWOW64 в папку System32, так тоже перенаправляет.
Snoopak96
15-11-2012, 08:42
ChVL,
Есть такая функция Wow64EnableWow64FsRedirection, отрубает всё перенапровленние в винде x64, но в неопытных руках она опасна, так что лучше юзай как предложил Эль Санчез :cool
RodionSabitov
15-11-2012, 13:58
Ребята, простой вопрос:
в inno setup делаю инсталлятор с сохранением setup на жесткий диск. как сделать установочный диск DVD\CD с автозапуском?
Gnom_aka_Lexander
15-11-2012, 14:08
RodionSabitov, autorun.inf (http://ru.wikipedia.org/wiki/Autorun.inf)
RodionSabitov
15-11-2012, 14:41
Gnom_aka_Lexander, а в inno setup нет такой встроенной функции? в install shield'e была...
Gnom_aka_Lexander
15-11-2012, 14:53
RodionSabitov, файл autorun.inf совершенно несложно заполнить вручную, для написания пары слов в текстовом файле нет нужды встраивать целый механизм его создания. К тому-же install shield - инструмент платный, и разработчикам необходимо оправдывать его платность. В том числе и ненужными опциями.
Johny777
17-11-2012, 14:33
CD-ром-то зачем? С сд-ромом, инно и сама довольно красиво с помощью драйвтривива в одну строчку делает. дополнительные ухищрения как раз были нужны, чтоб исключить его, поскольку попытка установить туда что-либо приводит как минимум к ошибке и является маразмом. »
не собирался его добавлять. Закоментировал а сейчас и подавно удалил. Остались только
DRIVE_REMOVABLE = $2;
DRIVE_FIXED = $3;
ByteOrTB - несколько месяцев назад уважаемый Serega давал гораздо более корректный код. примерно в тех-же краях есть решение проблемы с определением размеров. Правда там с файлами, но по сути своей любой элемент системы является файлом, так что решение наверняка неподалеку. И не нужно копи ровать манеру форматирования кода Виктора Доброва, читать невозможно, чесслово. »
есть 2 функции на перевод байтов в удобочитаемую форму
1. http://forum.oszone.net/post-1882481-1175.html (юзаю в основном инсталле, тк он у меня двухязычный)
2. http://forum.oszone.net/post-1882594-1184.html (юзаю в остальных случаях. В том числе и для кода ниже)
и у меня нет размер файлов. Он не нужен. А размер дисков и инфа о них
короче вот допилил код
скрин:
http://img703.imageshack.us/img703/7968/30161003.png (http://imageshack.us/photo/my-images/703/30161003.png/)
в отличии от передыдущего кода это процедура которая пишет инфу в входную переменнную
свой тип
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?Support&SoftWare&Delphi/D3/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 кликабельны
вот текстура для кода выше
Gnom_aka_Lexander
17-11-2012, 14:37
я без понятия что такое PLargeInteger »
Int64 я в ней использовал, когда в листвив делал.
Johny777
17-11-2012, 17:44
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;
проверьте пожалуйста у кого юникодная инно под рукой. Всё ли правильно работает. Чисто для статистики :)
теперь осталось только соритровать элементы. Не знаю как :(
проверьте пожалуйста у кого юникодная инно под рукой. Всё ли правильно работает. Чисто для статистики»
Добавил пару точек с запятой, но в результате пишет, что
http://bestrepack.net/forum/pictures/36817477ca747ee456537d69ff4984a6.jpg
Gnom_aka_Lexander
18-11-2012, 10:08
поэтому я и отказался делать на инно, что очень сложно сделать так, чтоб и в анси и в юникоде работало и сделал в длл-ке.
Gnom_aka_Lexander
18-11-2012, 14:11
BitmapResource »
во первых, желательно сохранить совместимость со стандартной версией инно - могу сказать, что это возможно. Во вторых - иконки можно и лучше брать системные - это тоже возможно и намного лучше, чем использовать левые изображения. к примеру меня напрягает, когда флешку отображает иконка нормального жесткого диска.
Johny777
18-11-2012, 14:20
Gnom_aka_Lexander, как системные иконки прикрутить?
можешь пожалуйста подправить код?
меня например замки не устраивают. Но картинки такие маленькие, что ничего лучше не нашёл :(
на юникоде тестил? У тебя работает?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.