2012-01-01 2 views
3

, что я пытаюсь сделать прямо сейчас, чтобы создать scroling кредитного текста с помощью компонента ТМеты и TTimerПрокрутка текста Memo, используя TTimer показывает только первые 3 линий

procedure TAboutBox.Timer1Timer(Sender: TObject); 
begin 
Memo1.ScrollBy(0,-1); 
end; 

линии ТМето содержит текст кредит, что-то вроде:

Thankyou для:
Junifer лямда
Exemple пользователя 2
Coder Monalisa
и т.д. и т.п.

Все работает так, как ожидалось, я установил timer.interval на 1 мс, текст прокручивается плавно, но он отображает только 3 первые строки, тогда он отображает пустое пространство, если я не щелкнул и не перетащил вручную, используя мышь внутри заметки, то он отображает некоторые строки, затем он исчезает снова, когда я отпускаю.

Я пробовал как с TRichedit, так и с TListBox, но проблема не устранена. Как это могло произойти ?

+3

1ms? разве это слишком мало? – Baatar

+0

Да, на win32 TTimer использует таймер Windows, а интервал сжимается до USER_TIMER_MINIMUM (0x0000000A) – az01

+1

Вы также рассматриваете альтернативные ответы, исключая использование TMemo/TRichEdit/TlistBox? – menjaraz

ответ

4

Мне кажется, что ScrollBy не предназначен для того, чтобы делать то, что вы желаете. Более того, я не думаю, что нужен TMemo.

Я бы сделал это с помощью ярлыка и переместил его на событие таймера. Как это:

procedure TScrollingTextForm.FormCreate(Sender: TObject); 
begin 
    Label1.Caption := 
    'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do '+ 
    'eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad '+ 
    'minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip '+ 
    'ex ea commodo consequat. Duis aute irure dolor in reprehenderit in '+ 
    'voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur '+ 
    'sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt '+ 
    'mollit anim id est laborum.'; 
    Label1.Top := ClientHeight; 
end; 

procedure TScrollingTextForm.Timer1Timer(Sender: TObject); 
begin 
    Label1.Top := Label1.Top - 1; 
end; 

я обнаружил, что мне нужно, чтобы сделать форму двойной буферизации (DoubleBuffered := True), чтобы избежать мерцания при прокрутке.

+4

Я думаю, что было бы немного более элегантно настраивать текст в форме 'OnPaint'. –

+0

@andreas Я думаю, что вы правы, но я стремился к очень простому ответу. С новым годом! –

+0

ваше решение работает отлично, но TLabel мигает, когда он движется, что делает его менее элегантным. Пытался поместить код в форму Onpaint, но все еще мигает. ? –

Смежные вопросы