![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с TLabel [D7, XP]
hypnotize © (2007-01-18 17:02:00)Всем здраствуйте, проблема такая, сделал я ефект появления текста, аля матрица, то биш текст будто печатается, нарастает по одной букве, для сего эфекта использовал я TLabel и TTimer с интервалом 10, вроде как все работает, но сам лейбл во время появления текста моргает, как избавитсяот этого?
Комбинатор (2007-01-19 11:44:00) [21]Наверное:
1) надо создать два канваса.
2) рисовать на обоих (по очереди)
* рисовать - в смысле печатать текст (см. DoDrawText у TCustomLabel)
3) затем менять поверхности местами - типа получиться эмуляция буферизации.
Kolan (2007-01-18 22:57:00) [22]
procedure TForm3.Timer1Timer(Sender: TObject);
begin
I := I + 1;
if Memo1.Lines.Text[I] = ' ' then
begin Form3.Timer1Timer(sender);
Exit;
end; // Это чтобы пропускать пробелы
Label1.Caption := Label1.Caption + Memo1.Lines.Text[I];
if I > Length(Memo1.Lines.Text) then
Timer1.Enabled := False;
end;
Проверил. Ниче не моргает при интервале 10. А при 100 супер вообще :).
hypnotize (2007-01-18 22:20:00) [23]Пустой проект тоже моргает, но внем слабо заметно, наверно потому что в моём зеленый шрифт по черному сильнее видно, ладно пытаюсь рисовать...
hypnotize (2007-01-18 22:20:00) [24]Пустой проект тоже моргает, но внем слабо заметно, наверно потому что в моём зеленый шрифт по черному сильнее видно, ладно пытаюсь рисовать...
default (2007-01-18 22:12:00) [25]hypnotize (18.01.07 22:10) [23]
попробуй в чистом проекте
фигня какая-то
что-то никто не может сказать моргает-ли у него
у меня просто дельфи нету...
пиши пока код отрисовки по букве, это недолго на самом деле
если уж двойная буферизация не помогает...
hypnotize (2007-01-18 22:10:00) [26]нет, моргают даже длинные однострочными((((
default (2007-01-18 22:06:00) [27]слушай, попробуй сначала с однострочным лейблом
если не моргает, вместо многострочного лейбла можешь использовать несколько однострочных
default (2007-01-18 21:55:00) [28]hypnotize (18.01.07 21:34) [13]
> Текста много и рисовать нужно будет часто, так что это не
> катит.
чё это за фикня?
рисуй по букве, в чём трабл? ширину буквы можно получить, нарисовать буквы знаем как
единственное, в OnPaint(когда твоя строка чем-то по какой-то причине инвалидируется) попробуй всё перерисовывать всё сначала
если будет хреново будешь и в OnPaint перерисовывать только то что надо
вообще странно всё это....не должно ничего моргать на самом-то деле
спроси у кого дельфи стоит у них у всех моргает?
hypnotize (2007-01-18 21:48:00) [29]да я с этого и начал) не помогает
default (2007-01-18 21:45:00) [30]hypnotize (18.01.07 21:34) [13]
попробуй сначала двойную буферизацию для формы установить
hypnotize (2007-01-18 21:42:00) [31]Текста много и рисовать нужно будет часто, так что это не катит.
default (2007-01-18 21:41:00) [32]если тебя итересует просто вывести текст можешь его в ручную отрисовывать по букве в таймере
а в OnPaint поставишь всю строку выводить(на случай затирания)
hypnotize (2007-01-18 21:39:00) [33]Может стоить попробывать на канве этот текст рисовать? Раз компоненты моргают все
hypnotize (2007-01-18 21:38:00) [34]2Kolan
Проверил, действительно все работает, только к моему вопросу это не относится =(
default (2007-01-18 21:36:00) [35]hypnotize (18.01.07 21:34) [13]
я в Visual Studio 2005 пробовал, .net контролом Label
видимо всё дело в том, что в .net GDI+ и она буферизует
hypnotize (2007-01-18 21:34:00) [36]2Vovan #2
Transparent := False ?
Что тру, что фалс, адинаково моргает :)
2default
Хм, странно, у меня с твоим кодом все равно глючит, может потому что текст много строчный...
Kolan (2007-01-18 21:33:00) [37]«Label.Caption := Copy(Memo1.Lines.Text,0,I);»
А нельзя так(нафик Copy:
Label.Caption := Label.Caption + Memo1.Lines.Text[I];
И тут:
if Copy(Memo1.Lines.Text,I-1,1) = ' ' then
if Memo1.Lines.Text[I] = ' ' then
Ессно не проверял. Просто на мысл навожу.
Kolan (2007-01-18 21:31:00) [38]«интервалом 10»
Поставь побольше.
«двойная буферизация только для картинок »
У формы, может?
Урок нормального кода:
var
I: Integer;
procedure TForm1.TimerTimer(Sender: TObject);
begin
I := I + 1;
if Copy(Memo1.Lines.Text,I-1,1) = ' ' then
begin Form1.TimerTimer(sender);
Exit;
end; // Это чтобы пропускать пробелы
Label.Caption := Copy(Memo1.Lines.Text,0,I);
if I > 100 then
Timer.Enabled := False;
end;
теперь можно постараться понять :)
default (2007-01-18 21:29:00) [39]hypnotize (18.01.07 21:23) [8]
обычный код
Label1.Caption = Label1.Caption + "L" в таймере
Vovan #2 (2007-01-18 21:28:00) [40]Transparent := False ?