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