Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 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