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

时间:2016-01-30 08:56:46

标签: delphi delphi-xe8

我有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获取元素名称后如何更改目标文件或样式!?

1 个答案:

答案 0 :(得分:2)

您似乎正在将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 - 右

VS

viewer := TImageViewer(Sender) - 错误

好处是as操作员会为您执行安全检查,并在您尝试强制转换为不兼容类型时发出警告。

第二个变体只能在变量是普通指针(不是对象)时使用,而且很少需要。

建议不要在表单上使用位置来使组件名称唯一。

最好提出另一种组件名称创建方案。

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