Delphi.int.ru — Портал программистов

Вход Регистрация | Забыли пароль?

События

Сегодня:
Вопросы0    Ответы0    Мини-форумы0


Последние:
Вопрос20.07, 15:06 / #6671
Ответ30.06, 12:52 / #6666
Новости30 апреля 2012


Сейчас онлайн:
На сайте — 10
На IRC-канале — 2

Ссылки

Автор: Ерёмин Андрей

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

Простая бегущая строка своими руками

Что из себя представляет бегущая строка? Эта область, где "проезжает" текст. Чтобы создать эффект движущегося текста, нужно либо передвигать сам текст, либо последовательно вырезать из него фрагменты и изменять их с течением времени. Попробуем оба способа.

1. Движущийся компонент.

Это самый простой по реализации способ. Возьмём обычный TLabel, поместим в него нужный нам текст (свойство Caption). Также необходимо задать чёткий размер (ширину) компонента. Проще всего оставить свойство AutoSize в значении True. В результате при изменении текста ширина компонента будет автоматически изменяться. Чтобы изменять положение компонента воспользуемся таймером (компонент TTimer со страницы System). Зададим интервал срабатывания таймера в 50 мс (свойство Interval). Теперь создадим обработчик события OnTimer. Определимся, что должно происходить: во-первых, мы должны изменить расположение компонента на форме, а во-вторых - нужно проверять, не уехал ли наш текст за границы экрана и, если это произошло, переместить его на противоположный край окна. Пусть направление текста будет справа-налево. Тогда обработчик будет примерно таким:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Left:=Label1.Left-1;
  if Label1.Left+Label1.Width < 0 then
    Label1.Left:=Self.Width;
end;

Запустим программу и посмотрим, что получилось. Действительно, текст движется справа-налево, но есть один неприятный момент: когда текст полностью скрывается за левой границей окна, он перемещается за правую границу, чтобы его не было видно (иначе он просто внезапно появится), но у окна появляется горизонтальная полоса прокрутки! Решение очень простое: установить у формы свойство AutoScroll в False и полосы прокрутки больше не будет. Есть ещё один недостаток: компонент мерцает при движении.

2. Разрезаем текст.

Этот способ кардинально отличается от первого. Здесь мы не будем двигать наш компонент, а просто будем изменять его текст. Чтобы реализовать такую бегущую строку нам потребуется дополнительный буфер, где будет храниться весь текст, т.к. свойство Caption будет постоянно меняться и хранить текст там мы не сможем. Итак, объявим глобальную переменную:

var
  Form1: TForm1;
  MarqueeText: String;

Также нам потребуется текущая позиция бегущей строки. Это будет порядковый номер символа в тексте. Дополнительной переменной заводить не будем - воспользуемся свойством Tag нашего TLabel. Добавим ещё один таймер (Timer2) с интервалом 150 мс, и кнопку для запуска бегущей строки. Таймер изначально выключим (Enabled = False). При нажатии на кнопку будем задавать текст бегущей строки, начальную позицию, а также будем запускать таймер:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MarqueeText:='Бегущая строка своими руками.';
  Label2.Tag:=0;
  Timer2.Enabled:=True;
end;

Теперь настроим TLabel. Во-первых, если текст движется справа-налево, значит он должен быть выровнен по правому краю: устанавливаем Alignment у TLabel в taRightJustify. Во-вторых, если размер надписи будет изменяться автоматически, бегущей строки не получится - размер будет просто расти и вся надпись будет видна. Установим AutoSize в False, но ширину надписи сделаем побольше (хотя бы 200 пикселей). На самом деле, делать это не обязательно, если немного изменить алгоритм (см. ниже). Наконец, обработчик таймера. Здесь мы будем вырезать из текста фрагмент с первого символа до текущей позиции, а саму позицию будем каждый раз увеличивать на единицу:

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Label2.Caption:=Copy(MarqueeText,1,Label2.Tag);
  Label2.Tag:=Label2.Tag+1;
end;

Запустим и нажмём на кнопку. Вот и ещё одна бегущая строка. В отличие от первого способа здесь мерцания практически исключены.

Теперь вернёмся к размеру надписи. Ограничивать размер не обязательно, если программно ограничить длину вырезаемого фрагмента. В данном примере длина фрагмента растёт, пока он не станет равным всей строке. Давайте ограничим фрагмент 5-ю символами:

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if Label2.Tag > 5 then
    Label2.Caption:=Copy(MarqueeText,Label2.Tag,5)
  else
    Label2.Caption:=Copy(MarqueeText,1,Label2.Tag);
  Label2.Tag:=Label2.Tag+1;
end;

Теперь и размер задавать вручную не обязательно - всё равно больше 5 символов в один момент времени на бегущей строке не будет.

