Как избавится от мерцание текста

unit Unit2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TForm2 = class(TForm)
 tmr1: TTimer;
 tmr2: TTimer;
 procedure tmr1Timer(Sender: TObject);
 procedure btn2Click(Sender: TObject);
 procedure tmr2Timer(Sender: TObject);
 procedure FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
 procedure FormPaint(Sender: TObject);
 procedure FormCreate(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;

var
 Form2: TForm2;
 y:Integer;
 s:TStringList;
 r:TRect;
 BitMap:TBitmap;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.tmr1Timer(Sender: TObject);
begin


 Bitmap.Width := Form2.Width;
 Bitmap.Height := Form2.Height;
 Bitmap.Canvas.Polygon([Point(0, 0), Point(1023, 0),
 Point(1023, 767), Point(0, 767)]);



 Form2.Canvas.Draw(0,0,BitMap);
 DrawText(Canvas.Handle,pchar(s.Text),length(s.Text),R,DT_WORDBREAK);

 r.Top:=r.Top-1;


end;

procedure TForm2.btn2Click(Sender: TObject);
begin
 tmr1.Enabled:=True;

end;

procedure TForm2.tmr2Timer(Sender: TObject);
begin
 DrawText(Canvas.Handle,pchar(s.Text),length(s.Text),r,DT_WORDBREAK);
 r.Top:=r.Top+1;
end;

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 case Key of
 VK_F12: form1.btn1.OnClick(Self);
 VK_F11: form1.btn2.OnClick(Self);
 VK_F10: form1.btn3.OnClick(Self);
end;
 end;


procedure TForm2.FormPaint(Sender: TObject);
begin


//--------------------------------
 s:=TStringList.Create;
 s.LoadFromFile('d:\1.txt');
 r:=ClientRect;

DrawText(Canvas.Handle,pchar(s.Text),length(s.Text),r,DT_WORDBREAK);

end;
procedure TForm2.FormCreate(Sender: TObject);
begin
 Form2.**************:=True;
 BitMap := TBitmap.Create;
 Bitmap.Width := Form2.Width;
 Bitmap.Height := form2.Height;
 Bitmap.Height := 100;
 BitMap.Canvas.Brush.Color:=clBlack;
 Bitmap.Canvas.Font.Size := 65;
 Bitmap.Canvas.Font.Color := clWhite;

end;

end.
___________ Код нужно оформлять по правилам: тегом [CODE]..[/СODE] (кнопочка на панели форматирования с решёточкой #) Не забывайте об этом!Модератор.
9 ответов

НЕ рисовать (не использовать Canvas) в таймере.(тем более в двух!) точнее не рисовать ВНЕ обработчика OnPaint. если по результатам обработки НАДО обновить картинку(форму), использовать Invalidate. А в рисовании (OnPaint) не грузить(читать) файлы.Все сделать с точностью до наоборот. В таймере прочитать файл, проанализировать, принять решение и послать(или не послать) сообщение о перерисовке (вызвать Invalidate) а еще лучше если для (прочитать/проанализировать...) будет своя процедура (или даже функция) котрую мы сможем вызывать из обработчика OnTimerXX.после этого (Invalidate) будет вызвана процедура рисования, которая "знает"про ************** и умеет им пользоваться . В ходе оной будет вызван обработчик OnPaint который воспользуется данными полученными в обработчике таймеров и вы все увидите.


VK_F12: form1.btn1.OnClick(Self);
вообще-то кнопка позволят себя нажать программно.
Btn1.click;
и вызов btn1click(sender: TObject) обеспечен с ПРАВИЛЬНЫМ параметром.так тот вызов что у вас не сработает (правильно) при общем обработчике! тем более что это внешние (от другой формы) кнопки. Кто сказал что там нет и никогда не будет такого общего обработчика которому надо ТОЧНО знать какая кнопка была нажата.хотя здесь совсем не надо привязываться к интерфейсным объектам. на самом деле и OnBtnXClick и onKeydown ОБА должны вызывать ОДНУ и туже процедуру. MyAction1.
s:=TStringList.Create;
должен выполняться только один раз! самое лучшее для него место OnCreate; и для соблюдения хорошего тона
s.Free;
в OnDestroy.


Спасибо все работает текст не мерцает.Как остановить перемещение текста в форме по его окончанию?


Как остановить перемещение текста в форме по его окончанию?
узнать что текст закончился.
DrawText F1 DT_CALCRECT Determines the width and height of the rectangle. If there are multiple lines of text, DrawText uses the width of the rectangle pointed to by the lpRect parameter and extends the base of the rectangle to bound the last line of text. If there is only one line of text, DrawText modifies the right side of the rectangle so that it bounds the last character in the line. In either case, DrawText returns the height of the formatted text but does not draw the text.
и отключить таймер. TimerX.enabled:=false; ведь перемещение текста выполняется по таймеру?


Да по таймеру.


Я не понял как сделать, приведи пример?


а я не знаю что ты понимаешь под
по его окончанию
для расчета графического места занимаемого текстом используется тот-же DrawText c нужными параметрами (смотри выше).либо при выводе, но наверное лучше в таймере делаем: сравниваем рассчитанное размещение текста (используя DrawText мы здесь не рисуем а только считаем!) с критичным размещением, тем что имеем на форме (размеры поля вывода) и как полагаем (размещение текста в поле вывода) должно быть ПО ОКОНЧАНИИ ТЕКСТА и в нужный нужный момент останавливаем таймер. точное совпадение (=) может и не случиться, поэтому отстановка должна выполняться по неравенству (>|<|<=|>=) ! при расчете ширина требуемого поля вывода <=0 при расчета ширина требуемого поля вывода <= ширина реального поля вывовда


а я не знаю что ты понимаешь под Цитата: по его окончанию //------------------------- Когда текст перемещается снизу вверх по форме, и когда он заканчивается, текст уходит за форму и остается только фон, мне надо чтобы таймер остановился в конце текста, а не прокручивал его дальше.


Проверяйте значение r.Top = Self.Heigth и если да, то Enabled = False