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

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

Бегущая строка.


Страницы:   1 2 3

JetAPI ©   (2007-08-09 17:00:00) 

Хочу попробовать написать код для "бегущей строки".
Начал подыскивать компонент, с помощью которого это можно сделать, но подобрать нужный не могу.
Подскажите:  какой стандартный компонент лучше всего подойдет для выполнения этой задачи?
Спасибо.

зы: В поиске ничего не нашёл; сейчас еще буду искать.


tmp   (2007-08-12 03:19:00) [21]


> Германн ©   (12.08.07 03:00) [31]
> Неметчиной повеяло :)

:-) А чего мудрить с придумыванием имён на англицком, если проще применять то, что думается автоматом.


{RASkov}   (2007-08-12 03:09:00) [22]

Вот мой вариант:
Форма, на ней ПаинтБокс, Таймер и кнопка...

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   PaintBox1: TPaintBox;
   Button1: TButton;
   Timer1: TTimer;
   procedure Button1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure PaintBox1Paint(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   R: TRect;
   Wdt: Integer;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
//Скролируемый текст
const STR = 'Tag:=(Tag mod (PaintBox1.Width+Wdt))+1; R.Left:=PaintBox1.Width-Tag; R.Right:=R.Left+Wdt; PaintBox1.Invalidate;';
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
*  BorderStyle:=bsDialog;
*  SetBounds((Screen.Width div 2) - 100, (Screen.Height div 2) - 75, 200, 100);
*  PaintBox1.SetBounds(8, 8, ClientWidth-16, 22);
*  Button1.SetBounds(64, 36, 65, 25);
*  Button1.Caption:='Start';
*  Timer1.Interval:=15;
 DoubleBuffered:=True;
 R:=PaintBox1.ClientRect;
 Wdt:=PaintBox1.Canvas.TextWidth(STR);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Button1.Tag:=ORD(not Boolean(Button1.Tag));
 Timer1.Enabled:=Boolean(Button1.Tag);
 if Timer1.Enabled then Button1.Caption:='Stop' else Button1.Caption:='Start';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Tag:=(Tag mod (PaintBox1.Width+Wdt)) +1; //Так же скорость можно менять и здесь
 R.Left:=PaintBox1.Width-Tag; R.Right:=R.Left+Wdt;
 PaintBox1.Invalidate;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 DrawText(PaintBox1.Canvas.Handle, STR, -1, R, 0);
end;

end.

* - можно в ИО выставить


> [31] Германн ©   (12.08.07 03:00)
> Неметчиной

Что это значит? :)


Германн   (2007-08-12 03:00:00) [23]

Неметчиной повеяло :)


tmp   (2007-08-12 02:24:00) [24]


> JetAPI ©   (09.08.07 17:51) [3]
> А StatusBar может для этого подойти?..
> Сейчас читаю про него... Или что-то может быть лучше?
> TLabel, хотел вначале попробывать, но в сторонних источниках
> пишут что он не очень подходит. А про то что подходит, не
> упоминается...
> Буду, конечно искать...
> Но если кто-сталкивался ранее, с созданием "бегущей сстроки",
>  может на мысль навести.
> Очень хотель бы самому сделать... Практика хорошая...

Лишь бы Canvas был и можно сделать всё, что приснится.

На форму, разумеется, поместить TLabel и TTimer.
Label1.Width должен быть меньше или равен ширине текста, а Label1.AutoSize должен быть = False. Timer1.Interval - по вкусу.

