TImage - 按组件名称动态加载资源

时间:2017-08-08 10:14:30

标签: delphi components timage

我会将此程序分配到OnMouseEnter。我有一些TImage会更改它的图片OnMouseEnter。在事件处理程序上更容易制作它的每个过程。但我不想重复相同的代码。

var
  i: Integer;
  CoName: TComponent;
  png: TPngImage;
  s: string;
begin
  s := '';
  for i := 1 to 16 do
  begin
    CoName := Form1.Components[i];
    if CoName is TImage then
    begin
      s := CoName.Name;
      Break;
    end;
  end;
  if Trim(s) <> '' then
  begin
    png := TPngImage.Create;
    try
      png.LoadFromResourceName(hInstance, 'ResImgA');
      // s.picture.Assign(png);  > i can not do this
    finally
      FreeAndNil(png);
    end;
  end;
end;

如何允许s进入TImage.Name

2 个答案:

答案 0 :(得分:7)

将所有OnMouseEnter个对象的TImage事件设置为指向同一个事件处理程序,并使用其Sender参数来标识哪个TImage正在调用处理程序:

procedure TForm38.ImageMouseEnter(Sender: TObject);
var
  ResName: string;
  im: TImage;
  png: TPngImage;
begin
  im := Sender as TImage;

  // if your image resources are named as 'Res' + name of TImage (eg. 'ImgA')
  // you can combine these as
  ResName := 'Res' + im.Name;

  png := TPngImage.Create;
  try
    png.LoadFromResourceName(hInstance, ResName);
    im.picture.Assign(png);
  finally
    png.Free;
  end;
end;

答案 1 :(得分:0)

我这样做并且工作正常,你不需要String变量或循环:

procedure TForm1.Image1MouseEnter(Sender: TObject);
Var PngImg : TPngImage;
   // Image : TImage;   < -- If you need to handle error
begin
   //Image := Sender as TImage;  and remove IF
   if Sender is TImage then
    begin
      PngImg := TPngImage.Create;
      try
        PngImg.LoadFromResourceName(HInstance , 'PngImage_1');
        TImage(Sender).Picture.Assign(PngImg);
      finally
        PngImg.Free;
      end ;

    end;
end;

对于所有其他Timage(15),您可以设置事件而不重复对象检查器中的代码:

enter image description here