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

Ответить
 • Просмотры: 35
Аватара пользователя
Tco 03

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Tco 03 »

El Sanchez,

помню спрашивал как быстро определить размер папки (те для меня пример ...\Inno Setup 5\Scripts\Dobrov\DirSizeCal.iss работает слишком медленно)



нашёл пример использующий объект FileSystemObject
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx


на форуме
http://forum.vingrad.ru/forum/topic-84976/unread-1.html




результат - функция (здесь вывод в мегабайтах под мои нужды) : Изображение



Код:

Код: Выделить всё

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[  code]
function GetFolserSize(path:string):Integer;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetFolder(path).Size div (1024*1024);
end;
procedure InitializeWizard();
begin                     
  MsgBox(IntToStr(GetFolserSize('C:\Program Files (x86)')), mbInformation, MB_OK);
end;

в данном случае папку Program Files (x86) у меня (пока что размером почти 2 гига после переустановки винды) посчитала за секунду

более наглядный пример:


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




Код:

Код: Выделить всё

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[  code]
function GetFolserSize(path:string):Extended;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetFolder(path).Size;
end;
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.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 InitializeWizard();
begin                     
  MsgBox(BytesToSize(GetFolserSize('C:\Program Files (x86)')), mbInformation, MB_OK);
end;





но вот при попытке посчитать C:\Windows вылетает с ошибкой на Result := oFS.GetFolder(path).Size div (1024*1024);


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




---------------------------

Runtime Error

---------------------------

Line 14:



Exception: : .

---------------------------

ОК

---------------------------




может папка слишком большого размера и он не может посчитать или я функцию криво записал

с другой стороны папку с видео размером больше 250 гигов посчитала корректно и тоже быстро

в общем хотелось бы узнать в чём причина ошибки ну и как следствие - улучшение/исправление



в качестве производных:

размер файла:


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




Код:

Код: Выделить всё

function GetFileSize(FilePath:string):Extended;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetFile(FilePath).Size;
end;
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.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 InitializeWizard();
begin                     
  MsgBox(BytesToSize(GetFileSize('C:\Windows\regedit.exe')), mbInformation, MB_OK);
end;







версия файла:


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




Код:

Код: Выделить всё

function FileVersion(FilePath:string):string;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetFileVersion(FilePath);
end;
procedure InitializeWizard();
begin                     
  MsgBox((FileVersion('C:\Windows\regedit.exe')), mbInformation, MB_OK);
end;







получение буквы жёсткого диска на которм лежит файл:


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




Код:

Код: Выделить всё

function GetFolserSize(FilePath:string):string;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetDriveName(FilePath);
end;
procedure InitializeWizard();
begin                     
  MsgBox((GetFolserSize('C:\Windows\regedit.exe')), mbInformation, MB_OK);
end;







генерирование уникального имени папки для использования её в %Temp%


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




Код:

Код: Выделить всё

function CreateFolserUniqueName:string;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetTempName;
end;
procedure InitializeWizard();
begin
  MsgBox(CreateFolserUniqueName, mbInformation, MB_OK);
end;







альтернатива функции DirExists:


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




Код:

Код: Выделить всё

function FolderExists(Folder:string):boolean;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.FolderExists(Folder);
end;
procedure InitializeWizard();
begin
  if FolderExists('C:\setup') then MsgBox('ok', mbInformation, MB_OK);
end;







проверка наличия жёсткого диска по букве:


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




Код:

Код: Выделить всё

function DriveExists(Drive:string):boolean;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.DriveExists(Drive);
end;
procedure InitializeWizard();
begin
  if DriveExists('C') then MsgBox('ok', mbInformation, MB_OK);
end;
Аватара пользователя
Gnom_aka_Lexander

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Gnom_aka_Lexander »

привет. при установке извлекаются некоторые файлы. из них exe bmp итд. скажите. можно сделать чтоб они работали внутри инсталятора. или хотяб брались из файла x.tmp который извлекается в %temp% а не в чистом виде?
Аватара пользователя
Ivan_009

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Ivan_009 »

Цитата Johny777:



но вот при попытке посчитать C:\Windows вылетает с ошибкой на Result := oFS.GetFolder(path).Size div (1024*1024);
Скрипты Inno Setup. Помощь и советы [часть 5]




Johny777, вот же ж двоешник.

1. Проверяй в функции наличие папки. Исключение как раз из-за этого.

2. Размер Integer мал для "толстых" папок, нужно, например, Extended.



Код:

Код: Выделить всё

function GetFolserSize(path: String): Extended;
var
    oFS: Variant;
begin
    try
        if not DirExists(path) then Exit;
        oFS := CreateOleObject('Scripting.FileSystemObject');
        Result := oFS.GetFolder(path).Size/1024/1024;
    except
        Result := 0;
    end;
end;
//два знака после запятой
MsgBox(FormatFloat('#0.00', GetFolserSize('C:\Windows')), mbInformation, MB_OK);
Аватара пользователя
Mailchik

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Mailchik »

Ivan_009,

Код:

Код: Выделить всё

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[Code]
var
 Test : boolean;
function InitializeSetup : boolean;
 begin
  Test := MsgBox('Использовать стандартное оформление?', mbInformation, MB_YESNO) = idYes;
  Result := True;
