//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "frmMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString RunText = ""; //Исходный текст изменяемый
AnsiString RunText2 = "CodeByNet. Лучший форум по программированию... [A в этом месте могла бы быть ваша реклама]"; //Исходный текст Не изменяемый
AnsiString RunText3 = ""; //Это то что будет писаться в конец, если начало уже зашло за границу
AnsiString Buffer = ""; //Буфер... Пробелами будем заполнять
bool all = false; //Переменная когда RunText == RunText2 и находится в самой дальней точке
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
TCanvas *Canva = StatusBar1->Canvas; //Для удобства заведем указатель на Canvas
//А то код и так слишком длинный, я за это Builder и не люблю
Canva->Font = StatusBar1->Font; //На всякий указжем канвасу визуальный шрифт StatusBarа
Buffer = ""; //Обнулим буферную переменную (в которой наши пробелы промежуточные)
if (!all)//Если флаг False, то заполним RunText пробелами от начала
{
//Пока шинина текска RunText < Клиенской области СтатусБара
while (Canva->TextWidth(RunText) < StatusBar1->ClientWidth)
{
//То дополняем пробелами от начала
RunText = " " + RunText;
}
all = true; //Выставим флаг
}
//Теперь Оконцовка строки
//Пока ширина текста RunText+Buffer+RunText3 < Клиенской области, то
while ((Canva->TextWidth(RunText) + Canva->TextWidth(Buffer)+ Canva->TextWidth(RunText3)) < StatusBar1->ClientWidth)
{
//Добавляем Buffer пробелами (Буфер у нас в середине стоит)
Buffer+=" ";
}
//Это просто в лаблу запишим.. Для визуальности
Label1->Caption = RunText;
StatusBar1->Repaint(); //Скажим что StatusBar следует перерисовать
//Уберем первый символ и RunText
RunText = RunText.SubString(2,RunText.Length());
//Если длина RunText стала 0, то
if (RunText.Length() == 0)
{
all = false; //Выставим флаг
RunText = RunText2; //Присвоим исходный текст
RunText3 = ""; //Обнулим RunText3
}
//Если длина RunText < Исходного текста, то нужно записать RunText3
if (RunText.Length() < RunText2.Length())
{
//Запишим в RunText3 количество символов из исх. текста равная разницы дли RunText2 и RunText
RunText3 = RunText2.SubString(0,RunText2.Length()- RunText.Length());
}
//Можно и без этого
//Application->ProcessMessages();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StatusBar1DrawPanel(TStatusBar *StatusBar,
TStatusPanel *Panel, const TRect &Rect)
{
//Отрисуем на канве
StatusBar->Canvas->TextOutA(0,10,RunText+Buffer+RunText3);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StatusBar1->DoubleBuffered = true;
Form1->StatusBar1->ControlStyle << csOpaque;
RunText = RunText2; //По умолчанию
}
//---------------------------------------------------------------------------