问题描述
我如何在运行时将不同的标签分配给相同类型的各种对象(例如,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]
我非常感谢您的帮助...谢谢
解决方法
正如注释中指出的那样,您的代码中存在一些错误。您没有正确创建TBitmap
和TCircle
对象。您没有充分保护资源。而且您的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;