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

Alv*_*Lin 0 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;
Run Code Online (Sandbox Code Playgroud)

但我真的不知道,如果有一种方法,我可以重复使用眨眼广场就像有一个步骤,procedure TForm1.Blink_Square(rec_number: integer);我们可以调用Blink_Square(5);rect5眨眼.

提前致谢

Rem*_*eau 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;
Run Code Online (Sandbox Code Playgroud)

或者:

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;
Run Code Online (Sandbox Code Playgroud)