Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Имплонтация мультимедийного таймера в свой компонент [D6, WinXP]


Страницы:   1 2

Jimmy ©   (2007-09-19 21:00:00) 

Не подскажите, как имплонтировать мультимедийный таймер в свой компонент? Заранее спасибо.


Инс   (2007-09-20 14:43:00) [1]

>[33]-[38]

+1 :))


Сергей М.   (2007-09-20 14:34:00) [2]


> Еще толком не разобрался


Ну тогда убирай его нафих.

Вот как разберешься, зачем тебе оно нада, тогда и вернешь его на место, но уже с полным, надеюсь, пониманием происходящего при этом как в ран-. так и в дизайн-тайм.


Jimmy   (2007-09-20 14:33:00) [3]

Взял из какого-то примера. Еще толком не разобрался.


Сергей М.   (2007-09-20 14:25:00) [4]


> Не знаю


А зачем тогда объявил это событие, раз не знаешь ?


Jimmy   (2007-09-20 14:24:00) [5]

Не знаю.


Сергей М.   (2007-09-20 14:03:00) [6]


> Jimmy   (20.09.07 13:53) [33]


Можно.

Но лишь после того как ты ответишь на [23]


Jimmy   (2007-09-20 13:53:00) [7]

Так можно сделать анимацию на этапе DesignTime?


clickmaker   (2007-09-20 13:14:00) [8]


> [24] Jimmy   (20.09.07 12:06)

есть такая отличная штука - memory-mapped bitmap. Это когда рисуешь картинку сначала на канве битмапа, а после его целиком шлепаешь, куда надо.
в некоторых контролах это реализовано как DoubleBuffered

Я писал игрушку типа змейка на апи, так она у меня уже при 75мс бегала, как угорелая


Сергей М.   (2007-09-20 13:13:00) [9]


> homm ©   (20.09.07 13:10) [30]


Да я думал, что он за один тик успевает всего 18 пикселей нарисовать)

А он, оказывается, о сдвиге)


homm   (2007-09-20 13:10:00) [10]

> [26] Сергей М. ©   (20.09.07 12:07)
> В одном кадре должно формироваться все изображение той самой
> строки, а не ее шматок в 18 пикселов !

Зато Ваш телепатор сбоит. 18 пикселей, это смещение за секунду, при скорости смещения 1 пиксель в кадр и 18 кадров в секунду.


Jeer   (2007-09-20 12:36:00) [11]


> 3. 18 кадров=18 пикселей в секунду. Мало!
>


На платформах NT 10 ms == 100 Гц ( 100 frame per sec)
Этого за глаза хватит для видимой плавности движения.
При желании можно еще замедлить скролл путем имитации дробного шага
за счет инерционности зрения:

 step := 1; //px
 Inc(i);
 if (i mod 3)=0 then step := - step
 else step := 1;
 *.Left := *.Left + step;


Сергей М.   (2007-09-20 12:16:00) [12]


> Jimmy


Эдак тебе никикх таймеров не хватит)

Дай тебе таймер с разрешением в 5мс, у тебя возникнет идея-фикс двигать изображение на пол-пикселя за один тик)


Сергей М.   (2007-09-20 12:09:00) [13]

Похоже в [19] телепатор попал в точку)


Сергей М.   (2007-09-20 12:07:00) [14]


> 18 кадров=18 пикселей в секунду. Мало!


Конечно мало, если в каждом кадре ты умеешь нарисовать всего 18 пикселей)

В одном кадре должно формироваться всеизображение той самой строки, а не ее шматок в 18 пикселов !


Инс   (2007-09-20 12:07:00) [15]


> Шаг = 5 пикселей - некрасивая анимация.

При скорости 18 кадров в секунду - никто этого шага не заметит :))


Jimmy   (2007-09-20 12:06:00) [16]

Шаг = 5 пикселей - некрасивая анимация. Да Бог с ним, с мультимедиа таймером. У меня XP и действительно можно сделать тик равный 10 мсек. Это уже хорошо. Что на счет DesignTime?


