Создание бегущей строки в Delphi

Итак, как вы уже догадались, сегодня мы будем делать бегущую строку в своём Delphi-приложении.
Однажды мне очень понадобилось некое подобие TEdit\’a, только не со стационарной, а с бегущей строкой (все символы просто не влазили, а показать нужно было всё…) Вот я и задумался, как же это сделать. Сегодня я расскажу вам 2 способа решения данной проблeмы.Итак, как вы уже догадались, сегодня мы будем делать бегущую строку в своём Delphi-приложении.
Однажды мне очень понадобилось некое подобие TEdit\’a, только не со стационарной, а с бегущей строкой (все символы просто не влазили, а показать нужно было всё…) Вот я и задумался, как же это сделать. Сегодня я расскажу вам 2 способа решения данной проблeмы.

Способ первый, он первым пришёл мне в голову. Поиграться со свойством Text Edit\’a, т.е. через определённый промежуток времени «смещать» саму строку. Под смещением я понимаю удаление первого символа строки и добавление нового последнего. Таким образом получается цикл нужного нам текста.
Для этого кинем на форму один таймер, один TEdit и объявим глобальную переменную i сразу после слова implementation. i по умолчанию должно равняться единице, т.е. её оъявление будет выглядеть так:


implementation

var
   i: integer = 1;

А сам код таймера будет выглядеть так:

procedure TForm1.Timer1Timer(Sender: TObject);
const
   GoString=\’А вoт и бегущая строка в Delphi :) \’;
{Текст, который будет двигаться в Edit\’e}
var
   s:
string;
{Временная переменная для работы с текстом, т.к. удалять символы напрямую из Edit\’a мы не можем}
begin
   s := Edit1.Text;
{Берём текст}
   Delete(s,1,1);
{Удаляем первый символ}
   s := s+GoString;
{Добавляем в конец текста следующий по списку символ}
   Edit1.Text := s;
{Возвращаем изменённый текст на родину}
   inc(i);
{В следующий раз будем добавлять следующий символ}
  
if i>length(GoString)
then i := 1;
{Но если номер следующего символа вылазит за границу строки, то это знак что нужно начинать сначала}
end;

Для того, чтобы данный способ работал корректно, нужно чтобы изначально текст Edit\’a был чем-то заполнен. Чем — не важно. Это будет видно только в самом начале. Можно просто взять кучу пробелов. Но длина текста останется постоянной, т.е. какая была, такой и останется…
Данный метод, конечно, хорош. Но передавать строки ему не очень удобно, а если строка должна ещё и периодически изменяться, то совсем неудобен. К тому же, смещение происходит посимвольно, что, если приглядеться, заметно. А мне хотелось, чтобы смещение было максимально плавным, да и кодить этот «ужасный» код совсем не хотелось — было мало времени.

огда я использовал способ второй. А суть заключается в том, что не надо изобретать велосипед, если он уже изобретён. Напряжём мозги и вспомним старый добрый HTML. Опа! А там же есть уже реализованная отличная бегущая строка! MARQUEE вспомнили? Если нет, то сейчас вспомните! :)

Данный тег с атрибутами выглядит примерно так:


Текст бегущей строки

