Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бегущая строка, Компонент на основе TLabel 
V
    Опции темы
Демидрол
Дата 15.7.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Доброго времени суток Вам.
Помогите,пожалуйста соорудить компонент бегущей строки на основе класса TLabel.
Не понимаю я как сделать так,чтобы у компонента было свойство "скорость прокрутки",
как сделатьтак,чтобы текст двигался,как проверить,что если длина текста меньше длины Labelа,то он из бегущей строки превращается в обычный Label.
Вот.
Помогите,пожалуйста,а то чего-то никак ничего никуда..... smile 
PM MAIL   Вверх
Great Cornholio
Дата 15.7.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 19.6.2008

Репутация: 1
Всего: 1



Сам я в этом не разбираюсь, но данная статья описывает как раз этот пример. В этом пособии в коде символы вполне могут быть изменены(хз, каким образом), на подобные. И вообще я за эту статью не отвечаю.

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  Chapter_15.7z 142,18 Kb
PM   Вверх
Palladin
Дата 16.7.2008, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



Label использу лишь для вывода бегущей строки!  Отрисовывай в капшене лейбла. К примеру твой лейбл вмещает 200 символов, тогда вначале запускай цикл и записывай в лейбл 200 пробелов, потом 199 и первую букву твоего предложения, и т.д.
P.S. кустарный метод...


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Демидрол
Дата 16.7.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



ммм....чего? smile
Palladin, т.е  в компоненте просто создать функцию,нп, ScrollName,  и в ней получить длину текста в Caption и сделать цикл на столько пробелов???
эээээ......
Тупой тупак давит на мозг....
А как сделать,чтобы скорость прокрутки текста компонента можно было менять?
Сделать отдельное свойство-это понятно.Но как,зная нужную скорость,менять скорость прокрутки?
PM MAIL   Вверх
Rrader
  Дата 16.7.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 13
Всего: 191



Демидрол, кидаешь на форму TLabel и TTimer. Ставишь у таймера нужный тебе интервал - это и будет скорость. В OnTimer пишешь:
Код

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    const int Len = 10;
    const char Str[] = "Я знаю, что ничего не знаю Я знаю, чт";

    static int I = 1;
    AnsiString S(Str);
    Label1->Caption = S.SubString(I, Len);
    I++;
    if (S.Length() - Len < I) I = 1;
}



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Демидрол
Дата 16.7.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



да-да-да,это все понятно....В сети много про это нашел.
Тока мне надо создать именно КОМПОНЕНТ БЕГУЩАЯ СТРОКА!!!!
чтобы потом его много раз юзать в разных прога.
Вот.
И как это соорудить мозг не сооброжает.
Помогите....................SOS!!!!!  smile 
PM MAIL   Вверх
Palladin
Дата 16.7.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



что тебе мешает юзать в каждой проге это? 

Код

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    const int Len = 10;
    const char Str[] = "Я знаю, что ничего не знаю Я знаю, чт";

    static int I = 1;
    AnsiString S(Str);
    Label1->Caption = S.SubString(I, Len);
    I++;
    if (S.Length() - Len < I) I = 1;
}



--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Демидрол
Дата 17.7.2008, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Цитата(Palladin @ 16.7.2008,  17:44)
что тебе мешает юзать в каждой проге это? 

Начальство  smile 

Сижу,пыхчу как паровоз,че-то рожаю...
Никто не знает,в чем косяк:
Код

HANDLE hThread=::CreateThread(0,0,ThreadDraw,0,0,&ThreadID);


выдает ошибки:
E2034 Cannot convert 'unsigned long (__stdcall * (_closure )(void *))(void *)' to 'unsigned long (__stdcall *)(void *)'
и
E2342 Type mismatch in parameter 'lpStartAddress' (wanted 'unsigned long (__stdcall *)(void *)', got 'void')

В чем тут проблема? smile 

Это сообщение отредактировал(а) Демидрол - 17.7.2008, 12:14
PM MAIL   Вверх
livo
Дата 17.7.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 14.10.2007

Репутация: 1
Всего: 1



Цитата

Тока мне надо создать именно КОМПОНЕНТ БЕГУЩАЯ СТРОКА!!!!

Попробуй не тред, а апишную SetTimer, KillTimer.
В нее передаеш как один из параметров колбэк функцию с твоим содержанием (будет вызываться с заданным тобой периодом).
PM MAIL   Вверх
Rrader
  Дата 17.7.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 13
