Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2013, 12:35   #1
KIRILL284
Пользователь
 
Регистрация: 09.08.2011
Сообщений: 12
По умолчанию Как избавится от мерцание текста

Код:
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.DoubleBuffered:=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]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 20.09.2013 в 13:39.
KIRILL284 вне форума Ответить с цитированием
Старый 20.09.2013, 12:53   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

НЕ рисовать (не использовать Canvas) в таймере.(тем более в двух!)
точнее не рисовать ВНЕ обработчика OnPaint.
если по результатам обработки НАДО обновить картинку(форму), использовать Invalidate.

А в рисовании (OnPaint) не грузить(читать) файлы.

Все сделать с точностью до наоборот.
В таймере прочитать файл, проанализировать, принять решение и послать(или не послать) сообщение о перерисовке (вызвать Invalidate)
а еще лучше если для (прочитать/проанализировать...) будет своя процедура (или даже функция) котрую мы сможем вызывать из обработчика OnTimerXX.

после этого (Invalidate) будет вызвана процедура рисования, которая "знает"про DoubleBuffered и умеет им пользоваться . В ходе оной будет вызван обработчик OnPaint который воспользуется данными полученными в обработчике таймеров и вы все увидите.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.09.2013 в 13:02.
evg_m вне форума Ответить с цитированием
Старый 20.09.2013, 13:11   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
VK_F12: form1.btn1.OnClick(Self);
вообще-то кнопка позволят себя нажать программно.
Код:
Btn1.click;
и вызов btn1click(sender: TObject) обеспечен с ПРАВИЛЬНЫМ параметром.

так тот вызов что у вас не сработает (правильно) при общем обработчике!
тем более что это внешние (от другой формы) кнопки. Кто сказал что там нет и никогда не будет такого общего обработчика которому надо ТОЧНО знать какая кнопка была нажата.

хотя здесь совсем не надо привязываться к интерфейсным объектам.
на самом деле и OnBtnXClick и onKeydown ОБА должны вызывать ОДНУ и туже процедуру. MyAction1.

Цитата:
s:=TStringList.Create;
должен выполняться только один раз! самое лучшее для него место OnCreate;
и для соблюдения хорошего тона
Код:
s.Free;
в OnDestroy.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.09.2013 в 13:20.
evg_m вне форума Ответить с цитированием
Старый 21.09.2013, 22:04   #4
KIRILL284
Пользователь
 
Регистрация: 09.08.2011
Сообщений: 12
По умолчанию

Спасибо все работает текст не мерцает.

Как остановить перемещение текста в форме по его окончанию?
KIRILL284 вне форума Ответить с цитированием
Старый 23.09.2013, 10:39   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Как остановить перемещение текста в форме по его окончанию?
узнать что текст закончился.
Цитата:
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; ведь перемещение текста выполняется по таймеру?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.09.2013, 20:22   #6
KIRILL284
Пользователь
 
Регистрация: 09.08.2011
Сообщений: 12
По умолчанию

Да по таймеру.
KIRILL284 вне форума Ответить с цитированием
Старый 25.09.2013, 20:45   #7
KIRILL284
Пользователь
 
Регистрация: 09.08.2011
Сообщений: 12
По умолчанию

Я не понял как сделать, приведи пример?
KIRILL284 вне форума Ответить с цитированием
Старый 26.09.2013, 10:14   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

а я не знаю что ты понимаешь под
Цитата:
по его окончанию
для расчета графического места занимаемого текстом используется тот-же DrawText c нужными параметрами (смотри выше).

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

Последний раз редактировалось evg_m; 26.09.2013 в 10:21.
evg_m вне форума Ответить с цитированием
Старый 26.09.2013, 16:46   #9
KIRILL284
Пользователь
 
Регистрация: 09.08.2011
Сообщений: 12
По умолчанию

а я не знаю что ты понимаешь под
Цитата:
по его окончанию
//-------------------------
Когда текст перемещается снизу вверх по форме, и когда он заканчивается, текст уходит за форму и остается только фон, мне надо чтобы таймер остановился в конце текста, а не прокручивал его дальше.
KIRILL284 вне форума Ответить с цитированием
Старый 26.09.2013, 16:52   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Проверяйте значение r.Top = Self.Heigth и если да, то Enabled = False
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как избавится от лишних библиотек? bill Помощь студентам 2 07.03.2012 10:09
Мерцание при выводе текста kostghost Паскаль, Turbo Pascal, PascalABC.NET 3 02.02.2012 17:08
Как избавится от сонливости? Ivan_32 Свободное общение 25 19.10.2010 10:25
Как избавится от этого символа??href Wi1D HTML и CSS 1 06.03.2010 23:55
Как избавится от нежелатьльного эффета текста Иллидан Общие вопросы Delphi 5 20.01.2008 21:45