height — высота бегущей строки. В данном случае змеряется в процентах
width — ширина бегущей строки. В данном случае измеряется в пикселях
behavior — поведение строки. Может равняться:

  • Scroll — обычная прокрутка (можно не прописывать, оно так и есть по умолчанию)
  • Slide — прокрутка с остановкой, строка пробегает до края и останавливается.
  • Alternate — строка будет двигаться от края к краю.
  • Direction — задает направление движения бегущей строки. Может равняться left (right, up, down) — движение влево (вправо, вверх, вниз). Движение влево можно не прописывать, оно является движением по умолчанию.
    Scrollamount — скорость движения строки. Может принимать значения от 1 до 10.
    Конечно же, для бегущей строки можно задавать и другие HTML атрибуты (hspace, vspace и align).

    Пример бегущей строки можете посмотреть вначале этой статьи. Её код выглядит так:


    Такая же бегущая строка будет и у вас в Delphi-приложении

    Тег small делает шрифт текста меньшим, относительно основного текста.

    Ну вот, теорию повторили! :) Теперь перейдём к проблемам реализации.
    Как вы уже догадались, показывать нашу страничку мы будем в TWebBrowser => для отображения бегущей строки мы используем Internet Explorer (точнее, TWebBrowser использует IE). Следовательно, и отображаться она будет всегда одинаково! Значит, никаких проблем с разностью в браузерах нет! Это хорошо.
    Но, как же мы будем показывать нашу страничку, если TWebBrowser умеет открывать только существующие странички? Очень просто. Сохранять на диск нашу HTML страничку мы не будем — не респектно! :) Для отображения странички воспользуемся протоколом about. Коротко говоря об этом протоколе, если создать строку вида «about
    : Наш HTML код » и передать эту строку в качестве параметра в TWebBrowser.Navigate, то наша страничка корректно отобразиться. Например:

    WebBrowser1.Navigate(\’about
    :

    Hello, Dem@nXP!

    \’);

    Этот код отобразит нам страничку с красным фоном, посередине которой на первой строке будет надпись «Hello, Dem@nXP!» чёрными буквами.
    А почему бы нам не отобразить так же и бегущую строку? Пробуем! :)

    WebBrowser1.Navigate(\’about
    :
    Такая же бегущая строка будет и у вас в Delphi-приложении \’);

    Уррряя! Всё работает! Так, теперь доведём всё до человеческого вида, т.е. Сделаем размеры нашего WebBrowser\’a соизмеримыми с размерами Edit\’a. В предвкушении законченого дела запускаем наше приложение и … не тут то было! Эти чёртовы полосы прокрутки! Да ещё и сама строка находится не с самого верху! Мдя, будем лечить…
    В HTML\’e есть понятия нижнего, верхнего, левого и правого отступов от краёв страницы. А что если их обнулить?

    WebBrowser1.Navigate(\’about
    :
    Такая же бегущая строка будет и у вас в Delphi-приложении \’);

    Угу. Уже получше — если освободить место для полос прокрутки, то будет видно, что наша строка вплотную прилегает к краям TWebBrowser\’a. Но полосы прокрутки портят весь вид! Вот их мы сейчас и уберём! :)
    А убираются они довольно просто: в теге body пролписываем scroll=»no». Всё гениальное просто :). Делаем размер WebBrowser\’a «нормальным» (у меня height=20 а width=167), изменяем текст на:

    WebBrowser1.Navigate(\’about
    : \’rightmargin=»0″ bottommargin=»0″ scroll=»no»>
    Такая же бегущая строка будет и у вас в\’+
    \’Delphi-приложении
    \’);

    И радуемся жизни: теперь то всё работает! Ну, для полного счастья можно подвязать размеры бегущей строки с размерами браузера. Это делается так:

    WebBrowser1.Navigate(\’about
    : \’rightmargin=»0″ bottommargin=»0″ scroll=»no»>
    Такая же \’+
    \’бегущая строка будет и у вас в Delphi-приложении
    \’);

    Теперь даже если попытаться прокрутить (скроллером или кнопкой мыши) нашу страничку, бегущая строка всё равно не изменит своей траектории. WebBrowser1.height-5 сделано именно для этого.

    Ну и, наконец, всё это можно красиво оформить в одну процедурку:

    procedure SetRunText(Web: TWebBrowser; Text: string);
    begin
      Web.Navigate(\’about
    :   \’rightmargin=»0″ bottommargin=»0″ scroll=»no»>
    \’+Text+
      \’
    \’);
    end;

    Ну, или же сразу передавать в процедуру и все настройки:

    procedure SetRunTextProfy(Web: TWebBrowser; Text, bgcolor, behavior, direction: string; speed: integer);
    begin
      Web.Navigate(\’about
    :   \’rightmargin=»0″ bottommargin=»0″ scroll=»no»>
    \’
      +Text+\’
    \’);
    end;

    Если захотите оставить параметры по умолчанию, то можно просто передать пустые строки в нужных параметрах. Данную процедуру можно ещё расширить: например, передавать цвет не строкой, а TColor\’ом. Но это вы уже сделаете сами :)

    Ну вот и всё. Сегодня вы научились делать бегущую строку аж двумя способами, вспомнили HTML, написали пару полезных процедур. Я надеюсь, что эта статья принесла вам пользу, научила чему-нибудь.