Пятница, 27.12.2024, 21:45 Приветствую вас Гость | Группа "Гости" 
Меню сайта

Категории раздела
Вирусология [40]
Статьи о вирусах
Системные [1]
Работа с системой
Примеры [45]
Приёмы, функции, процедуры
Ceти [1]
Работа с интернет
Шуточные программы [5]
Пишем шуточные программки
Остальное [6]
Всё что не вошло

Популярные статьи

Недавние темы

Опрос
Вы женаты/замужем?
Всего ответов: 11

Главная » Статьи » 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 вспомнили? Если нет, то сейчас вспомните! 



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



<marquee height="100%" width="167" bgcolor="white" behavior="scroll" direction="left" scrollamount="4">

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

</marquee>



height - высота бегущей строки. В данном случае измеряется в процентах

width - ширина бегущей строки. В данном случае измеряется в пикселях

behavior - поведение строки. Может равняться:





Scroll - обычная прокрутка (можно не прописывать, оно так и есть по умолчанию)

Slide - прокрутка с остановкой, строка пробегает до края и останавливается.

Alternate - строка будет двигаться от края к краю.



Direction - задает направление движения бегущей строки. Может равняться left (right, up, down) - движение влево (вправо, вверх, вниз). Движение влево можно не прописывать, оно является движением по умолчанию.

Scrollamount - скорость движения строки. Может принимать значения от 1 до 10.

Конечно же, для бегущей строки можно задавать и другие HTML атрибуты (hspace, vspace и align).


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



<marquee height="100%" width="167" bgcolor="white" scrollamount="4">

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

</marquee>


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



Ну вот, теорию повторили! Теперь перейдём к проблемам реализации.

Как вы уже догадались, показывать нашу страничку мы будем в TWebBrowser => для отображения бегущей строки мы используем Internet Explorer (точнее, TWebBrowser использует IE). Следовательно, и отображаться она будет всегда одинаково! Значит, никаких проблем с разностью в браузерах нет! Это хорошо.

Но, как же мы будем показывать нашу страничку, если TWebBrowser умеет открывать только существующие странички? Очень просто. Сохранять на диск нашу HTML страничку мы не будем - не респектно! Для отображения странички воспользуемся протоколом about. Коротко говоря об этом протоколе, если создать строку вида "about: Наш HTML код " и передать эту строку в качестве параметра в TWebBrowser.Navigate, то наша страничка корректно отобразиться. Например:



WebBrowser1.Navigate('about:<body bgcolor="red"><center>Hello, Dem@nXP!</center></body>');



Этот код отобразит нам страничку с красным фоном, посередине которой на первой строке будет надпись "Hello, Dem@nXP!" чёрными буквами.

А почему бы нам не отобразить так же и бегущую строку? Пробуем! 



WebBrowser1.Navigate('about:<body> 

<marquee height="20" width="167" bgcolor="white" scrollamount="4"> 
<small>Такая же бегущая строка будет и у вас в Delphi-приложении</small> 
</marquee> 
</body>');



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

В HTML'e есть понятия нижнего, верхнего, левого и правого отступов от краёв страницы. А что если их обнулить?



WebBrowser1.Navigate('about:<body topmargin="0" leftmargin="0" marginwidth="0" rightmargin="0" bottommargin="0"> 
<marquee height="20" width="167" bgcolor="white" scrollamount="4"> 
<small>Такая же бегущая строка будет и у вас в Delphi-приложении</small> 
</marquee> 
</body>');



Угу. Уже получше - если освободить место для полос прокрутки, то будет видно, что наша строка вплотную прилегает к краям TWebBrowser'a. Но полосы прокрутки портят весь вид! Вот их мы сейчас и уберём!  

А убираются они довольно просто: в теге body пролписываем scroll="no". Всё гениальное просто . Делаем размер WebBrowser'a "нормальным" (у меня height=20 а width=167), изменяем текст на:



WebBrowser1.Navigate('about:<body topmargin="0" leftmargin="0" marginwidth="0"'+ 
'rightmargin="0" bottommargin="0" scroll="no"> <marquee height="20" width="167"'+
'bgcolor="white" scrollamount="4"><small>Такая же бегущая строка будет и у вас в'+
'Delphi-приложении</small> 
</marquee> 
</body>');



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



WebBrowser1.Navigate('about:<body topmargin="0" leftmargin="0" marginwidth="0"'+ 

'rightmargin="0" bottommargin="0" scroll="no"> <marquee height="'+

IntToStr(WebBrowser1.height-5)+'" width="'+IntToStr(WebBrowser1. width)+

'"bgcolor="white" scrollamount="4"><small>Такая же '+

'бегущая строка будет и у вас в Delphi-приложении</small></marquee></body>');



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


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



procedure SetRunText(Web: TWebBrowser; Text: string);

begin

  Web.Navigate('about:<body topmargin="0" leftmargin="0" marginwidth="0"'+ 

  'rightmargin="0" bottommargin="0" scroll="no"> <marquee height="'+

  IntToStr(Web.height-5)+'" width="'+IntToStr(Web. width)+

  '"bgcolor="white" scrollamount="4"><small>'+Text+

  '</small></marquee></body>');

end;



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



procedure SetRunTextProfy(Web: TWebBrowser; Text, bgcolor, behavior, direction: string; speed: integer);

begin

  Web.Navigate('about:<body topmargin="0" leftmargin="0" marginwidth="0"'+ 

  'rightmargin="0" bottommargin="0" scroll="no"> <marquee height="'+

  IntToStr(Web.height-5)+'" width="'+IntToStr(Web. width)+

  '"bgcolor="'+bgcolor+'" scrollamount="'+IntToStr(speed)+'" behavior="'+

  behavior+'" direction="'+direction+'" ><small>'

  +Text+'</small></marquee></body>');

end;



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



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

Категория: Примеры | Добавил: dolphin (06.12.2008)
Просмотров: 8454 | Комментарии: 1 | Рейтинг: 2.5/2

Всего комментариев: 1
avatar
1 egor • 11:10, 11.04.2009
прикольно.
первый лучше.
второй вариант халтура. :-)
avatar
Профиль



Поиск

Наша кнопка
Вирусология, взгляд из Delphi

Статистика
Top.Mail.Ru Яндекс.Метрика Счетчик тИЦ и PR
Статистика материалов
Файлов: 457
Форум: 1175/8163
Коментариев: 770
Новостей: 29

Статистика пользователей
Всего: 385
За неделю: 0
Вчера: 0
Сегодня: 0
Всего онлайн: 1
Гостей: 1
Пользователей: 0

delphicode.ru © 2008 - 2024 Хостинг от uCoz