Всего: 191



Вот, накидал:

*.h
Код

#ifndef ULabelH
#define ULabelH

#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>

//------------------
class PACKAGE TSpecialLabel: public TLabel
{

private:
    int FCounter;
    TTimer* FTimer;
    AnsiString FOrigCaption;
    __fastcall int GetVelocity() {return FTimer->Interval;}
    __fastcall void SetVelocity(int Value) {FTimer->Interval = Value;}

public:
    __fastcall TSpecialLabel(TComponent* Owner);
    __fastcall ~TSpecialLabel() {delete FTimer;}

    void __fastcall TimerFired(System::TObject* Sender)
    {
        const int Len = 10;
        AnsiString S(FOrigCaption);
        S = S + ' ' + S.SubString(1, Len);
        Caption = S.SubString(FCounter, Len);
        FCounter++;
        if (S.Length() - Len < FCounter) FCounter = 1;
    }
    // Запуск бегущей строки
    void StartCreep() {
        FOrigCaption = Caption;
        if (Caption != NULL) {
            FTimer->Enabled = true;
            TimerFired(this);
        }
    }
    // Остановка
    void StopCreep() {
        FTimer->Enabled = false;
        Caption = FOrigCaption;
    }

__published:
    __property int Velocity = {read=GetVelocity, write=SetVelocity };
};

//------
#endif


*.cpp
Код

#include <vcl.h>
#pragma hdrstop
#pragma package(smart_init)
#include "ULabel.h"
//-------
static inline void ValidCtrCheck(TSpecialLabel *)
{
    new TSpecialLabel(NULL);
}
//--------
__fastcall TSpecialLabel::TSpecialLabel(TComponent* Owner)
        : TLabel(Owner)
{
    FTimer = new TTimer(this);
    FTimer->OnTimer = TimerFired;
    FTimer->Enabled = false;
    FCounter = 1;
}
//-------
namespace SpecialLabel
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass Classes[1] = {__classid(TSpecialLabel)};
                 RegisterComponents("Standard", Classes, 0);
        }
}

Пример использования:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TSpecialLabel *SP = new TSpecialLabel(this);
    SP->Parent = this;
    SP->Caption = "Я знаю, что ничего не знаю";
    SP->Velocity = 50;
    SP->StartCreep();
    // Перед сменой Caption обязательно вызвать StopCreep!
    SP->StopCreep();
    SP->Caption = "Я гуляю по дорожке!";
    SP->StartCreep();
}


Это сообщение отредактировал(а) Rrader - 22.7.2008, 15:00


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
LastAngel
Дата 18.7.2008, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Построение компонент в C++Builder 

может кому пригодится ...
PM MAIL   Вверх
Демидрол
Дата 22.7.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Rrader,спасибо огромное за код.С небольшими исправлениями все зашуршало так,что не остановить. smile
Меня интересует еще какой момент:как сделать,чтобы текст бежал через весь лабл,вне зависимости от размеров текста?Чето сидел,искал,пытался,но не понял.Заранее спасибо. smile 
PM MAIL   Вверх
LastAngel
Дата 22.7.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Ну смотри если длина фразы меньше ширины лейбла, то дополняй оставшиеся места пробелами и усё ...
PM MAIL   Вверх
Демидрол
Дата 22.7.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



LastAngel,это понятно.Только длина текста в символах,а длина области хз в чем,и как их приравнять для меня загадка. smile 
И поэтому при растягивании лабла и при изменении размера шрифта(и просто при изменении шрифта) возникают траблы с отображением.

Это сообщение отредактировал(а) Демидрол - 22.7.2008, 13:47
PM MAIL   Вверх
LastAngel
Дата 22.7.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Ну ширина в пикселях мериется ... у лейбла есть свойство AutoSize если померить им реальную ширину лейбла поделить на количество буковок во фразе грубо получишь сколько пикселей одна буковка,потом узнаёшь заданную ширину ну и можно оценить сколько надо пробелов докинуть 

1 пробел вроде 3 пикселя ... так что даже количество пикселей на буковку не надо считать, а только количество пиксов на свободное пространство

Это сообщение отредактировал(а) LastAngel - 22.7.2008, 13:55
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1100 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.