Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать мерцающий текст ?


Страницы:   1 2 3

MsGuns ©   (2009-01-09 11:47:00) 

Причем надо сделать это универсальной процедурой, получающей указатель на произвольный контрол и заставляющей его "мигать". Получается, что надо создать таймер и по его "тикам" то, прятать, то показывать текст. Но как "привязать" его к контролу, а потом еще и прибить, если учесть, что в общем случае "моргающих" контролов (например, меток или панелей статусбаров) может быть произвольное кол-во.
Процедура, напомню, внещняя, т.е. не является методом класса


KSergey   (2009-01-13 09:10:00) [21]

> oxffff ©   (13.01.09 08:44) [37]
> Нет, не так. Читаем
>
> KSergey ©   (11.01.09 15:39) [12]
>
> Идеальным видится случай перекрыть классы для всех контролов
> и в деструкторе удалять(-ся) из общего списка (на манер
> освобождения ссылки из списка своего Owner-а), но на сколько
> это удобно в конкретном случае - вопрос.

А дальше почитать 12 - не судьба?

Вообще штука вот в чем: вы говорите о том, как сделать собственно моргание. Я (и многое другие) - как удобно уравлять морганием нескольких контролов на одном общем механизме, в ОДНОМ месте с учетом того, что моргающие контролы вообще-то иногда дестроятся и это должно коректно обрабатываться, а не создавая объекты моргания на каждый визуальный контрол. И автору ка краз интерсне было как это одно место организовать, если посмотреть вопрос.

Решить же универсально сам процесс моргания - не особо нужно на самом деле, тут лучше тоньше подойти, с учетом конкретных контролов, а не просто перекрыв WM_PAINT без разбора, я писал почему.


oxffff   (2009-01-13 08:56:00) [22]


> MsGuns ©   (13.01.09 08:18) [36]
> >Моргающий бегущий текст?!!
>
> Моргает только контрол, в котором ошибка (TEdit к примеру).
>  "Бежит" текст с ошибкой, например, в статусбаре
>
> >oxffff ©
>
> Увы, не то :( см. [35]


Если используемые контролы не поддерживают данную функциональность
через уни-контракт(например IControlFlashText), тогда либо вы ее ручками
добавляете.
Либо делаете run-time идентификацию типа:
через is TTextControl then TTextControl(control).someTextProperty:=''
через статический или динамический паттерн Visitor.

Хотя у меня есть еще идея и универсальнее и сложнее.
Сказать? :)


oxffff   (2009-01-13 08:44:00) [23]


> KSergey ©   (13.01.09 05:56) [35]
> > oxffff ©   (13.01.09 00:18) [30]
> > В  [21]  все моргает. Без необходимости править сам контрол,
>
>
> Большенство предложенных методик так же обходились без правки
> контролов, не так ли?
>
> > oxffff ©   (12.01.09 18:14) [25]
> > > А где та самая супер-волшебная процедура?? (не метод!
> )
> > TFlashHandler.create на эту роль не подходит?
> > Если нет, то почему?
>
> Разницу между процедурой и методом понимаем? У автора явно
> написано (и даже подчеркнуто): процедура, это необходимое
> условие! Читайте внимательно.



> KSergey ©   (13.01.09 05:56) [35]
> > oxffff ©   (13.01.09 00:18) [30]
> > В  [21]  все моргает. Без необходимости править сам контрол,
>
>
> Большенство предложенных методик так же обходились без правки
> контролов, не так ли?


Нет, не так. Читаем

KSergey ©   (11.01.09 15:39) [12]


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


Вы предлагаете удалять контрол?
Где мигание текста, я его в упор не вижу.

Читаем далее Юрий Зотов ©   (12.01.09 00:32) [15]


procedure TMyTimer.SetFlash(Value: boolean);
begin
Enabled := Value;
if not Value then ... // восстановить исходные Caption'ы
end;


Это что за универсализм такой, вы привязываетесь к конкретным контролам.

>
> > oxffff ©   (12.01.09 18:14) [25]
> > > А где та самая супер-волшебная процедура?? (не метод!
> )
> > TFlashHandler.create на эту роль не подходит?
> > Если нет, то почему?
>
> Разницу между процедурой и методом понимаем? У автора явно
> написано (и даже подчеркнуто): процедура, это необходимое
> условие! Читайте внимательно.


Вы ее сами то хоть понимаете?
Это та же самая процедура(функция) с неявным параметром.
Механизм вызова идентичен.

Можете сделать процедуру, которая будет внутри вызывает конструктор.


> KSergey ©   (13.01.09 05:52) [34]
> > oxffff ©   (12.01.09 18:14) [25]
> Я уж не говорю про случаи (частые! см. всякие гриды, например),
>  где в WM_ERASEBKGND заливается одним цветом, а в WM_PAINT
> - другим. Если пойти предложенным путем - получим ту еще
> цветомузыку.


