更改运行时创建的元素样式

change runtime created element style

我有 5 个元素是在 运行 时间创建的,像这样

NewButton := TImageViewer.Create(Self);
    with NewButton do
    begin
      Parent := Self;
      Bitmap.LoadFromStream(InStream);
      Height := 80;
      Width := 80;
      tag:=leftx;
      Position.X := leftx;
      Position.Y := 5;
      OnClick := WaitingButtonsClick;
      Enabled := True;
      Visible := True;
      Name := 'but' + IntToStr(leftx);
    end;
leftx := leftx+85;

所以元素有自己的名字和标签

现在用户点击图片后我必须更改加载的图片

所以我在点击后得到了元素上的名字

procedure TForm1.WaitingButtonsClick(Sender: TObject);
begin
// ShowMessage( (Sender as TAction).ActionComponent.Name );
   ShowMessage(TImageViewer(Sender).Name);
 // id := TButton(Sender).tag;
 // showmessage('slm'+id.ToString);
end;

ok.after 获取元素的名称 我如何更改目标文件或样式!?

您似乎正在将类型 TImageViewer 的对象转换为 TButton

像这样更改您的点击处理程序:

procedure TForm1.WaitingButtonsClick(Sender: TObject);
var 
  viewer: TImageViewer;
begin
  viewer := Sender as TImageViewer;

  // Change file or style of viewer
  //viewer.Bitmap.LoadFromFile(....);

  ...
end;

通常,总是使用 as 运算符来转换对象:

viewer := Sender as TImageViewer - 正确

viewer := TImageViewer(Sender) - 错误

好处是 as 运算符会为您执行安全检查,并在您尝试转换为不兼容的类型时发出警告。

第二种变体只能在变量是普通指针(不是对象)的情况下使用,而且很少需要这种情况。


不建议同时使用表单上的位置来使组件名称唯一。

最好再想出一个组件名称创建方案

例如,您可以在表单中定义一个计数器并将该计数器添加到组件的名称中。