Что мы ещё не ушли? Бегущая строка пройдёт всего один раз, а нам нужно, чтобы она пробегала снова и снова. Нет проблем - в конец обработчика таймера добавим возврат на начальное положение:

  if Label2.Tag > Length(MarqueeText) then
    Label2.Tag:=0;

Но появляется один нехороший "глюк": сначала строка бежит, а когда доходит до конца, то буквы исчезают по одной, каждый раз сдвигаясь вправо. Этот момент обращает на себя внимание. Чтобы от него избавиться, нужно к строке дополнительно добавить несколько пробелов (в частности, столько, сколько символов в один момент видно на экране, т.е. 5) - тогда эти пробелы будут считаться символами, но они будут невидны. Подключим в uses модуль StrUtils и воспользуемся маленькой, но крайне полезной функцией - DupeString. Функция принимает два параметра - строку и число, а результатом является комбинация указанного числа таких строк. Например, DupeString('-',10) выдаст "----------". Слегка изменим строку присвоения текста бегущей строке (процедура нажатия кнопки):

MarqueeText:='Бегущая строка своими руками.'+DupeString(' ',5);

Ну вот, теперь совсем другое дело - настоящая бегущая строка! Однако её недостаток - отсутствие плавности. Символы появляются строго по одному, а не плавно выезжают. Стандартными способами "откусить" часть символа, к сожалению, нельзя :-)

Бросаем велосипеды

На самом деле, за нас уже потрудились программисты Microsoft и создали неплохую бегущую строку, которую мы можем использовать в своём приложении. Единственное условие - в системе должен быть установлен Microsoft Office, так как библиотека, о которой речь пойдёт ниже, входит в его состав, но не входит в состав Windows.

Установка

Компонент TMarquee - бегущая строка
  1. Открываем окно Project » Import Type Library...
  2. Находим в списке Marquee OLE Control Module.
  3. Нажимаем Install..., указываем пакет для установки, затем нажимаем Compile и модуль устанавливается.
  4. Объект TMarquee появится на странице палитры компонент, которая была выбрана в окне установки (по умолчанию ActiveX). Значок объекта - буквы A и B в жёлтой рамке.

Работа с TMarquee

Работать с данным компонентом довольно просто. Для начала разместите его на форме. Бегущая строка сразу активируется даже в design-time. В run-time она выглядит точно также. Фактически, настройка бегущей строки сводится лишь к изменению свойств компонента - просто рассмотрим назначение каждого из них.

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

  • Scroll - Обычная прокрутка (когда текст полностью скрывается за границей, он появляется с другой стороны);
  • Slide - аналог Scroll, но при достижении края бегущая строка остановится;
  • Alternate - "пинг-понг" (когда текст доходит до края, направление движения меняется на обратное).

MarqueeBgColor - цвет фона бегущей строки в формате #RRGGBB.

MarqueeDirection - направление движения (Left / Right соответственно).

MarqueeDisplayText - текст бегущей строки.

MarqueeHeight, MarqueeWidth - высота и ширина бегущей строки.

MarqueeLoop - количество проходов бегущей строки (Infinite - бесконечно).

MarqueeScrollAmount - количество пикселей, на которое сдвигается текст при изменении состояния.

MarqueeScrollDelay - интервал времени между сменой состояний (в миллисекундах).

Все остальные свойства стандартны.

Компонент имеет несколько стандартных событий, но специальных, к сожалению, не предусмотрено.

Заключение

Как видите, бегущую строку можно создать вручную, а можно использовать готовую. Помимо TMarquee от Microsoft существуют и сторонние компоненты, реализующие бегущую строку. Например, в JediVCL есть такой компонент. Бегущая строка позволяет привлечь внимание пользователя к определённым элементам, однако злоупотреблять этим не стоит.

Автор: Ерёмин А.А.

Статья добавлена: 26 мая 2007

Следующая статья: Рисуем график функции в Delphi »

Рейтинг статьи: 4.50 Голосов: 2 Ваша оценка:

Зарегистрируйтесь/авторизируйтесь,
чтобы оценивать статьи.


Статьи, похожие по тематике

 

Для вставки ссылки на данную статью на другом сайте используйте следующий HTML-код:

Ссылка для форумов (BBCode):

Быстрая вставка ссылки на статью в сообщениях на сайте:
{{a:36}} (буква a — латинская) — только адрес статьи (URL);
{{статья:36}} — полноценная HTML-ссылка на статью (текст ссылки — название статьи).

Поделитесь ссылкой в социальных сетях:


Комментарии читателей к данной статье

Липницкий Олег Сергеевич
Репутация: нет

Липницкий Олег Сергеевич (5 июня 2007, 23:52):

Может пригодиться для периодического напоминания о регистрации приложения :)

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