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

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

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

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

Ветеран


Contributor


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


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

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


Изменения
Автор: Vadikan
Дата: 22-05-2012
Описание: Закрыто
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
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. Помощь и советы [часть 5]

Отправлено: 18:01, 29-08-2011

 

Аватара для Johny777

Ветеран


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

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


Цитата El Sanchez:
А можно и без таймеров: »
читать дальше »
Код: Выделить весь код
const
    GWL_EXSTYLE = (-20);
    WS_EX_COMPOSITED = $2000000;
    AW_HIDE = $10000;
    AW_VER_POSITIVE = $4;
    AW_VER_NEGATIVE = $8;

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function AnimateWindow(hwnd: HWND; dwTime, dwFlags: DWORD): BOOL; external 'AnimateWindow@user32.dll stdcall';

var
    SettingPanel: TPanel;

procedure NewButton1Click(Sender: TObject);
begin
    with SettingPanel do
    begin
        //временно отрубаем стиль WS_EX_COMPOSITED, а то AnimateWindow плавненько не отработает
        SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) xor WS_EX_COMPOSITED);
        AnimateWindow(Handle, 1000, (AW_VER_POSITIVE * dword(not Visible)) or ((AW_HIDE or AW_VER_NEGATIVE) * dword(Visible)));
        SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED);
        Visible := not Visible;
    end;
end;

procedure InitializeWizard();
begin
    SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED);

    SettingPanel := TPanel.Create(WizardForm);
    with SettingPanel do
    begin
        Parent := WizardForm;
        SetBounds(ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.OuterNotebook.ClientHeight);
        Visible := False;
    end;

    with TNewButton.Create(WizardForm) do
    begin
        Parent := WizardForm;
        SetBounds(ScaleX(40), ScaleY(327), ScaleX(75), ScaleY(25));
        Caption := 'open';
        OnClick := @NewButton1Click;
    end;
end;
анимация зачётная, но малость не то
к тому же стиль WS_EX_COMPOSITED нужен был, чтоб окно не мигало, а отказавшись от старой панели работающей через .repaint, из-за которой оно мигало, в нём тоже отпала необходимость (кажется)

Цитата El Sanchez:
можно использовать ф-ию CallbackAddr »
воспользовался (извиняюсь, что только сейчас и при этом поднимаю старое сообщение)
(изменил один из примеров
вот этот
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[  Code]
 var
   SettingPanel: TPanel;
   SettingPanel_m_Timer,SettingPanel_p_Timer: TTimer;

 procedure NewButton1Click(Sender: TObject);
 begin
   SettingPanel_m_Timer.Enabled:=False; SettingPanel_p_Timer.Enabled:=False;

   if SettingPanel.Top<0 then SettingPanel_p_Timer.Enabled:=True;
   if SettingPanel.Top>-1 then SettingPanel_m_Timer.Enabled:=True;
 end;

 procedure PanelTop_p_Timer(Sender: TObject);
 begin
   SettingPanel.Top:=ScaleY(SettingPanel.Top + 5);
   if SettingPanel.Top>-1 then
    SettingPanel_p_Timer.Enabled:=False;
 end;

 procedure PanelTop_m_Timer(Sender: TObject);
 begin
   SettingPanel.Top:=ScaleY(SettingPanel.Top - 5);
   if SettingPanel.Top<-314 then
    SettingPanel_m_Timer.Enabled:=False;
 end;

 procedure InitializeWizard();
 begin
   SettingPanel_p_Timer := TTimer.Create(WizardForm);
   with SettingPanel_p_Timer do
   begin
     Interval := 1;
     Enabled:=False;
     OnTimer := @PanelTop_p_Timer;
   end;

   SettingPanel_m_Timer := TTimer.Create(WizardForm);
   with SettingPanel_m_Timer do
   begin
     Interval := 1;
     Enabled:=False;
     OnTimer := @PanelTop_m_Timer;
   end;

   SettingPanel := TPanel.Create(WizardForm);
   with SettingPanel do
   begin
     Parent := WizardForm;
     SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
     ParentBackground := False;
   end;

   with TNewButton.Create(WizardForm) do
   begin
     Parent := WizardForm;
     SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
     Caption := 'open';
     OnClick := @NewButton1Click;
   end;
 end;
)
и в то время же накосячил!
не хочет закатываться!
зато выкатывается

вот что получилось:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy

[  Code]
var
  SettingPanel: TPanel;
  Flag: boolean;
  hBtn: TButton;

type
  TimerProc = procedure(Sender: TObject);

function CallbackAddr(Callback: TimerProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer(Sender: TObject);
begin
  if SettingPanel.Top<0 then SettingPanel.Top:=ScaleY(SettingPanel.Top + ScaleY(3));
end;

procedure Timer2(Sender: TObject);
begin
  if SettingPanel.Top>-1 then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
end;


procedure HideShow(Sender: TObject);
begin
If not Flag then
  begin
    SetTimer(WizardForm.Handle, 1, 5 {задаём интервал}, CallbackAddr(@Timer, 0));
    KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Hide';
    Flag:= True;
  end
else
  begin
    SetTimer(WizardForm.Handle, 1, 5 {задаём интервал}, CallbackAddr(@Timer2, 0));
    KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Show';
    Flag:= False;
  end;
end;


procedure InitializeWizard();
 begin
  Flag:= False;
  
  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  hBtn:=TButton.Create(WizardForm);
  with hBtn do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;

помогите поправить пожалуйста!

Последний раз редактировалось Johny777, 17-05-2012 в 02:50.

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

Отправлено: 01:11, 17-05-2012 | #2061



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

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


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Johny777:
if SettingPanel.Top>-1 »
Цитата Johny777:
SetBounds(ScaleX(0),ScaleY(-315) »
все правильно - создаешь ее как и нужно, а закатываешь только до значения -1. тоесть правильно будет -
Код: Выделить весь код
if SettingPanel.Top>-315

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

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

Отправлено: 08:13, 17-05-2012 | #2062


Аватара для Johny777

Ветеран


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

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


Лександер,
Спасибо!
поправил
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy

[  Code]
var
  SettingPanel: TPanel;
  Flag: boolean;
  hBtn: TButton;

type
  TimerProc = procedure(Sender: TObject);

function CallbackAddr(Callback: TimerProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer(Sender: TObject);
begin
  if SettingPanel.Top<0 then SettingPanel.Top:=ScaleY(SettingPanel.Top + ScaleY(3));
end;

procedure Timer2(Sender: TObject);
begin
  if SettingPanel.Top>-315 then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
end;


procedure HideShow(Sender: TObject);
begin
If not Flag then
  begin
    SetTimer(WizardForm.Handle, 1, 5 {çàäà¸ì èíòåðâàë}, CallbackAddr(@Timer, 0));
    KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Hide';
    Flag:= True;
  end
else
  begin
    SetTimer(WizardForm.Handle, 1, 5 {çàäà¸ì èíòåðâàë}, CallbackAddr(@Timer2, 0));
    KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Show';
    Flag:= False;
  end;
end;


procedure InitializeWizard();
 begin
  Flag:= False;
  
  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  hBtn:=TButton.Create(WizardForm);
  with hBtn do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
и ещё вопрос
закометировал строки с KillTimer в процедуре и всё нормально
правильно ли?
может достаточно просто освобождать таймер при переходе на следующую страницу, а не каждый раз после выката и заката?
читать дальше »
Код: Выделить весь код
procedure HideShow(Sender: TObject);
begin
If not Flag then
  begin
    SetTimer(WizardForm.Handle, 1, 5 {задаём интервал}, CallbackAddr(@Timer, 0));
   ////// KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Hide';
    Flag:= True;
  end
else
  begin
    SetTimer(WizardForm.Handle, 1, 5 {задаём интервал}, CallbackAddr(@Timer2, 0));
   ///// KillTimer(WizardForm.Handle, 0); //////////
    hBtn.Caption:='Show';
    Flag:= False;
  end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then
    KillTimer(WizardForm.Handle, 0);
end;

Отправлено: 11:49, 17-05-2012 | #2063


Аватара для Gnom_aka_Lexander

Ветеран


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

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


скорее так, тогда:
Код: Выделить весь код
procedure Timer2;
begin
  if SettingPanel.Top=-315 then KillTimer(WizardForm.Handle, 1);
  if SettingPanel.Top>-315 then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
end;
будет более правильно, я думаю. при переходе на следующую страницу, ты можешь получить панель застрявшую на середине хода.

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

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

Отправлено: 12:07, 17-05-2012 | #2064


Аватара для Johny777

Ветеран


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

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


Лександер,
поправил
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy

[ Code]
var
  SettingPanel: TPanel;
  Flag: boolean;
  hBtn: TButton;

type
  TimerProc = procedure(Sender: TObject);

function CallbackAddr(Callback: TimerProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer(Sender: TObject);
begin
  if SettingPanel.Top<0 then SettingPanel.Top:=ScaleY(SettingPanel.Top + ScaleY(3));
end;

procedure Timer2(Sender: TObject);
begin
  if SettingPanel.Top>-315 then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
  //if SettingPanel.Top=-315 then KillTimer(WizardForm.Handle, 0);
end;


procedure HideShow(Sender: TObject);
begin
If not Flag then
  begin
    SetTimer(WizardForm.Handle, 1, 5, CallbackAddr(@Timer, 0));
    //KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Hide';
    Flag:= True;
  end
else
  begin
    SetTimer(WizardForm.Handle, 1, 5, CallbackAddr(@Timer2, 0));
    //KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Show';
    Flag:= False;
  end;
end;


procedure InitializeWizard();
 begin
  Flag:= False;
  
  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm.WelcomePage;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  hBtn:=TButton.Create(WizardForm);
  with hBtn do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then
    KillTimer(WizardForm.Handle, 0);
end;

назначил родителем панели страницу приветствия (для теста перехода)
странным образом при переходе во время выката на wpSelectDir и обратно она не застревает, а как будто бы выкатывается/закатывается "за глазами"
а при быстром переходе продолжает выкатываться, хотя таймер должен был быть освобождён!
может это и есть вся прелесть CallbackAddr , ведь эта функция числится среди расширенных?

Отправлено: 12:31, 17-05-2012 | #2065


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Johny777, нет. во первых у тебя не обозначен идентификатор таймера, во вторых ты запускаешь таймер с nIDEvent равным 1 а закрываешь - 0, тоесть совсем другой таймер.
Цитата Johny777:
может это и есть вся прелесть CallbackAddr , ведь эта функция числится среди расширенных? »
Ты используешь wrapcallback из innocallback.dll а не CallbackAddr из расширенной версии.

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

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

Отправлено: 12:37, 17-05-2012 | #2066


Аватара для Johny777

Ветеран


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

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


Лександер,
ясно
вернул единицу на место
могу ли я любое число (скажем 4) в хэндл ставить, чтоб другие таймеры не закрыть случайно?
те SetTimer(WizardForm.Handle, 4, 5 .... и KillTimer(WizardForm.Handle, 4);
Код: Выделить весь код
procedure Timer2(Sender: TObject);
begin
  if SettingPanel.Top>-315 then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
  if SettingPanel.Top=-315 then KillTimer(WizardForm.Handle, 1);
end;

Последний раз редактировалось Johny777, 17-05-2012 в 12:47.


Отправлено: 12:41, 17-05-2012 | #2067


Аватара для bugmenotagain

Старожил


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

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


alert30, мне нельзя спросить как запретить создавать unistall?

Отправлено: 12:47, 17-05-2012 | #2068


Аватара для Gnom_aka_Lexander

Ветеран


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

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


можно так:
Код: Выделить весь код
var
  timer : Integer;
....................................
if SettingPanel.Top=-315 then KillTimer(WizardForm.Handle, timer);
.......................................
SetTimer(WizardForm.Handle, 4, timer...
Вроде ничего не напутал

Цитата bugmenotagain:
мне нельзя спросить как запретить создавать unistall? »
Можно. Один раз. и смысла нет переспрашивать, получив правильный ответ. То, что у тебя не получилось этим ответом воспользоваться - это уже твоя беда все-таки, у меня все как нужно отработало - несколько раз проверил специально.
Johny777
таки я напутал
вот так правильно будет. Заодно сделал на встроенном в расширенную версию каллбеке.
читать дальше »

Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[*Code]
var
  SettingPanel   : TPanel;
  Flag           : boolean;
  Timer          : LongWord;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer1;
begin
  if SettingPanel.Top < 0 then SettingPanel.Top := SettingPanel.Top + ScaleY(3);
  if SettingPanel.Top = 0 then KillTimer(WizardForm.Handle, Timer);
end;

procedure Timer2;
begin
  if SettingPanel.Top > -315 then SettingPanel.Top := SettingPanel.Top - ScaleY(3);
  if SettingPanel.Top = -315 then KillTimer(WizardForm.Handle, Timer);
end;


procedure HideShow(Sender: TObject);
begin
  KillTimer(WizardForm.Handle, Timer);
  case Flag of
  True :
    begin
      Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('Timer2'));
      TButton(Sender).Caption:='Show';
    end;
  False :
    begin
      Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('Timer1'));
      TButton(Sender).Caption:='Hide';
    end;
  end;
  Flag:= not Flag;
end;


procedure InitializeWizard();
 begin
  Flag:= False;

  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  with TButton.Create(WizardForm) do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;

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


Последний раз редактировалось Gnom_aka_Lexander, 17-05-2012 в 13:22.

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

Отправлено: 12:47, 17-05-2012 | #2069


Аватара для Johny777

Ветеран


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

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


Лександер,
вылетало с ошибкой дубликата на слове timer (в процедуре таймер)
переименовал
не читать дальше »
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy

[  Code]
var
  SettingPanel: TPanel;
  Flag: boolean;
  hBtn: TButton;
  timerA : Integer;

type
  TimerProc = procedure(Sender: TObject);

function CallbackAddr(Callback: TimerProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer(Sender: TObject);
begin
  if SettingPanel.Top<0 then SettingPanel.Top:=ScaleY(SettingPanel.Top + ScaleY(3));
end;

procedure Timer2(Sender: TObject);
begin
  if SettingPanel.Top>ScaleY(-315) then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
  if SettingPanel.Top=ScaleY(-315) then KillTimer(WizardForm.Handle, timerA);
end;


procedure HideShow(Sender: TObject);
begin
If not Flag then
  begin
    SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr(@Timer, 0));
    hBtn.Caption:='Hide';
    Flag:= True;
  end
else
  begin
    SetTimer(WizardForm.Handle, 1, timerA , CallbackAddr(@Timer2, 0));
    hBtn.Caption:='Show';
    Flag:= False;
  end;
end;


timerA : Integer - для оптимизации или простоты?
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Цитата Лександер:
вот так правильно будет. Заодно сделал на встроенном в расширенную версию каллбеке. »
вот спасибо!

Отправлено: 13:23, 17-05-2012 | #2070



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

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Test ferget Тест-форум 0 24-08-2011 01:25
test ! ! Aaa ! ! Тест-форум 0 23-04-2011 11:29
test Santa aka Snt Тест-форум 0 16-04-2011 22:35
test xolod. Программное обеспечение Linux и FreeBSD 0 19-04-2009 21:03
Test memory KEugeNik Хочу все знать 11 23-11-2003 23:11




 
Переход