Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бегущая строка, Плавное движение бегущей строки 
:(
    Опции темы
Mina
Дата 28.9.2006, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 11.11.2005

Репутация: нет
Всего: нет



Доброе время суток.

Нужно написать прогу бегущей строки.
Перепробывал нескоько вариантов, через copy. просто двигать по форме,  движение строки получается прерывистым, а нужно чтобы было плавным.
Посоветуйте как решить эту проблему.
Можно небольшой примерчик.
PM MAIL   Вверх
Alexeis
Дата 28.9.2006, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Вот только что набрасал. Имагу бросил на панельку, растянул. И еще добави таймер. Частоту кадров fr советую не менять, так как это сильно жрет ресурсы, а человек все равно больше 25 в секунду не воспринимает, а вот скоросто v (пикс/сек) можно менять по усматрению.
Текст можно писать любой, т.к. все настройки автоматом пересчитываюся.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    tmr1: TTimer;
    pnl1: TPanel;
    img1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure tmr1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  v        : extended = 100; //скорость (пикселов в сек)
  fr       : extended = 25; //число кадров в сек
  linetext : ansistring = 'Это пример бегущей строки';
  textwidth: Integer;
  textpose : Extended;
  textposi : integer;


procedure TForm1.FormCreate(Sender: TObject);
begin
  tmr1.Interval := round(1000 / fr);
  textwidth     := img1.Canvas.TextWidth(linetext);
  textpose      := -textwidth;
  textposi      := -textwidth;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
  patblt(img1.Canvas.Handle, 0, 0, img1.Width, img1.Height, WHITENESS);
  setbkmode(img1.Canvas.Handle, TRANSPARENT);
  img1.Canvas.TextOut(textposi, 25, linetext);

  if textpose > img1.Width
  then
    textpose := -textwidth
  else
    textpose := textpose + v / fr;

  textposi := round(textpose);
end;

end.




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Mina
Дата 29.9.2006, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 11.11.2005

Репутация: нет
Всего: нет



Нет всеравно не то, плавнее нужно.
PM MAIL   Вверх
Alexeis
Дата 29.9.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



дергания возникают из-за погрешности таймера. Чтоб достичь плавности необходимо больше ресурсов. Решить можно двумя путями 
1) Увеличить частоту обновлений (предел 100Гц) это приведет к тому что уменьшится каждый шаг сдвига и ошибка по времени будет менее заметна, но это приводит к тому, что выводится много кадров которые просто не видны, а значит бесполезно расходуются ресурсы.

2) Более грамотный, но и более сложный путь. Использовать мультимедийный таймер с указанием точности в 1мс. В этом случае часта будет выдерживатся с точностью до 0,6 Гц (на 25герцах), тогда как обычный таймер дает точность 5Гц (на 25герцах). Но работа такого таймера производится в отдельном потоке, в свзи с чем нужно использовать синхорнизировать обмен данными с основным потоком (если таковой планируется). Потребление ресурсов у такого таймера тоже выше, но на столько как в первом случае, поскольку рисуются все те же 25 кадров в сек.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ru_
Дата 16.12.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 16.12.2006

Репутация: нет
Всего: нет



Я только учуся  smile 

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    TrackBar1: TTrackBar;
    timer1: TTimer;
    procedure TrackBar1Change(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
      s,sr:string;
      a,ar:integer;
      h:char;
  implementation
{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption:='';
timer1.Enabled:=true;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
if memo1.Text='' then exit;
a:=length(label1.Caption);
s:=label1.Caption;
ar:=length(memo1.Text);
if a>=ar then timer1.Enabled:=false;
sr:=memo1.Text;
h:=sr[a+1];
insert(h,s,a+1);
label1.Caption:=s;

end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
timer1.Interval:=trackbar1.Position;
end;

end.


Animtext.exe

Это сообщение отредактировал(а) Ru_ - 16.12.2006, 19:49
PM MAIL   Вверх
Bitter
Дата 16.12.2006, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 6
Всего: 27



Может это подойдет. Написано на Delphi 7. Здесь таймер не используется, однако он присутствует и нужен для запуска алгоритма через 100 мсек после запуска проги.

Присоединённый файл ( Кол-во скачиваний: 60 )
Присоединённый файл  ______________.rar 6,65 Kb
PM MAIL ICQ Skype   Вверх
Mina
Дата 18.12.2006, 04:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 11.11.2005

Репутация: нет
Всего: нет



Спасибо всем большое.

Выход нашел, написал используя DirectX.
Тема закрыта.
PM MAIL   Вверх
sneJok
Дата 2.6.2011, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



delete

Это сообщение отредактировал(а) sneJok - 11.6.2011, 14:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.