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

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

MMTimer and Focus [Delphi, Windows]


Jon ©   (2005-01-05 16:41:00) 

I am using pMMTimer in my project. I have BitBtn's on my form. I want timer to set focus of buttons. Focus only correct when I switch to another application then back to mine. Works fine with pTimer. I assume it is because pMMTimer runs in its own thread. Can anyone help? Using KOL 2.05 /Delphi 7 / Win XP.


Jon   (2005-01-07 18:04:00) [1]

I have tried the test with Free Pascal Compiler and it shows the same error too. I am convinced that this is a KOL fault. Is there a way to inform the developers?


Jon   (2005-01-06 15:54:00) [2]

Thanks for your reply Thaddy, but it was unsuccessful. I tried your suggestions many times. I think this may be a genuine bug in KOL.

I have written a short app to demonstrate the problem. Compile the code and use SPACE-BAR to advance the button. The buttons advance correctly, but the focus will always appear on the first button.

Now try switching to another application the back to this - magic! - the focus is on the correct button.

program TestFocus;

{$DEFINE MM_TIMER}

uses
Windows, Messages, Kol;

var
MainForm, BitBtn: PControl;
{$IFDEF MM_TIMER}
Timer: PMMTimer;
{$ELSE}
Timer: PTimer;
{$ENDIF}
i: Integer;

procedure TimerEvent(Dummy: Pointer; Sender: PTimer);
begin
Timer.Enabled := False; //Check - why needed if periodic is false??
if MainForm.ActiveControl.Tag = 3 then MainForm.Children[0].Focused := True
else MainForm.Children[MainForm.ActiveControl.Tag +1].Focused := True;
MainForm.ActiveControl.Color := clRed;
end;

procedure ButtonClick(Dummy: Pointer; Sender: PControl);
begin
Timer.Enabled := False;
MainForm.ActiveControl.Color := clBtnFace;
Timer.Interval := 500;
Timer.Enabled := True;
end;

begin
MainForm := NewForm(nil,'Test Focus').SetSize(280,60);
for i := 0 to 3 do
begin
 BitBtn := NewBitBtn(MainForm,Int2Str(i +1),[],glyphLeft,0,0).PlaceRight;
 BitBtn.Tag := i;
 BitBtn.OnClick := TOnEvent(MakeMethod(nil,@ButtonClick));
end;
MainForm.Children[0].Focused := True;
MainForm.ActiveControl.Color := clRed;
{$IFDEF MM_TIMER}
Timer := NewMMTimer(0);
Timer.Periodic := False;
{$ELSE}
Timer := NewTimer(0);
{$ENDIF}
Timer.OnTimer := TOnEvent(MakeMethod(nil,@TimerEvent));
Run(MainForm);
end.

PS I finally managed to get to your website using the www4mail.org service. Keep up the good work!


thaddy   (2005-01-05 17:04:00) [3]

Call setfocus on the applet handle first, then on the control or form you want focused. Also call bringtofront on the applet handle.


Наверх

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