德尔福:你如何控制多个相似的对象?

时间:2014-09-13 02:48:36

标签: delphi firemonkey

假设我有五个TRectangle对象,并且一个函数将传入一个参数,使其中一个闪烁。

我知道如何控制一个对象,如下面的代码:

procedure TForm1.TimerTimer(Sender: TObject);
begin
  if rect1.Visible then
    rect1.Visible := false
  else
    rect1.Visible := true;
end;

procedure TForm1.Blink_Square;
begin
  Timer := TTimer.Create(nil);
  Timer.OnTimer := TimerTimer;
  rect1.Fill.Color := TAlphacolors.Red;
  rect1.fill.Kind := TBrushKind.bkSolid;
  rect1.Stroke.Thickness := 1;
  rect1.Stroke.Color := Talphacolors.Darkgray;
  Timer.Interval := 500;
  Timer.Enabled := True;
end;

但我真的很想知道是否有一种方法可以反复使用闪烁方块,例如procedure TForm1.Blink_Square(rec_number: integer);这样的程序我们可以调用Blink_Square(5);使rect5闪烁。

先谢谢

1 个答案:

答案 0 :(得分:7)

您可以将对象存储在数组或列表中,然后使用procedure参数将其编入索引。

var
  Blinks: array[1..5] of record
    Rectangle: TRectangle;
    Timer: TTimer;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Blinks[1].Rectangle := Rect1;
  Blinks[1].Timer := nil;

  Blinks[2].Rectangle := Rect2;
  Blinks[2].Timer := nil;

  Blinks[3].Rectangle := Rect3;
  Blinks[3].Timer := nil;

  Blinks[4].Rectangle := Rect4;
  Blinks[4].Timer := nil;

  Blinks[5].Rectangle := Rect5;
  Blinks[5].Timer := nil;
end;

procedure TForm1.TimerTimer(Sender: TObject);
var
  Timer: TTimer;
begin
  Timer := TTimer(Sender);
  Blinks[Timer.Tag].Visible := not Blinks[Timer.Tag].Visible;
end;

procedure TForm1.Blink_Square(Number: Integer);
begin
  Blinks[Number].Rectangle.Fill.Color := TAlphacolors.Red;
  Blinks[Number].Rectangle.fill.Kind := TBrushKind.bkSolid;
  Blinks[Number].Rectangle.Stroke.Thickness := 1;
  Blinks[Number].Rectangle.Stroke.Color := Talphacolors.Darkgray;
  if Blinks[Number].Timer = nil then
  begin
    Blinks[Number].Timer := TTimer.Create(Self);
    Blinks[Number].Timer.OnTimer := TimerTimer;
    Blinks[Number].Timer.Interval := 500;
    Blinks[Number].Timer.Tag := Number;
    Blinks[Number].Timer.Enabled := True;
  end;
end;

可替换地:

var
  Rects: array[1..5] of TRectangle;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Rects[1] := Rect1;
  Rects[2] := Rect2;
  Rects[3] := Rect3;
  Rects[4] := Rect4;
  Rects[5] := Rect5;
end;

procedure TForm1.TimerTimer(Sender: TObject);
begin
  TRectangle(Sender).Visible := not TRectangle(Sender).Visible;
end;

procedure TForm1.Blink_Square(Number: Integer);
var
  Rec: TRectangle;
  Timer: TTimer;
  M: TNotifyEvent;
begin
  Rec := Rects[Number];
  Rec.Fill.Color := TAlphacolors.Red;
  Rec.fill.Kind := TBrushKind.bkSolid;
  Rec.Stroke.Thickness := 1;
  Rec.Stroke.Color := Talphacolors.Darkgray;
  if Rec.Tag = 0 then
  begin
    M := TimerTimer;
    TMethod(M).Data := Rec;
    Timer := TTimer.Create(Rec);
    Timer.OnTimer := M;
    Timer.Interval := 500;
    Timer.Enabled := True;
    Rec.Tag := NativeInt(Timer);
  end;
end;