【发布时间】:2020-09-24 04:27:36
【问题描述】:
如何在运行时将不同的标签分配给相同类型的各种对象(例如:TCircle)? 让我解释一下:我想在运行时创建各种圈子,并为每个圈子分配一个不同的标签,然后使用点击事件显示我点击的圈子。 这是我的代码片段:
procedure
TPhotoX.FormCreate(Sender:
TObject);
var
FilesN: String;
S: TBitmap;
Cir: TCircle;
begin
FlowLayout1.DeleteChildren;
GetFP:= TDirectory.GetFiles(GetPathIma, '*jpg', TSearchOption.soTopDirectoryOnly);
for FilesN in GetFP do
VertScrollBox1.BeginUpdate;
Cir.TCircle.Create(Self);
Cir.Parent:= FlowLayOut1;
Cir.Fill.Bitmap.WrapMode:=TWrapMode.TileOriginal;
Cir.Fill.Kind:= TBrushkind.Bitmap;
Cir.Height:= 85;
Cir.Width:= 85;
//...more circle's properties next including the Circle's Tag property that i ignore to implement
// Sorry i'm Delphi's Beginner but Delphi's power believer too!!! :-)
Cir.OnClick: CirClick;
try
S.TBitmap.Create;
FlowLayout1.AddObject(Cir);
S.LoadThumbnailsFromFile(FilesN, 150, 150);
Cir.Fill.Bitmap.Bitmap:=S;
Cir.Repaint;
VertScrollBox1.EndUpdate;
finally
S.Free;
end;
end;
//in the code above, how i can to assign differents tags for each circle for referencing later with this handler:
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;
end;
感谢任何形式的帮助...谢谢您
【问题讨论】:
-
S.TBitmap.Create;必须是S := TBitmap.Create;并且必须在 beforetry行上。 -
与
Cir.TCircle.Create(Self)相同,它必须是Cir := TCircle.Create(Self);并且您已经知道Tag属性。您还想要什么? -
另外,你需要一个
try..finally块用于VertScrollBox1.(Begin|End)Update: -
for 循环不起作用 - 需要一个开始/结束,或者如 Remy 所说,一个 Try/finally
-
因为您的
for循环是for variable in collection的形式,您没有自然整数索引来分配每个Cir的tag。因此,在procedure TPhotoX.FormCreate()中声明一个局部变量i: integer,在循环之前为其分配值0,并在为您创建的每个新Cir分配给Cir.Tag之前将其递增。
标签: delphi tags runtime firemonkey pascal