代码之家  ›  专栏  ›  技术社区  ›  peiman F.

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

  •  0
  • peiman F.  · 技术社区  · 9 年前

    我有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;
    

    好的。在得到元素的名称后,我如何才能更改目标文件或样式!?

    1 回复  |  直到 9 年前
        1
  •  2
  •   quasoft    9 年前

    您似乎正在转换类型为的对象 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) -错误的,错误的

    好处是 操作员为您执行安全检查,并警告您是否试图强制转换为不兼容的类型。

    第二个变量只能在变量是纯指针(不是对象)的情况下使用,这是很少需要的。


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

    最好想出另一个创建组件名称的方案。

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