Сергей М.   (2007-09-20 12:04:00) [17]


> procedure TDiDRunString.Timer(Sender: TObject);
> begin
> if Assigned(FOnTimer) then FOnTimer(self);
> XX:=XX-1;
> DrawMain;
> Invalidate;
> end;


Зачем компонент TDiDRunString имеет св-во-событие  OnTimer ?


Инс   (2007-09-20 12:03:00) [18]


> 3. 18 кадров=18 пикселей в секунду. Мало!

А кто мешает сделать свойство, задающее шаг - 1 пиксел или 2 или 10?


Jimmy   (2007-09-20 12:01:00) [19]

1. Разрабатываю бегущую строку.
2. Не знаю как ее разработать без таймера.
3. 18 кадров=18 пикселей в секунду. Мало!


Jimmy   (2007-09-20 11:58:00) [20]

type
  TDiDRunString = class(TGraphicControl)
  private
    FActive: Boolean;
    FInterval: integer;
    FTimer: TTimer;
    FOnTimer: TNotifyEvent;
    FCaption : string;
    FKRgn : HRgn;
    procedure SetActive(Value: Boolean);
    procedure SetInterval(Interval: integer);
    procedure Timer(Sender: TObject);
    procedure SetCaption(Value: string);
    procedure FreeRegion;
  protected
    procedure Paint; override;
    procedure DrawMain;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Interval: integer read FInterval write SetInterval;
    property Active: Boolean read FActive write SetActive;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
    property Caption: string read FCaption write SetCaption;
    property Enabled;
    property Font;
    property ParentFont;
    property ParentShowHint;
    property ShowHint;
    property Visible;
    property OnClick;
  end;

Var XX:Integer;

procedure Register;

implementation
{------------------------------------------------------------------------------}
procedure Register;
begin
RegisterComponents('DiD', [TDiDRunString]);
end;
{------------------------------------------------------------------------------}
constructor TDiDRunString.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csClickEvents,csCaptureMouse];
XX:=0;
Width := 150;
Height := 20;
FKRgn := 0;
FActive:=False;
if not (csDesigning in ComponentState) then
  try
  FTimer := TTimer.Create(self);
  FTimer.Enabled := false;
  FTimer.Interval := FInterval;
  FTimer.OnTimer := Timer;
  except
  FreeAndNil(FTimer);
  end;
end;
destructor TDiDRunString.Destroy;
begin
if FKRgn <> 0 then FreeRegion;
if Assigned(FTimer) then FreeAndNil(FTimer);
inherited Destroy;
end;
procedure TDiDRunString.SetInterval(Interval: integer);
begin
 FInterval := Interval;
 if Assigned(FTimer) then
   FTimer.Interval := FInterval;
end;
procedure TDiDRunString.Timer(Sender: TObject);
begin
if Assigned(FOnTimer) then FOnTimer(self);
XX:=XX-1;
DrawMain;
Invalidate;
end;
procedure TDiDRunString.DrawMain;
begin
Canvas.Font.Height:=Font.Height;
Canvas.Font.Name:=Font.Name;
Canvas.Brush.Style:=bsClear;
Canvas.TextOut(XX, 0, Caption);
if XX<Canvas.TextWidth(Caption)*(-1) then XX:=Width;
end;
procedure TDiDRunString.FreeRegion;
begin
if FKRgn <> 0 then DeleteObject(FKRgn);
FKRgn := 0;
end;
procedure TDiDRunString.Paint;
begin
inherited Paint;
FreeRegion;
DrawMain;
end;
procedure TDiDRunString.SetCaption(Value: string);
begin
if FCaption=Value then Exit;
FCaption:=Value;
Invalidate;
end;
procedure TDiDRunString.SetActive(Value: Boolean);
begin
if FActive=Value then Exit;
FActive:=Value;
if Not(csDesigning in ComponentState) then FTimer.Enabled:=Value;
Invalidate;
end;
end.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо