Форум: "Основная";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];
ВнизКак сделать мерцающий текст ? Найти похожие ветки
← →
MsGuns © (2009-01-09 11:47) [0]Причем надо сделать это универсальной процедурой, получающей указатель на произвольный контрол и заставляющей его "мигать". Получается, что надо создать таймер и по его "тикам" то, прятать, то показывать текст. Но как "привязать" его к контролу, а потом еще и прибить, если учесть, что в общем случае "моргающих" контролов (например, меток или панелей статусбаров) может быть произвольное кол-во.
Процедура, напомню, внещняя, т.е. не является методом класса
← →
DVM © (2009-01-09 12:07) [1]
> MsGuns © (09.01.09 11:47)
лучше менять цвет текста контрола, опираясь на его имя.
А в чем сложность то?
← →
{RASkov} © (2009-01-09 12:36) [2]А так не подойдет:
type TMyCtrl = class(TControl);
var Flashing: Boolean;
procedure FlashCtrl(Ctrl: TControl; Txt: String; Clr: TColor; ACount, APause: Integer);
procedure Delay(Ms: Word);
var Tm: Cardinal;
begin
Tm:=GetTickCount+Ms;
while (Tm>GetTickCount) and not Application.Terminated do Application.ProcessMessages;
end;
var S: String; N: Integer; OldClr: TColor;
begin
if Flashing then Exit else Flashing:=True;
S:=TMyCtrl(Ctrl).Text; OldClr:=TMyCtrl(Ctrl).Font.Color;
if ACount<1 then ACount:=1 else if not Odd(ACount) then DEC(ACount);
try
for N:=1 to ACount do begin
Application.ProcessMessages;
if Odd(N) then begin
TMyCtrl(Ctrl).Font.Color:=Clr;
TMyCtrl(Ctrl).Text:=Txt;
Delay(APause);
end else begin
TMyCtrl(Ctrl).Font.Color:=OldClr;
TMyCtrl(Ctrl).Text:=S;
Delay(APause div 2);
end;
end;
finally
Application.ProcessMessages;
TMyCtrl(Ctrl).Font.Color:=OldClr;
TMyCtrl(Ctrl).Text:=S;
Flashing:=False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FlashCtrl(Label1, "Внимание!!!", clBlue, 3, 350);
FlashCtrl(Edit1, "(Sorry, Не найдено)", clRed, 5, 350);
end;
← →
{RASkov} © (2009-01-09 12:41) [3]> моргающих" контролов (например, меток или панелей статусбаров)
> может быть произвольное кол-во.
А, нет.... у меня только по одному контролу мыргает... Сорри, невнимательно прочитал...
← →
{RASkov} © (2009-01-09 13:19) [4]Или вот так:
type
TMyCtrl = class(TControl);
TFlashCtrl = class(TTimer)
private
Count: Integer;
Pause: Integer;
Step: Integer;
Txt, OldTxt: String;
Clr, OldClr: TColor;
Ctrl: TMyCtrl;
protected
procedure Flashing(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
constructor CreateFlash(ACtrl: TControl; ATxt: String; AClr: TColor; ACount, APause: Integer);
end;
..................
constructor TFlashCtrl.Create(AOwner: TComponent);
begin
raise Exception.Create("Ошибка, Нужно вызывать CreateFlash конструктор!");
//или CreateFlash(nil, "", clBlack, 0, 0);
end;
constructor TFlashCtrl.CreateFlash(ACtrl: TControl; ATxt: String; AClr: TColor; ACount, APause: Integer);
begin
inherited Create(nil);
Enabled:=False;
Interval:=APause;
Count:=ACount;
Pause:=APause;
Step:=0;
Ctrl:=TMyCtrl(ACtrl);
OldTxt:=Ctrl.Text;
Txt:=ATxt;
OldClr:=Ctrl.Font.Color;
Clr:=AClr;
OnTimer:=Flashing;
Enabled:=True;
end;
procedure TFlashCtrl.Flashing(Sender: TObject);
begin
if Step>=Count then begin
Ctrl.Font.Color:=OldClr;
Ctrl.Text:=OldTxt;
Free; Exit;
end;
if Odd(Step) then begin
Ctrl.Font.Color:=Clr;
Ctrl.Text:=Txt;
Interval:=Pause;
end else begin
Ctrl.Font.Color:=OldClr;
Ctrl.Text:=OldTxt;
Interval:=Pause div 2;
end;
INC(Step);
end;
Вызов:TFlashCtrl.Createflash(Label1, "Внимание!!!", clRed, 3, 350);
------------------------------------------------------------------------
Ну или в таком духе:)
← →
{RASkov} © (2009-01-09 14:00) [5]> Вызов:
> TFlashCtrl.Createflash(Label1, "Внимание!!!", clRed, 3,
> 350);
Можно чтоб все это более культурно выглядело, то в отдельный юнит, в раздел интерфеса только описание функцииprocedure FlashCtrl(ACtrl: TControl; ATxt: String; AClr: TColor; ACount, APause: Integer);
begin
TFlashCtrl.Createflash(ACtrl, ATxt, AClr, ACount, APause);
end;
Все остальное скрыть в implementation
← →
{RASkov} © (2009-01-09 15:39) [6]Вот нечто так наверное:
unit FlashCtrls;
interface
uses Classes, Controls, ExtCtrls, Graphics, SysUtils;
procedure FlashControl(ACtrl: TControl; ATxt: String; AClr: TColor; ACount, APause: Integer);
implementation
type
TMyCtrl = class(TControl);
TFlashCtrl = class(TTimer)
private
Count: Integer;
Pause: Integer;
Step: Integer;
Txt, OldTxt: String;
Clr, OldClr: TColor;
Ctrl: TMyCtrl;
protected
procedure Flashing(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
constructor CreateFlash(ACtrl: TControl; ATxt: String; AClr: TColor; ACount, APause: Integer);
end;
//-------------------
var LstCtrl: TList;
constructor TFlashCtrl.Create(AOwner: TComponent);
begin
raise Exception.Create("Ошибка, нужно вызывать CreateFlash конструктор!");
//eee CreateFlash(nil, "", clBlack, 0, 0);
end;
constructor TFlashCtrl.CreateFlash(ACtrl: TControl; ATxt: String; AClr: TColor; ACount, APause: Integer);
begin
inherited Create(nil);
Enabled:=False;
Interval:=APause;
Count:=ACount;
Pause:=APause;
Step:=0;
Ctrl:=TMyCtrl(ACtrl);
OldTxt:=Ctrl.Text;
Txt:=ATxt;
OldClr:=Ctrl.Font.Color;
Clr:=AClr;
OnTimer:=Flashing;
Enabled:=True;
Flashing(Self);
end;
procedure TFlashCtrl.Flashing(Sender: TObject);
begin
if Step>=Count then begin
Ctrl.Font.Color:=OldClr;
Ctrl.Text:=OldTxt;
LstCtrl.Delete(LstCtrl.IndexOf(Ctrl));
Free; Exit;
end;
if Odd(Step) then begin
Ctrl.Font.Color:=Clr;
Ctrl.Text:=Txt;
Interval:=Pause;
end else begin
Ctrl.Font.Color:=OldClr;
Ctrl.Text:=OldTxt;
Interval:=Pause div 2;
end;
INC(Step);
end;
procedure FlashControl(ACtrl: TControl; ATxt: String; AClr: TColor; ACount, APause: Integer);
begin
if LstCtrl.IndexOf(ACtrl)<0 then begin
TFlashCtrl.Createflash(ACtrl, ATxt, AClr, ACount, APause);
LstCtrl.Add(ACtrl);
end;
end;
initialization
LstCtrl:=TList.Create;
finalization
LstCtrl.Free;
end.
← →
MsGuns © (2009-01-10 23:18) [7]Спасибо за помощь.. Но это не то :(
← →
{RASkov} © (2009-01-11 00:18) [8]> [7] MsGuns © (10.01.09 23:18)
Странно :)
И никак нельзя переделать [6]?)
Можно, тогда, более подробней о том как нужно мыргать?)
← →
Германн © (2009-01-11 01:14) [9]Удалено модератором
← →
Германн © (2009-01-11 02:55) [10]Удалено модератором
← →
{RASkov} © (2009-01-11 09:04) [11]Удалено модератором
← →
KSergey © (2009-01-11 15:39) [12]> MsGuns © (09.01.09 11:47)
> Но как "привязать" его к
> контролу, а потом еще и прибить, если учесть, что в общем
> случае "моргающих" контролов (например, меток или панелей
> статусбаров) может быть произвольное кол-во.
Идеальным видится случай перекрыть классы для всех контролов и в деструкторе удалять(-ся) из общего списка (на манер освобождения ссылки из списка своего Owner-а), но на сколько это удобно в конкретном случае - вопрос.
PS
Посмотрел, точно, помню ж ЮЗ говорил про что-то такое: надо зарегистрировать таймер (или спец. компонент, используемый для хранения ссылок на подписавшихся на "моргание" компонент), вызвав метод TComponent.FreeNotification(AComponent: TComponent) для регистрирующегося компонента. Тогда при удалении компонент с мигающим текстом будет вызван метод Notification со значение opRemove (см. destructor TComponent.Destroy)
← →
KSergey © (2009-01-11 15:40) [13]PPS
т.е. ничего перекрывть не надо, инструментарий уже есть в VCL/
надеюсь, я понятно накорябал? :)
← →
Leonid Troyanovsky © (2009-01-11 17:22) [14]
> MsGuns © (09.01.09 11:47)
> Процедура, напомню, внещняя, т.е. не является методом класса
Вот глобальной процедурой такие вещи делать не надо.
Здесь нужен наследник TTimer, хранящий TList c примерно такими
TItemList = record
AControl: TControl;
AStrPropInfo: PPropInfo;
Text1: String;
Text2: String;
end;
Таймеру, как было замечено, еще нужна procedure Notification(..); override;
для получения уведомлений о разрушении контролов из списка.
Ну, а изменять текст можно примерно так:
http://groups.google.com/group/fido7.ru.delphi/msg/24f3346411cb1b08
Если, конечно, у контролов есть соответсвующие published property.
Ну, а для лоска надо еще предусмотреть запрет перерисовки формы
на время прохода по списку.
--
Regards, LVT.
← →
Юрий Зотов © (2009-01-12 00:32) [15]> MsGuns © (09.01.09 11:47)
1. Делаем компонент TMyTimer, как сказано в [14]. Добавляем ему свойство Flash:
public
property Flash: boolean read GetFlash write SetFlash stored False;
function TMyTimer.GetFlash: boolean;
begin
Result := Enabled
end;
procedure TMyTimer.SetFlash(Value: boolean);
begin
Enabled := Value;
if not Value then ... // восстановить исходные Caption"ы
end;
2. Делаем искомую универсальную процедуру, раз уж она так нужна. Что-то вроде этого:
procedure FlashControls(MyTimer: TMyTimer);
begin
MyTimer.Flash := not MyTimer.Flash
end;
← →
Германн © (2009-01-12 01:59) [16]
> Leonid Troyanovsky © (11.01.09 17:22) [14]
> Юрий Зотов © (12.01.09 00:32) [15]
Имхо в RxLib нечто подобное сделано было уже очень давно. Именно это я и хотел сказать, после того как Ганз точно объяснит что ему нужно.
← →
KSergey © (2009-01-12 07:03) [17]Как-то вот это
> MsGuns © (09.01.09 11:47)
> Причем надо сделать это универсальной процедурой, получающей
> указатель на произвольный контрол и заставляющей его "мигать".
не вяжется у меня с
> Юрий Зотов © (12.01.09 00:32) [15]
> procedure FlashControls(MyTimer: TMyTimer);
> begin
> MyTimer.Flash := not MyTimer.Flash
> end;
← →
oxffff © (2009-01-12 09:00) [18]
> MsGuns © (09.01.09 11:47)
> Причем надо сделать это универсальной процедурой, получающей
> указатель на произвольный контрол и заставляющей его "мигать".
>
Есть идея перехватывать WndProc контрола либо через
SetWindowLong, если это неизвестный контрол либо если это наследник Tcontrol - прямым обращение к полю WndProc.
Пропускать ему только сообщения, кроме WM_PAINT WM_NCPAINT WM_ERASEBKGND, а эти сообщения слать по таймеру родной процедуре.
+ возможно обрабатывать WM_ERASEBKGND самостоятельно.
← →
KSergey © (2009-01-12 11:03) [19]> oxffff © (12.01.09 09:00) [18]
> Пропускать ему только сообщения, кроме WM_PAINT WM_NCPAINT
> WM_ERASEBKGND, а эти сообщения слать по таймеру родной процедуре.
А как это поможет мерцанию текста? Скоре тогда контрол не будет отрисовываться когда надо. Мерцание, конечно, получим, но какое-то странное :)
> oxffff © (12.01.09 09:00) [18]
> либо через SetWindowLong, если это неизвестный контрол либо если это
> наследник Tcontrol
SetWindowLong канает только для TWinControl, который уже Tcontrol по определению.
← →
oxffff © (2009-01-12 11:41) [20]
> 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 ничего больше нет? ;)
← →
oxffff © (2009-01-12 15:26) [21]
> 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 15:34) [22]
> oxffff © (12.01.09 15:26) [21]
Хочу отметить - работающий набросок. Идея доведена до реализации.
Большей задачи перед собой не ставил.
:)
← →
KSergey © (2009-01-12 16:44) [23]> oxffff © (12.01.09 15:26) [21]
А где та самая супер-волшебная процедура?? (не метод!)
Да и зачем так сложно?? поменять цвет/вызвать Invalidate (хотя он и так вызовется) - много проще и волшебно. Тем более, что в WM_PAINT не только текст рисуется, стоит отметить. У того же упомянутого статус-бара к примеру.
← →
oxffff © (2009-01-12 17:19) [24]
> KSergey © (12.01.09 16:44) [23]
А что непонятно со статус-баром?
← →
oxffff © (2009-01-12 18:14) [25]
> KSergey © (12.01.09 16:44) [23]
> > oxffff © (12.01.09 15:26) [21]
>
> А где та самая супер-волшебная процедура?? (не метод!)
TFlashHandler.create на эту роль не подходит?
Если нет, то почему?
Насколько я понял задачу речь шла о именно невозможности вмешаться в исходный код контрола.
> поменять цвет/вызвать Invalidate (хотя он и так вызовется)
> - много проще и волшебно.
Поменять цвет pen у DC? А где гарантии что в WndProc он не будет сменен?
Если поменять свойство-цвета контрола, тогда идет привязка к конкретному контролу, и нет универсальности.
А речь шла именно о том, что контрол не известен.
> Тем более, что в WM_PAINT не только текст рисуется, стоит
> отметить.
Дык, у меня TImage тоже прекрасно заглатывается.
← →
Smile (2009-01-12 18:20) [26]Я, что-то не до конца понял.
Что чат уже отменили (сам давно туда не заглядывал, тем более что без регистрации туда не пущают)?
А так бы предложил участникам ветки пообщаться там
← →
Leonid Troyanovsky © (2009-01-12 19:16) [27]
> Smile (12.01.09 18:20) [26]
> Я, что-то не до конца понял.
Меня раскручивают до "Идея доведена до реализации" :)
--
Regards, LVT.
← →
MsGuns © (2009-01-13 00:11) [28]Не ожидал, что тема оказалась столь неоднозначной.
Цель сабжа в том, что есть необходимость в приложениях ввода сделать "моргающий" стиль в контролах, где пользователь допустил ошибку, а кроме того в некотором другом месте (например, статусбаре) отображать, например, бегущей строкой, расшифровку ошибки.
Типы котнролов могут весьма колебаться от TEdit до TStringGrid (т.е. нужен скорее всего TInplaceEdit). Т.к. приложений таких масса, а писать собственные компоненты нельзя, выход только в максимальной универсализации, т.е. опять же "внешняя" процедура и "передача параметрами".
← →
MsGuns © (2009-01-13 00:15) [29]Компоненты нельзя потому, что проект (немалый проект) давно завершен и сдан, эксплуатируется в нескольких местах. Надо просто "улучшить" интерфейс (как говорит заказчик) с минимальной модификацией кода (который давно задокументирован и утвержден) - и все.
← →
oxffff © (2009-01-13 00:18) [30]
> MsGuns © (13.01.09 00:11) [28]
В [21] все моргает. Без необходимости править сам контрол, то есть в до какой то степени универсальна.
Я конечно знаю где могут быть проблемы, но это качестве рекомендацию по улучшению возможно необходимо использовать
WM_ERASEBKGND c RECT контрола,
либо Invalidate c Rect контрола(что менее выгодно поскольку будет послан WM_PAINT, который не будет обработан по причине неотрисовки на данном шаге моргания)
← →
oxffff © (2009-01-13 00:23) [31]
> MsGuns © (13.01.09 00:15) [29]
Для Twincontrol нужно слегка модицицировать.
Уверен, что догадаетесь как.
← →
MsGuns © (2009-01-13 00:38) [32]Спасибо. Уже занимаюсь ;)
← →
KSergey © (2009-01-13 05:46) [33]> MsGuns © (13.01.09 00:11) [28]
> сделать "моргающий" стиль в контролах, где пользователь
> допустил ошибку, а кроме того в некотором другом месте (например,
> статусбаре) отображать, например, бегущей строкой,
Моргающий бегущий текст?!! бедный пользователь, придется автору доплачивать всем пользователям на услуги офтальмолга...
← →
KSergey © (2009-01-13 05:52) [34]> oxffff © (12.01.09 18:14) [25]
> Дык, у меня TImage тоже прекрасно заглатывается.
При чем тут только имидж?!
Нужно же понимать, что в WM_PAINT происходит отрисовка всего контрола, а не только текста на нем. Посмотрите внимательно на StatusBar, например.
Речь же шла только о мигающем тексте, неужели это не понятно??
Я уж не говорю про случаи (частые! см. всякие гриды, например), где в WM_ERASEBKGND заливается одним цветом, а в WM_PAINT - другим. Если пойти предложенным путем - получим ту еще цветомузыку.
← →
KSergey © (2009-01-13 05:56) [35]> oxffff © (13.01.09 00:18) [30]
> В [21] все моргает. Без необходимости править сам контрол,
Большенство предложенных методик так же обходились без правки контролов, не так ли?
> oxffff © (12.01.09 18:14) [25]
> > А где та самая супер-волшебная процедура?? (не метод!)
> TFlashHandler.create на эту роль не подходит?
> Если нет, то почему?
Разницу между процедурой и методом понимаем? У автора явно написано (и даже подчеркнуто): процедура, это необходимое условие! Читайте внимательно.
← →
MsGuns © (2009-01-13 08:18) [36]>Моргающий бегущий текст?!!
Моргает только контрол, в котором ошибка (TEdit к примеру). "Бежит" текст с ошибкой, например, в статусбаре
>oxffff ©
Увы, не то :( см. [35]
← →
oxffff © (2009-01-13 08:44) [37]
> 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 сек повляется фон, а еще через секунду контрол перересовывается?
Получим просто моргающий контрол.
← →
oxffff © (2009-01-13 08:56) [38]
> MsGuns © (13.01.09 08:18) [36]
> >Моргающий бегущий текст?!!
>
> Моргает только контрол, в котором ошибка (TEdit к примеру).
> "Бежит" текст с ошибкой, например, в статусбаре
>
> >oxffff ©
>
> Увы, не то :( см. [35]
Если используемые контролы не поддерживают данную функциональность
через уни-контракт(например IControlFlashText), тогда либо вы ее ручками
добавляете.
Либо делаете run-time идентификацию типа:
через is TTextControl then TTextControl(control).someTextProperty:=""
через статический или динамический паттерн Visitor.
Хотя у меня есть еще идея и универсальнее и сложнее.
Сказать? :)
← →
KSergey © (2009-01-13 09:10) [39]> oxffff © (13.01.09 08:44) [37]
> Нет, не так. Читаем
>
> KSergey © (11.01.09 15:39) [12]
>
> Идеальным видится случай перекрыть классы для всех контролов
> и в деструкторе удалять(-ся) из общего списка (на манер
> освобождения ссылки из списка своего Owner-а), но на сколько
> это удобно в конкретном случае - вопрос.
А дальше почитать 12 - не судьба?
Вообще штука вот в чем: вы говорите о том, как сделать собственно моргание. Я (и многое другие) - как удобно уравлять морганием нескольких контролов на одном общем механизме, в ОДНОМ месте с учетом того, что моргающие контролы вообще-то иногда дестроятся и это должно коректно обрабатываться, а не создавая объекты моргания на каждый визуальный контрол. И автору ка краз интерсне было как это одно место организовать, если посмотреть вопрос.
Решить же универсально сам процесс моргания - не особо нужно на самом деле, тут лучше тоньше подойти, с учетом конкретных контролов, а не просто перекрыв WM_PAINT без разбора, я писал почему.
← →
KSergey © (2009-01-13 09:12) [40]> oxffff © (13.01.09 08:56) [38]
> через статический или динамический паттерн Visitor.
Да, да
Как раз о его реализации стандартными средствами дельфи в основном и речь.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.005 c