Вопрос Как сделать объем игры с текущим выбором как на скрине? (2)

Alloc

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

Сама тема лежит тут

Код:
// 1048576 = 1 mb (если число больше 2047 то MbSize не работает. ограничение integer)
// тогда прописывать вручную
#define MbSize(x) x*1048576

//===== [Место для установки] =====\\:
#define NeedSize "6656"

[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
//ShowComponentSizes=no

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

[Components]
Name: Mode; Description: mode; Types: custom; flags: fixed
Name: Mode/SPOnly; Description: SPOnly; ExtraDiskSpaceRequired: {#MbSize(1521)}; Flags: disablenouninstallwarning
Name: Mode2; Description: mode; Types: custom; flags: fixed
Name: Mode2/SPOnly2; Description: SPOnly2; ExtraDiskSpaceRequired: {#MbSize(101)}; Flags: disablenouninstallwarning
Name: Mode2/MPOnly2; Description: MPOnly2; ExtraDiskSpaceRequired: {#MbSize(524)}; Flags: disablenouninstallwarning

[Code]
var
  Label1: TLabel;
  OldEvent_ComponentsListClickCheck: TNotifyEvent;
  DsE: Extended;

function GetFloatFormText(const UndefText: String): Extended;
var
  i: Integer;
  ss: string;
begin
  for i := 1 to Length(UndefText) do
  case UndefText[i] of
    '0','1','2','3','4','5','6','7','8','9': ss := ss + UndefText[i];
    ',': ss := ss + '.';
  end;
  Result:= StrToFloat(ss);
end;

function NumToStr(Float: Extended): String;
begin
  Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
while (Result[Length(Result)] = '0')or((Result[Length(Result)] = '.')and(Pos('.', Result) > 0)) do
  SetLength(Result, Length(Result)-1);
end;

function MbOrTb(Float: Extended): String;
begin
if Float < 1024 then Result:= NumToStr(Float)+' Мб' else
if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' Гб' else
  Result:= NumToStr(Float/(1024*1024))+' Тб';
end;

procedure DiskSpaceLabel(Sender: TObject);
begin
  OldEvent_ComponentsListClickCheck(Sender);
  DsE:= GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption)-GetFloatFormText(WizardForm.DiskSpaceLabel.Caption)+{#NeedSize};
  Label1.Caption:= 'Текущий выбор требует не менее '+MbOrTb(DsE)+' на диске.';
end;

procedure InitializeWizard;
begin
DsE:= GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption)-GetFloatFormText(WizardForm.DiskSpaceLabel.Caption)+{#NeedSize};

Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Parent := WizardForm.ComponentsDiskSpaceLabel.Parent;
    Caption:= 'Текущий выбор требует не менее '+MbOrTb(DsE)+' на диске.';
    SetBounds(WizardForm.ComponentsDiskSpaceLabel.Left, WizardForm.ComponentsDiskSpaceLabel.Top, WizardForm.ComponentsDiskSpaceLabel.Width, WizardForm.ComponentsDiskSpaceLabel.Height);
    Font.Color:= clBlue;
    Transparent:= True;
  end;
  OldEvent_ComponentsListClickCheck := WizardForm.ComponentsList.OnClickCheck;
  WizardForm.ComponentsList.OnClickCheck:= @DiskSpaceLabel;
  WizardForm.ComponentsDiskSpaceLabel.Hide;
  WizardForm.DiskSpaceLabel.Hide;
end;

Вопрос в том, что с предложенным sergey3695 кодом действительно все работает как надо, но почему то если подключить к проэкту модуль ISDone.iss то значения в ComponentsDiskSpaceLabel и DiskSpaceLabel получаются разные. я обратил внимание что это из за строк:

Код:
...
Source: Include\ISDone.dll; DestDir: {tmp}; Flags: dontcopy;
...
т.е. любые прописанные файлы в секции [Files] с флагом Dontcopy приводят к тому что значения в лейблах о которых я говорил выше отличаются... не понимаю почему

ComponentsDiskSpaceLabel у меня показывает 1,8 мб
DiskSpaceLabel показывает другое, видимо с учетом всех файлов из ISDone - 2,8 мб

и получается этот код не работает так как должен в данной ситуации:

Код:
DsE:= GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption)-GetFloatFormText(WizardForm.DiskSpaceLabel.Caption)+{#NeedSize};
Скажите пожалуйста как это можно исправить? И почему значения разные? Я думал что все с флагом Dontcopy не учитывается инсталлятором.. буду очень признателен за помощь
 
Последнее редактирование:

Nemko

Дилетант
Модератор
Alloc, попробуйте это может подойдет:

Код:
// 1048576 = 1 mb (если число больше 2047 то MbSize не работает. ограничение integer)
// тогда прописывать вручную
#define MbSize(x) x*1048576

//===== [Место для установки] =====\\:
#define NeedSize "6854"

[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
//ShowComponentSizes=no

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

[Components]
Name: Mode; Description: mode; Types: custom; flags: fixed
Name: Mode/SPOnly; Description: SPOnly; ExtraDiskSpaceRequired: {#MbSize(1521)}; Flags: disablenouninstallwarning
Name: Mode2; Description: mode; Types: custom; flags: fixed
Name: Mode2/SPOnly2; Description: SPOnly2; ExtraDiskSpaceRequired: {#MbSize(101)}; Flags: disablenouninstallwarning
Name: Mode2/MPOnly2; Description: MPOnly2; ExtraDiskSpaceRequired: {#MbSize(524)}; Flags: disablenouninstallwarning

[Code]
var
  Label1: TLabel;
  OldEvent_ComponentsListClickCheck: TNotifyEvent;
  DsE, Ssize: Extended;

function GetFloatFormText(const UndefText: String): Extended;
var
  i: Integer;
  ss: string;
begin
  for i := 1 to Length(UndefText) do
  case UndefText[i] of
    '0','1','2','3','4','5','6','7','8','9': ss := ss + UndefText[i];
    ',': ss := ss + '.';
  end;
  Result:= StrToFloat(ss);
end;

function NumToStr(Float: Extended): String;
begin
  Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
while (Result[Length(Result)] = '0')or((Result[Length(Result)] = '.')and(Pos('.', Result) > 0)) do
  SetLength(Result, Length(Result)-1);
end;

function MbOrTb(Float: Extended): String;
begin
if Float < 1024 then Result:= NumToStr(Float)+' Мб' else
if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' Гб' else
  Result:= NumToStr(Float/(1024*1024))+' Тб';
end;

procedure DiskSpaceLabel(Sender: TObject);
begin
  OldEvent_ComponentsListClickCheck(Sender);
  DsE:=Ssize+GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption)-Ssize+{#NeedSize};
  Label1.Caption:= 'Текущий выбор требует не менее '+MbOrTb(DsE)+' на диске.';
  WizardForm.DiskSpaceLabel.Caption:='Требуется '+MbOrTb(DsE)+' свободного дискового пространства.';
end;

procedure InitializeWizard;
begin
Ssize:=GetFloatFormText(WizardForm.DiskSpaceLabel.Caption)+{#NeedSize};
DsE:=Ssize+GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption)-Ssize+{#NeedSize};

Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Parent := WizardForm.ComponentsDiskSpaceLabel.Parent;
    Caption:= 'Текущий выбор требует не менее '+MbOrTb(DsE)+' на диске.';
    SetBounds(WizardForm.ComponentsDiskSpaceLabel.Left, WizardForm.ComponentsDiskSpaceLabel.Top, WizardForm.ComponentsDiskSpaceLabel.Width, WizardForm.ComponentsDiskSpaceLabel.Height);
    Font.Color:= clBlue;
    Transparent:= True;
  end;

  WizardForm.DiskSpaceLabel.Caption:='Требуется как минимум '+MbOrTb(Ssize)+' свободного дискового пространства.';

  OldEvent_ComponentsListClickCheck := WizardForm.ComponentsList.OnClickCheck;
  WizardForm.ComponentsList.OnClickCheck:= @DiskSpaceLabel;
  WizardForm.ComponentsDiskSpaceLabel.Hide;
//WizardForm.DiskSpaceLabel.Hide;
end;
 
Последнее редактирование:

sergey3695

Ветеран
Модератор
Alloc,
Код:
// 1048576 = 1 mb (если число больше 2047 то MbSize не работает. ограничение integer)
// тогда прописывать вручную
#define MbSize(x) x*1048576

//===== [Место для установки] =====\\:
#define NeedSize "1"

[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
//ShowComponentSizes=no
DirExistsWarning=no

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

[Components]
Name: Mode; Description: mode; Types: custom; flags: fixed
Name: Mode/SPOnly; Description: SPOnly; ExtraDiskSpaceRequired: {#MbSize(1521)}; Flags: disablenouninstallwarning
Name: Mode2; Description: mode; Types: custom; flags: fixed
Name: Mode2/SPOnly2; Description: SPOnly2; ExtraDiskSpaceRequired: {#MbSize(101)}; Flags: disablenouninstallwarning
Name: Mode2/MPOnly2; Description: MPOnly2; ExtraDiskSpaceRequired: {#MbSize(524)}; Flags: disablenouninstallwarning

[Files]
Source: Arc.exe; Flags: dontcopy;

[Code]
var
  Label1: TLabel;
  OldEvent_ComponentsListClickCheck: TNotifyEvent;
  DsE,RSize: Extended;

function GetFloatFormText(const UndefText: String): Extended;
var
  i: Integer;
  ss: string;
begin
  for i := 1 to Length(UndefText) do
  case UndefText[i] of
    '0','1','2','3','4','5','6','7','8','9': ss := ss + UndefText[i];
    ',': ss := ss + '.';
  end;
  Result:= StrToFloat(ss);
end;

function NumToStr(Float: Extended): String;
begin
  Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
while (Result[Length(Result)] = '0')or((Result[Length(Result)] = '.')and(Pos('.', Result) > 0)) do
  SetLength(Result, Length(Result)-1);
end;

function MbOrTb(Float: Extended): String;
begin
if Float < 1024 then Result:= NumToStr(Float)+' Мб' else
if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' Гб' else
  Result:= NumToStr(Float/(1024*1024))+' Тб';
end;

procedure DiskSpaceLabel(Sender: TObject);
begin
  OldEvent_ComponentsListClickCheck(Sender);
  DsE:= GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption)+{#NeedSize}+RSize;
  Label1.Caption:= 'Текущий выбор требует не менее '+MbOrTb(DsE)+' на диске.';
  WizardForm.DiskSpaceLabel.Caption:='Требуется '+MbOrTb(DsE)+' свободного дискового пространства.';
end;

procedure InitializeWizard;
begin
  RSize:= GetFloatFormText(WizardForm.DiskSpaceLabel.Caption)-GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption);
  DsE:= GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption)+{#NeedSize}+RSize;

Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Parent := WizardForm.ComponentsDiskSpaceLabel.Parent;
    Caption:= 'Текущий выбор требует не менее '+MbOrTb(DsE)+' на диске.';
    SetBounds(WizardForm.ComponentsDiskSpaceLabel.Left, WizardForm.ComponentsDiskSpaceLabel.Top, WizardForm.ComponentsDiskSpaceLabel.Width, WizardForm.ComponentsDiskSpaceLabel.Height);
    Font.Color:= clBlue;
    Transparent:= True;
  end;

  WizardForm.DiskSpaceLabel.Caption:='Требуется как минимум '+MbOrTb(DsE)+' свободного дискового пространства.';

  OldEvent_ComponentsListClickCheck := WizardForm.ComponentsList.OnClickCheck;
  WizardForm.ComponentsList.OnClickCheck:= @DiskSpaceLabel;
  WizardForm.ComponentsDiskSpaceLabel.Hide;
//WizardForm.DiskSpaceLabel.Hide;
end;
и получается этот код не работает так как должен в данной ситуации
А все потому что, я не стал проверять код на маленьких значениях размера.
И почему значения разные? Я думал что все с флагом Dontcopy не учитывается инсталлятором..
DiskSpaceLabel показывает реальный размер который потребуется свободным на диске, а ComponentsDiskSpaceLabel после установки. Ну или что-то в этом роде, поэтому я и задействовал их в вычислении, но не верно.
DsE:=Ssize+GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption)-Ssize+{#NeedSize};
(1+2-1+3)=(2+3)
p.s. в той теме сообщение я отредактировал. косяк =)
 
Последнее редактирование:

sergey3695

Ветеран
Модератор
Alloc, В данном примере не учтено, что один из компонентов может быть отмечен вначале, тогда код не будет работать исправно.
Код:
// 1048576 = 1 mb (если число больше 2047 то MbSize не работает. ограничение integer)
// тогда прописывать вручную
#define MbSize(x) x*1048576

//===== [Место для установки] =====\\:
#define NeedSize "2048"

[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
//ShowComponentSizes=no
//DirExistsWarning=no
OutputDir=.

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

[Components]
Name: Mode; Description: mode; Types: custom; flags: fixed
Name: Mode/SPOnly; Description: SPOnly; ExtraDiskSpaceRequired: {#MbSize(100)};  Types: full; Flags: disablenouninstallwarning
Name: Mode2; Description: mode2; Types: custom; flags: fixed
Name: Mode2/SPOnly2; Description: SPOnly2; ExtraDiskSpaceRequired: {#MbSize(101)}; Flags: disablenouninstallwarning
Name: Mode2/MPOnly2; Description: MPOnly2; ExtraDiskSpaceRequired: {#MbSize(524)}; Flags: disablenouninstallwarning

[Files]
//Source: Arc.exe; DestDir: {tmp}; Flags: dontcopy

[Code]
var
  Label1: TLabel;
  OldEvent_ComponentsListClickCheck: TNotifyEvent;
  DsE,SSize: Extended;

function GetFloatFormText(const UndefText: String): Extended;
var
  i: Integer;
  ss: string;
begin
  for i := 1 to Length(UndefText) do
  case UndefText[i] of
    '0','1','2','3','4','5','6','7','8','9': ss := ss + UndefText[i];
    ',': ss := ss + '.';
  end;
  Result:= StrToFloat(ss);
end;

function NumToStr(Float: Extended): String;
begin
  Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
while (Result[Length(Result)] = '0')or((Result[Length(Result)] = '.')and(Pos('.', Result) > 0)) do
  SetLength(Result, Length(Result)-1);
end;

function MbOrTb(Float: Extended): String;
begin
if Float < 1024 then Result:= NumToStr(Float)+' Мб' else
if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' Гб' else
  Result:= NumToStr(Float/(1024*1024))+' Тб';
end;

procedure DiskSpaceLabel(Sender: TObject);
begin
  OldEvent_ComponentsListClickCheck(Sender);
  DsE:= GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption)+{#NeedSize}+SSize;
  Label1.Caption:= 'Текущий выбор требует не менее '+MbOrTb(DsE)+' на диске.';
end;

procedure InitializeWizard;
var
  i: Integer;
  k: Array [0..99] of Boolean; // массив на 100 эл-ов
begin
  OldEvent_ComponentsListClickCheck := WizardForm.ComponentsList.OnClickCheck;
for i:=0 to WizardForm.ComponentsList.ItemCount-1 do
if WizardForm.ComponentsList.Checked[i] then
  k[i]:= True;
for i:=0 to WizardForm.ComponentsList.ItemCount-1 do
  WizardForm.ComponentsList.Checked[i]:= False;
  WizardForm.ComponentsList.OnClickCheck(nil);
  SSize:= GetFloatFormText(WizardForm.DiskSpaceLabel.Caption)-GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption);
for i:=0 to WizardForm.ComponentsList.ItemCount-1 do
  WizardForm.ComponentsList.Checked[i]:= k[i];
  OldEvent_ComponentsListClickCheck(nil);
  DsE:= GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption)+{#NeedSize}+SSize;
//
Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Parent := WizardForm.ComponentsDiskSpaceLabel.Parent;
    Caption:= 'Текущий выбор требует не менее '+MbOrTb(DsE)+' на диске.';
    SetBounds(WizardForm.ComponentsDiskSpaceLabel.Left, WizardForm.ComponentsDiskSpaceLabel.Top, WizardForm.ComponentsDiskSpaceLabel.Width, WizardForm.ComponentsDiskSpaceLabel.Height);
    Font.Color:= clBlue;
    Transparent:= True;
  end;
  WizardForm.ComponentsList.OnClickCheck:= @DiskSpaceLabel;
  WizardForm.ComponentsDiskSpaceLabel.Hide;
  WizardForm.DiskSpaceLabel.Hide;
end;
Дополнил, так сказать.
 
Сверху