Ветеран
Сообщения: 649
Благодарности: 444
Профиль
|
Отправить PM
| Цитировать
Gnom_aka_Lexander ,
El Sanchez , поздравьте меня!
Тк сделал свой вариант "выкатов и закатов". 2 дня убил на код: (зато никаких таймеров)
подробнее в коде:
читать дальше »
Код:
[Setup]
AppName=The_Best_RollDemo_Ever
AppVerName=The_Best_RollDemo_Ever v 777
DefaultDirName={pf}\The_Best_RollDemo_Ever
DefaultGroupName=The_Best_RollDemo_Ever
OutputDir=.
Uninstallable=no
[code]
var
PanelUp, PanelDown, PanelLeft, PanelRight: TPanel;
RollInfo: DWORD;
function SleepEx(dwMilliseconds: DWORD; bAlertable: BOOL): DWORD; external 'SleepEx@Kernel32.dll stdcall';
// сдвиг статичный в один пиксель (не менять)
// плюсы такого сдвига:
// 1. плавность
// 2. точность выполнения (что будет если панель высотой 70 двигать по 3 пикселя до -70)
// 3. настройка скорости задержкой (диапазон от 0 до 100 = 101 скоростей)
///////// Roll(переменная_контрола(например панель или скроллбокс или мемо), задержка(максимум 100 т.к. дальше будет некрасиво))
procedure Roll(Ctrl:TControl; RollDelay: Integer);
begin
case RollInfo of
$1: repeat
if SleepEx(RollDelay,True) = 0 then Ctrl.Top := Ctrl.Top + ScaleY(1); /// сверху вниз и назад
Application.ProcessMessages;
until (RollInfo = $0) or (Ctrl.Top = 0)
$0: repeat /// снизу вверх
if SleepEx(RollDelay,True) = 0 then Ctrl.Top := Ctrl.Top - ScaleY(1);
Application.ProcessMessages;
until (RollInfo = $1) or (Ctrl.Top = - Ctrl.Height)
//////////////////////////////////////////////////////////////////
$4: repeat
if SleepEx(RollDelay,True) = 0 then Ctrl.Left := Ctrl.Left + ScaleX(1); /// слева направо и назад
Application.ProcessMessages;
until (RollInfo = $3) or (Ctrl.Left = 0)
$3: repeat
if SleepEx(RollDelay,True) = 0 then Ctrl.Left := Ctrl.Left - ScaleX(1);
Application.ProcessMessages;
until (RollInfo = $4) or (Ctrl.Left = - Ctrl.Width);
///////////////////////////////////////////////////////////////////
$6: repeat
if SleepEx(RollDelay,True) = 0 then Ctrl.Left := Ctrl.Left - ScaleX(1); /// справа налево и назад
Application.ProcessMessages;
until (RollInfo = $5) or (Ctrl.Left = Ctrl.Parent.Width-Ctrl.Width)
$5: repeat
if SleepEx(RollDelay,True) = 0 then Ctrl.Left := Ctrl.Left + ScaleX(1);
Application.ProcessMessages;
until (RollInfo = $6) or (Ctrl.Left = Ctrl.Parent.Width);
////////////////////////////////////////////////////////////////////
$8: repeat
if SleepEx(RollDelay,True) = 0 then Ctrl.Top := Ctrl.Top - ScaleY(1); /// снизу вверх и назад
Application.ProcessMessages;
until (RollInfo = $7) or (Ctrl.Top = Ctrl.Parent.Height-Ctrl.Height)
$7: repeat
if SleepEx(RollDelay,True) = 0 then Ctrl.Top := Ctrl.Top + ScaleY(1);
Application.ProcessMessages;
until (RollInfo = $8) or (Ctrl.Top = Ctrl.Parent.Top + Ctrl.Height);
end;
end;
procedure UpDown(Sender: TObject);
begin
case TButton(Sender).Caption of
'Roll1':
begin
TButton(Sender).Caption:='Roll0';
RollInfo := $1;
Roll(PanelDown,0); //// A
// RollInfo := $4; //////// B
// Roll(PanelLeft,0);
// RollInfo := $6;
// Roll(PanelRight,2); ///////// C
// RollInfo := $8;
// Roll(PanelUp,0); //////////// d
end;
'Roll0':
begin
TButton(Sender).Caption:='Roll1';
RollInfo := $0;
Roll(PanelDown,10); ////// A
// RollInfo := $3;
// Roll(PanelLeft,0); ///////// B
// RollInfo := $5;
// Roll(PanelRight,0); //////////// C
// RollInfo := $7;
// Roll(PanelUp,0); //////////// d
end;
end;
end;
procedure InitializeWizard();
begin
PanelUp := TPanel.Create(WizardForm);
with PanelUp do
begin
Parent := WizardForm;
SetBounds(ScaleX(0),Parent.Top + Parent.Height,ScaleX(497),ScaleY(200));
ParentBackground := False;
Color := clBlue;
end;
PanelDown := TPanel.Create(WizardForm);
with PanelDown do
begin
Parent := WizardForm;
SetBounds(ScaleX(0),ScaleY(-200),ScaleX(497),ScaleY(200));
ParentBackground := False;
Color := clYellow;
end;
PanelLeft := TPanel.Create(WizardForm);
with PanelLeft do
begin
Parent := WizardForm;
SetBounds(ScaleX(-200),ScaleY(0),ScaleX(200),ScaleY(314));
ParentBackground := False;
Color := clGreen;
end;
PanelRight := TPanel.Create(WizardForm);
with PanelRight do
begin
Parent := WizardForm;
SetBounds(Parent.Width + ScaleX(200),ScaleY(0),ScaleX(200),ScaleY(314));
ParentBackground := False;
Color := clRed;
end;
with TButton.Create(WizardForm) do
begin
OnClick:= @UpDown;
SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
Caption:='Roll1';
Parent:= WizardForm;
end;
end;
просьба оценить работу! (отписаться о впечатлениях)
Это сообщение посчитали полезным следующие участники:
Отправлено : 00:02, 11-10-2012
| #1110