我如何在运行时在Delphi中为各种对象分配不同的标签

问题描述

我如何在运行时将不同的标签分配给相同类型的各种对象(例如,TCircle)? 让我解释一下:我想在运行时创建各种Circle,并为其分配一个不同的标记,然后使用on click事件显示我单击的Circle。 这是我的代码的一部分:

   Fuel_Type Year_Model
0   Gasoline       2012
1   Gasoline       2013
2   Gasoline       2014
3   Gasoline       2015
4   Gasoline       2016
..       ...        ...
82       E85       2036
83       E85       2037
84       E85       2038
85       E85       2039
86       E85       2040

[87 rows x 2 columns]

我非常感谢您的帮助...谢谢

解决方法

正如注释中指出的那样,您的代码中存在一些错误。您没有正确创建TBitmapTCircle对象。您没有充分保护资源。而且您的for循环缺少必需的begin/end块来包含循环逻辑。

要回答您的问题,由于使用的是for..in循环,如果要分配基于索引的Tag值,则需要使用单独的变量来跟踪当前值遍历集合时进行索引。

尝试更多类似的方法:

procedure TPhotoX.FormCreate(Sender: TObject);
var
  FilesN: String;
  S: TBitmap;
  Cir: TCircle;
  I: Integer;
begin
  FlowLayout1.DeleteChildren;
  GetFP := TDirectory.GetFiles(GetPathIma,'*jpg',TSearchOption.soTopDirectoryOnly);
  if GetFP <> nil then Exit;

  VertScrollBox1.BeginUpdate;
  try
    I := 1;
    for FilesN in GetFP do
    begin
      Cir := TCircle.Create(Self);
      try
        Cir.Parent := FlowLayOut1;  
        Cir.Fill.Bitmap.WrapMode := TWrapMode.TileOriginal;
        Cir.Fill.Kind := TBrushkind.Bitmap;
        Cir.Height := 85;
        Cir.Width := 85;
        Cir.Tag := I; // <-- or whatever you need
        Inc(I);
        Cir.OnClick := CirClick;

        S := TBitmap.Create;
        try
          S.LoadThumbnailsFromFile(FilesN,150,150);
          Cir.Fill.Bitmap.Bitmap := S;
        finally
          S.Free;
        end;

        FlowLayout1.AddObject(Cir);
      except
        Cir.Free;
        raise;
      end;

      //Cir.Repaint;
    end;
  finally
    VertScrollBox1.EndUpdate;
  end;
end;

procedure TPhotoX.CirClick(Sender: TObject);
begin
  case TCircle(Sender).Tag of
    1: // event to show the image inside the circle
    2: // event to show another image inside the circle
  end;
end;