end;
procedure InitializeWizard;
 begin
  case Test of
   True: begin
    with WizardForm do begin
     ClientWidth := ScaleX(400);
     ClientHeight := ScaleX(400);
     Color := clRed;
    end;
   end;
   False: begin
    with WizardForm do begin
     ClientWidth := ScaleX(500);
     ClientHeight := ScaleX(200);
     Color := clLime;
    end;
   end;
  end;
end;
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Johny777 »

Цитата Johny777:



также вот процедура перемещения файлов

просьба проверить нигде ли я не накосячил:
»




Johny777, первый параметр метода MoveFile может содержать групповые символы:



Код:

Код: Выделить всё

procedure MoveFiles(SourceFolder, Mask, DestFolder: String);
var
    oFS: Variant;
begin
    try
        if not DirExists(SourceFolder) or not DirExists(DestFolder) then Exit;
        oFS := CreateOleObject('Scripting.FileSystemObject');
        oFS.MoveFile(AddBackslash(RemoveBackslash(SourceFolder)) + Mask, DestFolder);
    except
        //ShowExceptionMessage;
    end;
end;
Аватара пользователя
ispolin

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение ispolin »

подскажите плиз что куда прописать



http://img837.imageshack.us/img837/259/87614951.jpg




нужно скрыть что куда распаковывается и оставить лишь надпись "Распаковка файлов..."



и ещё



http://img337.imageshack.us/img337/7807/86402742.jpg




как надпись сделать другим цветом, уж больно блёклая
Аватара пользователя
R.i.m.s.k.y.

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение R.i.m.s.k.y. »

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


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




Код:

Код: Выделить всё

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[Components]
Name: std; Description: Стандартная; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: std\a; Description: Анси; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: std\u; Description: Юникод; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext; Description: Китаяса; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext\a; Description: Анси; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext\u; Description: Юникод; Flags: exclusive disablenouninstallwarning; Types: custom compact full
[*code]
procedure HintStr(Sender: TObject; X: Integer; Y: Integer; Index: Integer; Area: TItemArea);
begin
  with WizardForm do
    with ComponentsList do
  case Index of
    0 : Hint := 'Стандартная';
    1 : Hint := 'Стандартная Анси';
    2 : Hint := 'Стандартная Юникод';
    3 : Hint := 'Китаяса';
    4 : Hint := 'Китаяса Анси';
    5 : Hint := 'Китаяса Юникод';
  else
    Hint := 'Наведите на компонент для отображения подсказки';
  end;
end;
procedure InitializeWizard();
begin
  with WizardForm do
  begin
    with ComponentsList do
    begin
      ShowHint := True;
      Hint := '';
      OnItemMouseMove := @HintStr;
    end;
  end;
end;



Скорей всего на стандартной версии не будет работать.
Аватара пользователя
Ivan_009

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Ivan_009 »

Цитата Gnom_aka_Lexander:



как-то так, только мне не очень нравится, как это работает, может старшие товарище подскажут, как сделать лучше.
Скрипты Inno Setup. Помощь и советы [часть 5]




После того как первая подсказка исчезает, больше ни одна не появляется Изображение
Аватара пользователя
SatHan

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение SatHan »

Цитата Raf-9600:



После того как первая подсказка исчезает, больше ни одна не появляется
Скрипты Inno Setup. Помощь и советы [часть 5]




Как вариант можно сделать так


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




Код:

Код: Выделить всё

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[Components]
Name: std; Description: Стандартная; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: std\a; Description: Анси; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: std\u; Description: Юникод; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext; Description: Китаяса; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext\a; Description: Анси; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext\u; Description: Юникод; Flags: exclusive disablenouninstallwarning; Types: custom compact full
[code]
var
  LastIndex: Integer;
procedure HintStr(Sender: TObject; X: Integer; Y: Integer; Index: Integer; Area: TItemArea);
begin
  if IndexLastIndex then begin
    LastIndex:= Index;
    WizardForm.ComponentsList.ShowHint:= False;
    WizardForm.ComponentsList.Hint:= '';
    Exit;
  end;
  with WizardForm.ComponentsList do
  case Index of
    0 : Hint := 'Стандартная';
    1 : Hint := 'Стандартная Анси';
    2 : Hint := 'Стандартная Юникод';
    3 : Hint := 'Китаяса';
    4 : Hint := 'Китаяса Анси';
    5 : Hint := 'Китаяса Юникод';
  else
    Hint := 'Наведите на компонент для отображения подсказки';
  end;
  WizardForm.ComponentsList.ShowHint:= True;
end;
procedure InitializeWizard();
begin
  with WizardForm do
  begin
    with ComponentsList do
    begin
      ShowHint := True;
      Hint := '';
      OnItemMouseMove := @HintStr;
    end;
  end;
end;
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Johny777 »

Цитата Shegorat:



Как вариант можно сделать так
Скрипты Inno Setup. Помощь и советы [часть 5]




Самое оно! Благодарю.

Я бы ещё хотел узнать, можно ли сделать так, чтобы текст определённого Hint'а менялся в зависимости от выбранных компонентов?

Т.е. чтобы допустим если выбран компонент "ext\u" то у "ext\a" подсказка менялась на другую?
Ответить

Вернуться в «Автоматическая установка приложений»