delphicomponentstimage

TImage - dynamically load resource by component name


I will assign this procedure into OnMouseEnter. I have some TImage that will change it's picture OnMouseEnter. It is easier to make each procedure of it on event handler. But i don't like to repeat the same code.

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;

How can i allow s into TImage.Name ?


Solution

  • Set the OnMouseEnter event of all the TImage objects to point to the same event handler, and use its Sender parameter to identify which TImage is calling the handler:

    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;