Створення рядка, що біжить в delphi, Дамір Фаттахов

Отже, як ви вже здогадалися, сьогодні ми будемо робити біжучий рядок в своєму Delphi-додатку.
Одного разу мені дуже знадобилося щось на кшталт TEdit \ 'a, тільки не зі стаціонарної, а з рядком, що біжить (всі символи просто не влазили, а показати потрібно було все ...) Ось я і задумався, як же це зробити. Сьогодні я розповім вам 2 способи вирішення даної проблeм. Отже, як ви вже здогадалися, сьогодні ми будемо робити біжучий рядок в своєму Delphi-додатку.
Одного разу мені дуже знадобилося щось на кшталт TEdit \ 'a, тільки не зі стаціонарної, а з рядком, що біжить (всі символи просто не влазили, а показати потрібно було все ...) Ось я і задумався, як же це зробити. Сьогодні я розповім вам 2 способи вирішення даної проблeм.

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

var
i: integer = 1;
...

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

Для того, щоб цей спосіб працював коректно, потрібно щоб спочатку текст 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, то наша сторінка коректно відобразитися. наприклад:

    Цей код відобразить нам сторінку з червоним тлом, посередині якої на першому рядку буде напис «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 \ 'ом. Але це ви вже зробите самі :)