Удачи.


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Label1: TLabel;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   AusgabeText: String;
   AusgabePosition: Integer;
   BmpText: TBitmap;
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}
{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 with Label1 do
 begin
   AusgabeText := Caption;
   AusgabePosition := Width;
   Caption := '';
 end;
 
 BmpText := TBitmap.Create;
 with BmpText do
 begin
   Height := Label1.Height;
   Canvas.Font.Assign(Label1.Font);
   Canvas.Brush.Color := Label1.Color;
   Width := Canvas.TextWidth(AusgabeText) + 20;
   Canvas.TextOut(0,0,AusgabeText);
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
const
 AusgabePosition2: Integer = 0;
begin
 if AusgabePosition2 + BmpText.Width < Label1.Width then
   AusgabePosition := AusgabePosition2;
   
 AusgabePosition2 := AusgabePosition + BmpText.Width;
 with Label1 do
 begin
   Canvas.Brush.Color := Color;
   Canvas.FillRect(ClientRect);
   Canvas.Draw(AusgabePosition,0,BmpText);
   Canvas.Draw(AusgabePosition2,0,BmpText);
 end;
 AusgabePosition := AusgabePosition - 1;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 BmpText.Free;
end;

end.


Anatoly Podgoretsky   (2007-08-11 15:42:00) [25]

> Двигатель внешнего сгорания  (11.08.2007 14:53:28)  [28]

Смотри пластилиновая ворона.


Двигатель внешнего сгорания   (2007-08-11 14:53:00) [26]


> Метлы в руки !!!


Для тупых можно подробнее?


MsGuns   (2007-08-10 23:35:00) [27]

>novill ©   (10.08.07 15:36) [25]
>Sonic90   (10.08.07 23:05) [26]

Метлы в руки !!!


Sonic90   (2007-08-10 23:05:00) [28]

procedure TForm1.Timer1Timer(Sender: TObject);
var
s:String;
begin
     s:=Label1.Caption;
    s:=s+s[1];
    delete(s,1,1);
    Label1.Caption:=s;
end;


novill   (2007-08-10 15:36:00) [29]

Я делал так:
1. удвоил выводимую строку
2. выводил ее Textout постепенно уменьшая координату Х, пока не доходил до момента когда копазывался только второй экземпляр.


MsGuns   (2007-08-10 15:19:00) [30]

Можно. Самый простой пример - по таймеру "отрезать" от строки сколько нужно (или в символах или в пикселях на канве) и перемещать лабел влево или вправо по контейнеру, явно его при этом перерисовывая


Alral   (2007-08-10 14:59:00) [31]

А TLabel нельзя сделать прозрачной и двигать по горизонтали (или как надо) изменяя Left(или Top)?


MsGuns   (2007-08-10 11:04:00) [32]

>Германн ©  

Не надо давать вредных советов


JetAPI   (2007-08-10 10:52:00) [33]

Германн

> Уж сколько раз твердили миру, что RxLibrary дана нам всем
> её разработчиками в исходниках!

Я не знал этого... Я про эту библиотеку, вот, только узнал... здесь. На будущее выводы сделал.


{RASkov}   (2007-08-10 02:24:00) [34]

> [19] Германн ©   (10.08.07 02:02)
> P.S. "иже с ними". Иначе не понятно что снимать! То ли одёжку, то ли фильму. :-)

Так и знал.... "влетит" :)


Германн   (2007-08-10 02:02:00) [35]


> {RASkov} ©   (10.08.07 01:44) [18]


> ...Но не JEDI и иже сними :)
>

Не знаю, не пробовал, посему "молчу в тряпочку" :)
P.S. " иже с ними". Иначе не понятно что снимать! То ли одёжку, то ли фильму. :-)


{RASkov}   (2007-08-10 01:44:00) [36]

> [17] Германн ©   (10.08.07 01:28)
> RxLibrary - один из золотых фондов программистов Дельфи.

+5
...Но не JEDI и иже сними :)


Германн   (2007-08-10 01:28:00) [37]


> JetAPI ©   (09.08.07 23:58) [16]
>
> Германн, скорее всего, мне это не подойдет...
> Я пользую версию Turbo Delphi for Win32 (free), а она, как
> раз, имеет ограничение на подключение стороних компонентов.
>
>

Уж сколько раз твердили миру, что RxLibrary дана нам всем её разработчиками в исходниках! Не хочешь использовать сторонние компоненты или не можешь их использовать, так хоть посмотри исходники сей библиотеки. Найдёшь много всего.
Повторю ещё раз. RxLibrary - один из золотых фондов программистов Дельфи.


JetAPI   (2007-08-09 23:58:00) [38]

Германн, скорее всего, мне это не подойдет...
Я пользую версию Turbo Delphi for Win32 (free), а она, как раз, имеет ограничение на подключение стороних компонентов.
Так что, TPaintBox ,буду осваивать и постигать.


JetAPI   (2007-08-09 23:44:00) [39]

$00FF00, даа... Даже трудно что-либо сказать...
Я когда смотрел, единственное о чем подумал, что такой труд, ив консоле  написан.
Но во всем этом, алгоритм важен! Когда определюсь: как и что, буду штудировать. Спасибо.


Германн   (2007-08-09 21:30:00) [40]


> Хочу попробовать написать код для "бегущей строки".
> Начал подыскивать компонент, с помощью которого это можно
> сделать, но подобрать нужный не могу.
>

TSecretPanel из RxLibrary


Страницы:   1 2 3

Наверх

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