C чего мы получим светомузыку? С того через 1 сек повляется фон, а еще через секунду контрол перересовывается?
Получим просто моргающий контрол.


MsGuns   (2009-01-13 08:18:00) [24]

>Моргающий бегущий текст?!!

Моргает только контрол, в котором ошибка (TEdit к примеру). "Бежит" текст с ошибкой, например, в статусбаре

>oxffff ©

Увы, не то :( см. [35]


KSergey   (2009-01-13 05:56:00) [25]

> oxffff ©   (13.01.09 00:18) [30]
> В  [21]  все моргает. Без необходимости править сам контрол,

Большенство предложенных методик так же обходились без правки контролов, не так ли?

> oxffff ©   (12.01.09 18:14) [25]
> > А где та самая супер-волшебная процедура?? (не метод!)
> TFlashHandler.create на эту роль не подходит?
> Если нет, то почему?

Разницу между процедурой и методом понимаем? У автора явно написано (и даже подчеркнуто): процедура, это необходимое условие! Читайте внимательно.


KSergey   (2009-01-13 05:52:00) [26]

> oxffff ©   (12.01.09 18:14) [25]
> Дык, у меня TImage тоже прекрасно заглатывается.

При чем тут только имидж?!
Нужно же понимать, что в WM_PAINT происходит отрисовка всего контрола, а не только текста на нем. Посмотрите внимательно на StatusBar, например.
Речь же шла только о мигающем тексте, неужели это не понятно??
Я уж не говорю про случаи (частые! см. всякие гриды, например), где в WM_ERASEBKGND заливается одним цветом, а в WM_PAINT - другим. Если пойти предложенным путем - получим ту еще цветомузыку.


KSergey   (2009-01-13 05:46:00) [27]

> MsGuns ©   (13.01.09 00:11) [28]
> сделать " моргающий" стиль в контролах, где пользователь
> допустил ошибку, а кроме того в некотором другом месте (например,
>  статусбаре) отображать, например, бегущей строкой,

Моргающий бегущий текст?!! бедный пользователь, придется автору доплачивать всем пользователям на услуги офтальмолга...


MsGuns   (2009-01-13 00:38:00) [28]

Спасибо. Уже занимаюсь ;)


oxffff   (2009-01-13 00:23:00) [29]


> MsGuns ©   (13.01.09 00:15) [29]


Для Twincontrol нужно слегка модицицировать.
Уверен, что догадаетесь как.


oxffff   (2009-01-13 00:18:00) [30]


> MsGuns ©   (13.01.09 00:11) [28]


В  [21]  все моргает. Без необходимости править сам контрол, то есть в до какой то степени универсальна.
Я конечно знаю где могут быть проблемы, но это качестве рекомендацию по улучшению возможно необходимо использовать
 WM_ERASEBKGND c RECT контрола,
  либо Invalidate c Rect контрола(что менее выгодно поскольку будет послан WM_PAINT, который не будет обработан по причине неотрисовки на данном шаге моргания)


MsGuns   (2009-01-13 00:15:00) [31]

Компоненты нельзя потому, что проект (немалый проект) давно завершен и сдан, эксплуатируется в нескольких местах. Надо просто "улучшить" интерфейс (как говорит заказчик) с минимальной модификацией кода (который давно задокументирован и утвержден) - и все.


MsGuns   (2009-01-13 00:11:00) [32]

Не ожидал, что тема оказалась столь неоднозначной.
Цель сабжа в том, что есть необходимость в приложениях ввода сделать "моргающий" стиль в контролах, где пользователь допустил ошибку, а кроме того в некотором другом месте (например, статусбаре) отображать, например, бегущей строкой, расшифровку ошибки.

Типы котнролов могут весьма колебаться от TEdit до TStringGrid (т.е. нужен скорее всего TInplaceEdit). Т.к. приложений таких масса, а писать собственные компоненты нельзя, выход только в максимальной универсализации, т.е. опять же "внешняя" процедура и "передача параметрами".


Leonid Troyanovsky   (2009-01-12 19:16:00) [33]


> Smile   (12.01.09 18:20) [26]

> Я, что-то не до конца понял.

Меня раскручивают до "Идея доведена до реализации" :)

--
Regards, LVT.


Smile   (2009-01-12 18:20:00) [34]

Я, что-то не до конца понял.
Что чат уже отменили (сам давно туда не заглядывал, тем более что без регистрации туда не пущают)?
А так бы предложил участникам ветки пообщаться там


oxffff   (2009-01-12 18:14:00) [35]


> KSergey ©   (12.01.09 16:44) [23]
> > oxffff ©   (12.01.09 15:26) [21]
>
> А где та самая супер-волшебная процедура?? (не метод!)


TFlashHandler.create на эту роль не подходит?
Если нет, то почему?

Насколько я понял задачу речь шла о именно невозможности вмешаться в исходный код контрола.


> поменять цвет/вызвать Invalidate (хотя он и так вызовется)
> - много проще и волшебно.


Поменять цвет pen у DC? А где гарантии что в WndProc он не будет сменен?
Если поменять свойство-цвета контрола, тогда идет привязка к конкретному контролу, и нет универсальности.
А речь шла именно о том, что контрол не известен.


> Тем более, что в WM_PAINT не только текст рисуется, стоит
> отметить.


Дык, у меня TImage тоже прекрасно заглатывается.


oxffff   (2009-01-12 17:19:00) [36]


> KSergey ©   (12.01.09 16:44) [23]


А что непонятно со статус-баром?


KSergey   (2009-01-12 16:44:00) [37]

> oxffff ©   (12.01.09 15:26) [21]

А где та самая супер-волшебная процедура?? (не метод!)
Да и зачем так сложно?? поменять цвет/вызвать Invalidate (хотя он и так вызовется) - много проще и волшебно. Тем более, что в WM_PAINT не только текст рисуется, стоит отметить. У того же упомянутого статус-бара к примеру.


oxffff   (2009-01-12 15:34:00) [38]


> oxffff ©   (12.01.09 15:26) [21]


Хочу отметить - работающий набросок. Идея доведена до реализации.
Большей задачи перед собой не ставил.
:)


oxffff   (2009-01-12 15:26:00) [39]


> MsGuns ©   (09.01.09 11:47)  


НА
Tshape
Tlabel
Timage
работает.

 TFlashHandler=class
 State:byte;
 NativeHandler:TWndMethod;
 Timer:TTimer;
 Control:TGraphicControl;
 procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
 procedure DefaultHandler(var Message);override;
 procedure InterceptWndProc(var Message: TMessage);
 procedure OnTimer(Sender: TObject);
 constructor create(Control:TGraphicControl);
 destructor destroy;override;
 end;

{ TFlashHandler }

constructor TFlashHandler.create(Control: TGraphicControl);
begin
if not assigned(Control) then Raise Exception.Create('No control assigned');
Timer:=TTimer.Create(nil);
Timer.OnTimer:=ontimer;
self.Control:=Control;
NativeHandler:=Control.WindowProc;
Control.WindowProc:=InterceptWndProc;
end;

procedure TFlashHandler.DefaultHandler(var Message);
begin
NativeHandler(Tmessage(message));
end;

destructor TFlashHandler.destroy;
begin
Timer.Free;
end;

procedure TFlashHandler.InterceptWndProc(var Message: TMessage);
begin
Dispatch(message);
end;

procedure TFlashHandler.OnTimer(Sender: TObject);
var A:TWMPaint;
begin
ZeroMemory(@a,sizeof(a));
a.DC:=TCustomLabel(control).canvas.handle;
case state of
0:
 begin
 a.Msg:=WM_ERASEBKGND;
 Control.Parent.WindowProc(Tmessage(a));
 end;
1: begin
 a.Msg:=WM_PAINT;
 NativeHandler(Tmessage(A));
 end;
else; //No No No!!!
end;
State:=1-state;
end;

procedure TFlashHandler.WMPaint(var Message: TWMPaint);
begin
//Do Nothing
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
{Эти объекты нужно удалить}
TFlashHandler.create(shape1);
TFlashHandler.create(label1);
TFlashHandler.create(image1);
end;


oxffff   (2009-01-12 11:41:00) [40]


> KSergey ©   (12.01.09 11:03) [19]
> > oxffff ©   (12.01.09 09:00) [18]
> > Пропускать ему только сообщения, кроме WM_PAINT WM_NCPAINT
>
> >  WM_ERASEBKGND, а эти сообщения слать по таймеру родной
> процедуре.
>
> А как это поможет мерцанию текста? Скоре тогда контрол не
> будет отрисовываться когда надо. Мерцание, конечно, получим,
>  но какое-то странное :)
>


А вы внимательно читали суть вопроса?

универсальной процедурой, получающей указатель на произвольный контрол

Если контрол поддерживает нормальную обработку WM_PAINT WM_NCPAINT  WM_ERASEBKGND, то все будет хоккей.
А если он перерисовывается произвольно, тогда будет некоторое перемигивание. :)


> > oxffff ©   (12.01.09 09:00) [18]
> > либо через SetWindowLong, если это неизвестный контрол
> либо если это
> > наследник Tcontrol
>
> SetWindowLong канает только для TWinControl, который уже
> Tcontrol по определению.


Для TgraphicControl тоже можно сделать.
Конечно c наследниками TgraphicControl придется химичить, однако при желании можно и их сделать при вышеупомянутом способе.
Отлавливаем WndpProc и проверяем на IntersecRect с искомой областью
TgraphicControl.
А кстати почему такой неширокий кругозор? Или кроме VCL ничего больше нет? ;)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо