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

TImage - dynamically load resource by component name

我会把这个程序分配到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

将所有TImage对象的OnMouseEnter事件设置为指向同一个事件处理程序,并使用其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;

我这样做了,它工作正常,你不需要 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) ,您可以设置事件而无需重复对象检查器中的代码: