Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 4]
Johny777
17-05-2012, 01:11
А можно и без таймеров: »
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, из-за которой оно мигало, в нём тоже отпала необходимость (кажется)
можно использовать ф-ию 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;
помогите поправить пожалуйста!
Gnom_aka_Lexander
17-05-2012, 08:13
if SettingPanel.Top>-1 »
SetBounds(ScaleX(0),ScaleY(-315) »
все правильно - создаешь ее как и нужно, а закатываешь только до значения -1. тоесть правильно будет -
if SettingPanel.Top>-315
Johny777
17-05-2012, 11:49
Лександер,
Спасибо!
поправил
[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;
Gnom_aka_Lexander
17-05-2012, 12:07
скорее так, тогда:
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;
будет более правильно, я думаю. при переходе на следующую страницу, ты можешь получить панель застрявшую на середине хода.
Johny777
17-05-2012, 12:31
Лександер,
поправил
[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 :), ведь эта функция числится среди расширенных?
Gnom_aka_Lexander
17-05-2012, 12:37
Johny777, нет. во первых у тебя не обозначен идентификатор таймера, во вторых ты запускаешь таймер с nIDEvent равным 1 а закрываешь - 0, тоесть совсем другой таймер. может это и есть вся прелесть CallbackAddr , ведь эта функция числится среди расширенных? »
Ты используешь wrapcallback из innocallback.dll а не CallbackAddr из расширенной версии.
Johny777
17-05-2012, 12:41
Лександер,
ясно
вернул единицу на место
могу ли я любое число (скажем 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;
bugmenotagain
17-05-2012, 12:47
alert30, мне нельзя спросить как запретить создавать unistall?
Gnom_aka_Lexander
17-05-2012, 12:47
можно так:
var
timer : Integer;
....................................
if SettingPanel.Top=-315 then KillTimer(WizardForm.Handle, timer);
.......................................
SetTimer(WizardForm.Handle, 4, timer...Вроде ничего не напутал :)
мне нельзя спросить как запретить создавать 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;
Johny777
17-05-2012, 13:23
Лександер,
вылетало с ошибкой дубликата на слове 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 - для оптимизации или простоты?
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
вот так правильно будет. Заодно сделал на встроенном в расширенную версию каллбеке. »
вот спасибо! :)
Gnom_aka_Lexander
17-05-2012, 13:29
Ну, и нет пределов совершенству, как говорит Seregа, - в одной процедуре таймера сделал, до кучи - как говорится, пользуйте, как лучше нравится :)
[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 MyTimer;
begin
case Flag of
True :
begin
if SettingPanel.Top = 0 then
KillTimer(WizardForm.Handle, Timer);
if SettingPanel.Top < 0 then SettingPanel.Top := SettingPanel.Top + ScaleY(3);
end;
False :
begin
if SettingPanel.Top = ScaleY(-315) then
KillTimer(WizardForm.Handle, Timer);
if SettingPanel.Top > ScaleY(-315) then SettingPanel.Top := SettingPanel.Top - ScaleY(3);
end;
end;
end;
procedure HideShow(Sender: TObject);
begin
KillTimer(WizardForm.Handle, Timer);
Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('MyTimer'));
case Flag of
True : TButton(Sender).Caption:='Show';
False : TButton(Sender).Caption:='Hide';
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;
для оптимизации или простоты? »
нет, это дескриптор таймера, по ид он не убивается, вроде.
Johny777
17-05-2012, 13:35
Лександер,
ну та что на одной процедуре отличается от предыдущей тем, что её нельзя начать закатывать во время выката, а ту с двумя можно!
и везде SettingPanel.Top = -315 кажись правильнее будет записать SettingPanel.Top = ScaleY(-315)
El Sanchez,
думаю этим примерам прямая дорога в шапку, в "Ссылки на примеры скриптов" :)
Gnom_aka_Lexander
17-05-2012, 13:38
Johny777, поправил, теперь можно на ходу менять направление :)
В одной процедуре - просто меньше шансов запутаться в дальнейшем.
кажись правильнее будет записать SettingPanel.Top = ScaleY(-315) »
совершенно верно.
El Sanchez
17-05-2012, 18:19
Johny777, нужно рассчитывать интервал таймера и сдвиг контрола в зависимости от размеров самого контрола. Если у меня, к примеру, панель высотой в 2 пикселя и надо все это дела выкатить/закатить за, скажем, 1 сек., то фиксированный сдвиг в 3 пикселя и фиксированный интервал таймера в 5 мс не катят. Убил полдня на алгоритм, вот вариант.
[Code]
var
SettingPanel: TPanel;
hBtn: TButton;
//iStartTime: Integer; //debug
iTimer, iRollInfo: Integer;
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
//function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall'; //debug
procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
var
iLen, iStep: Integer;
begin
iLen := iRollInfo and $FFFF;
iStep := (iRollInfo and $FF0000) shr $10;
case iRollInfo shr $18 of
$0: begin
if SettingPanel.Left >= -iStep then
begin
KillTimer(0, iTimer);
hBtn.Enabled := True;
end;
SettingPanel.Left := SettingPanel.Left + iStep;
//WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Left); //debug
end;
$1: begin
if SettingPanel.Left <= -iLen + iStep then
begin
KillTimer(0, iTimer);
hBtn.Enabled := True;
end;
SettingPanel.Left := SettingPanel.Left - iStep;
//WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Left); //debug
end;
$2: begin
if SettingPanel.Top >= -iStep then
begin
KillTimer(0, iTimer);
hBtn.Enabled := True;
end;
SettingPanel.Top := SettingPanel.Top + iStep;
//WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Top); //debug
end;
$3: begin
if SettingPanel.Top <= -iLen + iStep then
begin
KillTimer(0, iTimer);
hBtn.Enabled := True;
end;
SettingPanel.Top := SettingPanel.Top - iStep;
//WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Top); //debug
end;
end;
end;
procedure RollControl(Ctrl: TControl; dwTime, dwFlag: DWORD);
// Ctrl : control
// dwTime : rolling time, ms
// dwFlag : roll type ($0 - left to right, $1 - right to left, $2 - top to bottom, $3 - bottom to top)
var
iLen, iStep: Integer;
iKoeff: Extended;
begin
iLen := (dwFlag shr $1 xor $1)*Ctrl.Width + (dwFlag shr $1)*Ctrl.Height;
repeat
iStep := iStep + 1;
iKoeff := (iStep * dwTime)/(iLen * 1000/64);
until iKoeff >= 1;
//
if iRollInfo = 0 then iRollInfo := (dwFlag shl $18) or (iStep shl $10) or iLen else iRollInfo := iRollInfo xor $1000000;
iTimer := SetTimer(0, 0, Trunc(iKoeff)*1000/64, CallbackAddr('TimerProc'));
end;
procedure HideShow(Sender: TObject);
begin
//iStartTime := GetTickCount; //debug
RollControl(SettingPanel, 1000, $2);
TButton(Sender).Enabled := False;
end;
procedure InitializeWizard();
begin
SettingPanel := TPanel.Create(WizardForm);
with SettingPanel do
begin
Parent := WizardForm;
SetBounds(ScaleX(0), ScaleY(-315), ScaleX(497), ScaleY(315));
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, 18:38
Убил полдня на алгоритм »
опять же "неоценимая помощь"
Спасибо! :blush2:
очень удобно то, что в процедуре настраивать ничего не нужно
записал в "HideShow" "$0"
(у меня ведь выкат слева)
http://img859.imageshack.us/img859/1681/41124483.jpg (http://imageshack.us/photo/my-images/859/41124483.jpg/)
а в закомментированных строках с препиской //debug на конце можно вписать изменение названия кнопки/выпадающего меню (у меня)
(MnuItem.Caption := ExpandConstant('{cm:Console0}'); MnuItem.Caption := ExpandConstant('{cm:Console1}'))
В общем разобрался немного! :
если попытаться закатить панель в процессе выката, то у неё слетают тормоза
bugmenotagain
18-05-2012, 22:24
какой выбрать уровень сжатия
fast
normal
max
ultra
чтобы данные не повредить чрезмерным сжатием
и галочку ставить "уплотненное сжатие файлов"?
Johny777
18-05-2012, 23:31
чтобы данные не повредить чрезмерным сжатием »
а такое бывает?
хз, тк не интересовался особо, но вроде прекомп может повредить и то при условиях...
но, что стоит в справке= одобрено
те сжимай как хош :)
вот например настройка на максимальное сжатие стандартными (встроенными. а инно использует lzma/lzma2 алгоритмы = 7Zip архиватор) средствами
Compression=lzma2/ultra64
LZMAUseSeparateProcess=yes
LZMAMatchFinder=BT
LZMANumFastBytes=273
LZMADictionarySize=262144
///LZMADictionarySize=131072
InternalCompressLevel=ultra64
///SolidCompression=true
MergeDuplicateFiles=true
только словарь настрой тестами под себя
также если есть "тяжёлые" компоненты, то не используй SolidCompression=true, который может повысить уровень сжатия
и учти, что чем выше сжатие, тем дольше распаковка
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
и галочку ставить "уплотненное сжатие файлов"? »
есть классный GUI для создания скриптов "Inno Script Studio"
https://www.kymoto.org/inno-script-studio/download
попробуй
bugmenotagain
19-05-2012, 12:22
только словарь настрой тестами под себя »
что такое словарь и как его настораивать
Johny777
19-05-2012, 14:26
что такое словарь »
в гугл забей "словарь архиватора"
и как его настораивать »
2 строки
используй одну из них
LZMADictionarySize=262144 ///(этот когда много мелких файлов)
LZMADictionarySize=131072
тесты покажут при каком сильнее жмёт
bugmenotagain
19-05-2012, 14:35
все эти программы для inno setup которые Я скачал однотипные и примитивные. нет нормального графического оформления, настройка страниц, отключение деинсталляции для определенных компонентов и еще много чего.
2 строки
используй одну из них
LZMADictionarySize=262144 ///(этот когда много мелких файлов)
LZMADictionarySize=131072
тесты покажут при каком сильнее жмёт »
не проще FreeArc'ом сжать? говорят мощная штука
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.