Вопрос Как выполнять разные команды отталкиваясь от прогресса установки.

Статус
В этой теме нельзя размещать новые ответы.

MISHAWIN

Новичок
Нужно если прогресс 10%, то делать действие, если 20%, то другое действие, действие делается один раз, то есть сработало и всё.
Как я понимаю за это отвечает процедура CurInstallProgressChanged, то есть должно быть примерно так?

Код:
procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);

begin

if CurProgress > 10 then begin

  MsgBox('Cообщение', mbError, mb_Ok);

end

end;
CurProgress это в процентах, прогрессбар установки? Но почему-то не работает.
У меня 5.5.1 ee2, видимо в этой версии эта процедура не работает... Хотя ошибку не выдаёт, странно.
Прогрессбар у меня такой - WizardForm.ProgressGauge
Но может она мне не нужна и можно сделать на моей версии?

Попробовал через таймер, но чет он видимо перескакивает 10, если ставлю =, а если ставить >, то он начинает множественное срабатывать, а мне нужно единожды, убирать таймер не вариант...

Код:
procedure MyOnTimer(Sender: TObject);

begin

if WizardForm.ProgressGauge.Position = 10 then begin

  MsgBox('Cообщение', mbError, mb_Ok);

end

end;



procedure InitializeWizard();

begin

  RedesignWizardForm;

    with TTimer.Create(WizardForm) do

  begin

    Interval := 100;

    OnTimer := @MyOnTimer;

  end;

end;


Так же хотел бы узнать как встроить численную переменную, нужно сделать типо:

Label_1.Show;

Как это сделать через переменну?

Код:
Peremen: integer;

Peremen:=1;

'Label_' +IntToStr(Peremen).Show;
Так же не работает, как я понимаю где-то ошибся в написании, кто подскажет.
 
Последнее редактирование:

HandyMan

Новичок
Возможно так...
Код:
procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
var
 curValue: Integer;
begin
  curValue:=(CurProgress * 100) / MaxProgress;
if curValue > 10 then begin

  MsgBox('Cообщение', mbError, mb_Ok);

end

end;
 

MISHAWIN

Новичок
Возможно так...
Код:
procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
var
curValue: Integer;
begin
  curValue:=(CurProgress * 100) / MaxProgress;
if curValue > 10 then begin

  MsgBox('Cообщение', mbError, mb_Ok);

end

end;
Не работает, я брал инфу из этого поста, в моей версии как я и указал в сообщении, как я понимаю это не работает.
 
Последнее редактирование:

HandyMan

Новичок
А вот так...
Код:
[_Code]
var

    MyTimer: TTimer;
 
procedure MyOnTimer(Sender: TObject);
var
  curValue: Integer;
begin

  with WizardForm.ProgressGauge do
    begin
       curValue:= (Position-Min)/((Max - Min)/100);
    end;
 
    case curValue of
 
        10: MsgBox('Cообщение ' + IntToStr(curValue) + ' %', mbError, mb_Ok);
        20: MsgBox('Cообщение ' + IntToStr(curValue) + ' %', mbError, mb_Ok);
        30: MsgBox('Cообщение ' + IntToStr(curValue) + ' %', mbError, mb_Ok);

   end;

end;

procedure InitializeWizard();
begin
    MyTimer:= TTimer.Create(WizardForm);
    with MyTimer do
    begin
        Interval:=100;
        Enabled:= False;
        OnTimer:= @MyOnTimer;
    end;
end;
 
procedure CurPageChanged(CurPageID: Integer);
begin
  MyTimer.Enabled:= False;
  if CurPageID = wpInstalling then
    begin
        MyTimer.Enabled:= True;
    end;
end;
 
Последнее редактирование:

HandyMan

Новичок
Поменять условие, убить таймер после wpInstallPage и спамить не будет!
 

MISHAWIN

Новичок
А вот так...
Код:
procedure MyOnTimer(Sender: TObject);
var
  curValue: Integer;
begin
  with WizardForm.ProgressGauge do begin
     curValue:= (Position-Min)/((Max - Min)/100);
  end;
  if curValue > 10 then begin

   MsgBox('Cообщение', mbError, mb_Ok);

end

end;



procedure InitializeWizard();

begin

  RedesignWizardForm;

    with TTimer.Create(WizardForm) do

  begin

    Interval := 100;

    OnTimer := @MyOnTimer;

  end;

end;
Не совсем понимаю зачем вы скинули мой код с небольшими изменениями, хотя да, наверное в моём была ошибка и там были явно не проценты, в вашем случае на вид показывает проценты, но я всё же хотел узнать есть ли нормальный способ решения этой проблемы?
Но не совсем понятно, вы заменили вот эти части, но мой код от этого лучше не стал, этот подход изначально мне казался кривым и я надеялся на то , что есть что-то вменяемое, цель то Нужно если прогресс 10%, то делать действие, если 20%, то другое действие, действие делается один раз, то есть сработало и всё.
 
Последнее редактирование:

MISHAWIN

Новичок
Поменять условие, убить таймер после wpInstallPage и спамить не будет!
Вы почему-то не прочитали главное сообщение, вот цитаты из него.
Нужно если прогресс 10%, то делать действие, если 20%, то другое действие, действие делается один раз, то есть сработало и всё.
Попробовал через таймер, но чет он видимо перескакивает 10, если ставлю =, а если ставить >, то он начинает множественное срабатывать, а мне нужно единожды, убирать таймер не вариант...
 

Nemko

Дилетант
Модератор
MISHAWIN, поgробуйте добавить дополнительные условия и переменные:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs

[Code]
var
  per10: Boolean;

procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
var
curValue: Integer;
begin
  curValue:= (CurProgress * 100) / MaxProgress;
  if (curValue > 10) and (curValue < 19) and not per10 then begin
    MsgBox('Cообщение', mbError, mb_Ok);
    per10:= True;
  end
end;

З.Ы.: Пример работает в оригинальной версии Inno, в моей версии Inno EE нет поддержки интерпретированной процедуры CurInstallProgressChanged.
 

MISHAWIN

Новичок
MISHAWIN, поgробуйте добавить дополнительные условия и переменные:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs

[Code]
var
  per10: Boolean;

procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
var
curValue: Integer;
begin
  curValue:= (CurProgress * 100) / MaxProgress;
  if (curValue > 10) and (curValue < 19) and not per10 then begin
    MsgBox('Cообщение', mbError, mb_Ok);
    per10:= True;
  end
end;
Спасибо за ответ, но получается, для моей версии только такой громоздкий вариант ответа?

Так же хотелось бы, что бы кто-то подсказал со 2-м вопросом, надеюсь он не такой сложный.
Так же хотел бы узнать как встроить численную переменную, нужно сделать типо:

Label_1.Show;

Как это сделать через переменну?

Peremen: integer;
Peremen:=1;
'Label_' +IntToStr(Peremen).Show;

Так же не работает, как я понимаю где-то ошибся в написании, кто подскажет.
 

Nemko

Дилетант
Модератор
MISHAWIN, по поводу второго вопроса создайте переменные в виде массива, а потом вызывайте по идификатору.
 

MISHAWIN

Новичок
MISHAWIN, поgробуйте добавить дополнительные условия и переменные:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs

[Code]
var
  per10: Boolean;

procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
var
curValue: Integer;
begin
  curValue:= (CurProgress * 100) / MaxProgress;
  if (curValue > 10) and (curValue < 19) and not per10 then begin
    MsgBox('Cообщение', mbError, mb_Ok);
    per10:= True;
  end
end;

З.Ы.: Пример работает в оригинальной версии Inno, в моей версии Inno EE нет поддержки интерпретированной процедуры CurInstallProgressChanged.
Вот я об этом тоже уже написал и не раз.
А, можно через таймер отлавливать позицию Progressbara или через CurStepChanged.
А разве с этим скриптом мы не отлавливаем позицию прогресс бара?

MISHAWIN, по поводу второго вопроса создайте переменные в виде массива, а потом вызывайте по идификатору.
Проблема не в переменных, а как это записать. 'Label_' +IntToStr(Peremen).Show; этоже не верное написание, у меня с этим проблемы.
 

Nemko

Дилетант
Модератор
MISHAWIN, пример на два вопроса и для Inno EE, времени мало у меня, надеюсь пример будет понятен:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs

[Code]
var
  PBOldProc: LongInt;
  Persent10, Persent20: Boolean;

  Caption: array [0..2] of TLabel;
  Peremen: Integer;

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: LongInt): LongInt; external 'SetWindowLongA@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: LongInt; hWnd: HWND; Msg: UINT; wParam, lParam: LongInt): LongInt; external 'CallWindowProcA@user32.dll stdcall';

function PBProc(h: hWnd; Msg, wParam, lParam: LongInt): LongInt;
var
 curValue: Integer;
begin
  Result:= CallWindowProc(PBOldProc, h, Msg, wParam, lParam);
  if (Msg = $402) and (WizardForm.ProgressGauge.Position > WizardForm.ProgressGauge.Min) then begin
    curValue:= Round(WizardForm.ProgressGauge.Position / 10);
    if (curValue >= 10) and (curValue < 19) and not Persent10 then begin
      MsgBox('Cообщение 1', mbError, mb_Ok);
      Persent10:= True;
      Peremen:= 1;
    end;
    if (curValue >= 20) and (curValue < 29) and not Persent20 then begin
      MsgBox('Cообщение 2', mbError, mb_Ok);
      Persent20:= True;
      Peremen:= 2;
    end;
    if Peremen <> 0 then Caption[Peremen].Show;
  end;
end;

procedure AllCancel;
begin
  SetWindowLong(WizardForm.ProgressGauge.Handle, -4, PBOldProc);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssInstall: PBOldProc:= SetWindowLong(WizardForm.ProgressGauge.Handle, -4, CallbackAddr('PBProc'));
    ssPostInstall: AllCancel;
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID = wpInstalling then begin
    Confirm:= False;
    Cancel:= ExitSetupMsgBox;
    if Cancel then AllCancel;
  end;
end;

procedure InitializeWizard;
var
  i: Byte;
begin
  for i:=1 to 2 do begin
    Caption[i]:= TLabel.Create(nil);
    with Caption[i] do begin
      Caption:= IntToStr(i) + '0%';
      SetBounds(24, 346, 50, 14);
      if i = 2 then Top:= 360;
      Parent:= WizardForm;
      Hide;
    end;
  end;
end;
 

Nemko

Дилетант
Модератор
Проблема не в переменных, а как это записать. 'Label_' +IntToStr(Peremen).Show; этоже не верное написание, у меня с этим проблемы.
Это же переменная, а не строковые данные. Вызывать придется или по идентификатору и записывать в массив однотипные переменные или же по имени компонента или циклом перебирать все переменные содержащие компонент и сверять по Тегу, Имени или еще чему небудь.

З.Ы.: ахтунг, постарайтесь более правильнее и точнее создавать темы, заголовки порой :D, да и суть ускользает...
 
Последнее редактирование:

MISHAWIN

Новичок
MISHAWIN, пример на два вопроса и для Inno EE, времени мало у меня, надеюсь пример будет понятен:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs

[Code]
var
  PBOldProc: LongInt;
  Persent10, Persent20: Boolean;

  Caption: array [0..2] of TLabel;
  Peremen: Integer;

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: LongInt): LongInt; external 'SetWindowLongA@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: LongInt; hWnd: HWND; Msg: UINT; wParam, lParam: LongInt): LongInt; external 'CallWindowProcA@user32.dll stdcall';

function PBProc(h: hWnd; Msg, wParam, lParam: LongInt): LongInt;
var
curValue: Integer;
begin
  Result:= CallWindowProc(PBOldProc, h, Msg, wParam, lParam);
  if (Msg = $402) and (WizardForm.ProgressGauge.Position > WizardForm.ProgressGauge.Min) then begin
    curValue:= Round(WizardForm.ProgressGauge.Position / 10);
    if (curValue >= 10) and (curValue < 19) and not Persent10 then begin
      MsgBox('Cообщение 1', mbError, mb_Ok);
      Persent10:= True;
      Peremen:= 1;
    end;
    if (curValue >= 20) and (curValue < 29) and not Persent20 then begin
      MsgBox('Cообщение 2', mbError, mb_Ok);
      Persent20:= True;
      Peremen:= 2;
    end;
    if Peremen <> 0 then Caption[Peremen].Show;
  end;
end;

procedure AllCancel;
begin
  SetWindowLong(WizardForm.ProgressGauge.Handle, -4, PBOldProc);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssInstall: PBOldProc:= SetWindowLong(WizardForm.ProgressGauge.Handle, -4, CallbackAddr('PBProc'));
    ssPostInstall: AllCancel;
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID = wpInstalling then begin
    Confirm:= False;
    Cancel:= ExitSetupMsgBox;
    if Cancel then AllCancel;
  end;
end;

procedure InitializeWizard;
var
  i: Byte;
begin
  for i:=1 to 2 do begin
    Caption[i]:= TLabel.Create(nil);
    with Caption[i] do begin
      Caption:= IntToStr(i) + '0%';
      SetBounds(24, 346, 50, 14);
      if i = 2 then Top:= 360;
      Parent:= WizardForm;
      Hide;
    end;
  end;
end;
Ага, спасибо, с первым, вопросом я разобрался, как я понимаю это единственный вариант, через таймер на моей версии, 2-й вопрос тоже вроде понятен, буду смотреть.
 

MISHAWIN

Новичок
Оооо, это не таймер :D. Это callback функция, она перехватывает сообщения ProgressBar'a.
Ага, вижу, но разницы как понимаю с реализацией через таймер нету, хотя таймер будет спамить проверками, а калбек функция меньше нагружать ситапник, так?

Это же переменная, а не строковые данные. Вызывать придется или по идентификатору и записывать в массив однотипные переменные или же по имени компонента или циклом перебирать все переменные содержащие компонент и сверять по Тегу, Имени или еще чему небудь.

З.Ы.: ахтунг, постарайтесь более правильнее и точнее создавать темы, заголовки порой :D, да и суть ускользает...
Хотя нет, всё равно не понял. Я в коде плохо орентируюсь, 1-й вопрос я для себя закрыл, решение громозкое, но оно есть, спасибо, но 2-й вопрос не понятен.

Мне нужно сделать нечто:

Label_1.Show;
Label_2.Show;
Label_3.Show;

и .т.д.

Label1 - это если, что название TLabel, но тут не важно, может быть и BitmapImage_1 у TBitmapImage и.т.д. и что-то другое.

Я думал туда подставить переменную , её менять и всё заработает.
У вас же как я понимаю идет замена описания этого Label или я что-то неправильно понял?
 
Последнее редактирование:

MISHAWIN

Новичок
@MISHAWIN, ты конкретно от label то что хочешь? Что бы что что там отображалось?
Нет, в том, то и дело, что не хочу. Я хочу сделать следующие.
У меня есть условные Label1, Label2, Label3 и .т.д. хотя тут то, что это Label не важно.

Код:
  { Label1 }
  Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Name := 'Label1';
    Parent := NewGroupBox1;
    Caption := 'Описание';
    Font.Color := clWindowText;
    Font.Height := -12;
    Font.Name := 'Tahoma';
    Font.Style := [];
    ParentFont := False;
    Left := ScaleX(8);
    Top := ScaleY(8);
    Width := ScaleX(430);
    Height := ScaleY(10);
  end;


  { Label2 }
  Label2 := TLabel.Create(WizardForm);
  with Label2 do
  begin
    Name := 'Label2';
    Parent := NewGroupBox1;
    Caption := 'Описание';
    Font.Color := clWindowText;
    Font.Height := -12;
    Font.Name := 'Tahoma';
    Font.Style := [];
    ParentFont := False;
    Left := ScaleX(8);
    Top := ScaleY(8);
    Width := ScaleX(430);
    Height := ScaleY(10);
  end;


  { Label3 }
  Label3 := TLabel.Create(WizardForm);
  with Label3 do
  begin
    Name := 'Label3';
    Parent := NewGroupBox1;
    Caption := 'Описание';
    Font.Color := clWindowText;
    Font.Height := -12;
    Font.Name := 'Tahoma';
    Font.Style := [];
    ParentFont := False;
    Left := ScaleX(8);
    Top := ScaleY(8);
    Width := ScaleX(430);
    Height := ScaleY(10);
  end;
Обычно, что бы скрыть Label_1 нужно прописать.

Код:
Label_1.Hide;
Я хочу, что бы при нажатии кнопки у меня скрывался нужный Label_X, где X это собственно число в названии Label и переменная которую я могу задать.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху