ただし、プロシージャの外で値を保持するための外部の場所を取ります - プロシージャの終了後にローカル変数が存在しない (そしてその値が失われる) ためです (そうしないと、再帰とマルチスレッドが不可能になります)。
type
TMainForm = class(TForm)
....
private
Luminosity: byte;
Direction: shortint;
end;
// Those variables exist in the form itself, outside of
// the procedure, thus can be used to hold the values you need.
procedure TMainForm.Timer04Timer(Sender: TObject);
begin
Label01.Font.Color := RGB(Luminosity, Luminosity, Luminosity);
if ((Luminosity = 0) and (Direction < 0)) or
((Luminosity = 255) and (Direction > 0))
then Direction := - Direction // go back
else Luminosity := Luminosity + Direction; // go forth
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Luminosity := 0;
Direction := +1;
Timer04.Enabled := true;
end;
変数はフォーム自体のメンバーであるため、プロシージャの外に存在するため、プロシージャの終了後に値を保持するために使用できます。
PS。上記の色スイング範囲の端でわずかに目立つ遅延があります (色を変更する代わりに符号を変更することにより、1 つの「カウント」をスキップします)。私が自分のプロジェクトでそれを行った場合、(カウンターを追加するか、タイマーのプロパティを微調整することで) さらに遅延を追加したため、ユーザーはその色がしばらくの間スタックしているのを実際に見ることができます (そして、比較的快適にテキストを読むための時間を与えることができます)。 )。これはタスクによって必須ではありませんが、IMHO ユーザー エクスペリエンスが向上します。
type
TMainForm = class(TForm)
....
private
var
Luminosity, Latch: byte;
Direction: shortint;
const
LatchInit = 5;
end;
// Those variables exist in the form itself, outside of
// the procedure, thus can be used to hold the values you need.
procedure TMainForm.TimerLabelColorTimer(Sender: TObject);
begin
if Latch > 0 then begin
Dec(Latch);
exit;
end;
LabelSwinging.Font.Color := RGB(Luminosity, Luminosity, Luminosity);
if ((Luminosity = 0) and (Direction < 0)) or
((Luminosity = 255) and (Direction > 0))
then begin
Direction := - Direction; // go back
Latch := LatchInit; // give user eyes time to relax
end else
Luminosity := Luminosity + Direction; // go forth
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Luminosity := 0; // optional: Delphi objects anyway do zero their internal
Latch := 0; // variables before entering the constructor
Direction := +1; // and that is required
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
TimerLabelColor.Enabled := true;
end;
procedure TMainForm.FormHide(Sender: TObject);
begin
TimerLabelColor.Enabled := false;
end;
タイマーを有効にすることは、OnCreate
次の 2 つの理由から、ハンドラーで行う場所がありません。
- IDE の Object Inspector でプロパティを変更することにより、必要なもの
OnCreate
を DFM に入れることができます。
- さらに重要なことは、目に見えないフォームのラベルの色を変更する意味がほとんどないため、タイマー シーケンスを開始するにはフォームの作成が少し早すぎることです。