On Mon, Mar 31, 2014 at 2:24 PM, Bob Axtell <bob.axt...@gmail.com> wrote:

> mine (a morse-code blinker) just doesn't work:
>
> unit Unit1;
>
> {$mode objfpc}{$H+}
>
> interface
>
> uses
>   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
> ExtCtrls;
>
> type
>
>   { TForm1 }
>
>   TForm1 = class(TForm)
>     Panel1: TPanel;
>     Timer1: TTimer;
>     procedure FormKeyPress(Sender: TObject; var Key: char);
>     procedure Timer1Timer(Sender: TObject);
>   private
>     { private declarations }
>     procedure morse;
>     procedure dash;
>     procedure dot;
>     procedure wait(x: longint);
>     { public declarations }
>  end;
>
> var
>   Form1: TForm1;
>   a,b,i: byte;
>   count,dat,
>   ms,ls,mchar: byte;
>   tick: integer;
>   col: integer = clblue;
>   mtbl: string[16] =
>    #$bf#$be#$bc#$b8#$b0#$a0#$a1#$a3#$a7#$af#$42#$81#$85#$61#$20#$84;
>
> implementation
>
> {$R *.lfm}
>
> { TForm1 }
>
> procedure TForm1.Timer1Timer(Sender: TObject);
> begin
>  timer1.enabled:= false;
> end;
>
> procedure TForm1.wait(x: longint);
> begin
>  tick:= x;
>  while tick > 0 do
>   begin
>     timer1.enabled:= true;
>     repeat until not timer1.enabled;
>     dec(tick)
>   end;
> end;
>
> procedure Tform1.dash;
> begin
>  Panel1.color:= col;
>  wait(30);
>  Panel1.color:= clwhite;
>  wait(10);
> end;
>
> procedure Tform1.dot;
> begin
>  panel1.color:= col;
>  wait(10);
>  panel1.color:= clwhite;
>  wait(10);
> end;
>
> procedure tform1.morse;
> begin
>  mchar:= $33;
>  ms:= ord(mtbl[succ((mchar shr 4) and 15)]);
>  ls:= ord(mtbl[succ(mchar and 15)]);
>  count:= (ms shr 5) and 7;
>  dat:= ms and 31;
>  for i:= 1 to count do
>  begin
>   if ((dat and 1) > 0) then dash else dot;
>   wait(10);
>   dat:= dat shr 1;
>  end;
>  wait(50);
>  { ms done, ls begins}
>  count:= (ls shr 5) and 7;
>  dat:= ls and 31;
>  for i:= 1 to count do
>  begin
>   if ((dat and 1) > 0) then dash else dot;
>   wait(10);
>  end;
>  wait(100);
> end;
>
> procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
> begin
>    case key of
>    'r': begin
>          col:= clred;
>          wait(15);
>         end;
>    'g': begin
>          col:= clgreen;
>          wait(15);
>         end;
>    'b': begin
>          col:= clblue;
>          wait(15);
>         end;
>    ' ': morse;
>   end;
>
> end;
>
> end.
>
> any ideas? using v1.0.14 under WinXP.
>
> --Bob A
>
>
TTimer in Windows (and the basic timer support in Windows ) is implemented
using window messages and you're not allowing the app to process messages
inside your loop.

I guess simply changing your loop to:
+++
   repeat
      Application.ProcessMessages;
   until not timer1.enabled;
+++
should make it work.
If it's no problem that your app freezes the UI during the wait (like it
does right now) you could just use Sleep() and abandon TTimer.
OTOH the usual way to use TTimer is to do processing in the OnTimer
handler, but then you'd have to change your code to store some state.

Regards,
Flávio
--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to