delphi7,如何查看Timage存在的图片

时间:2013-04-20 23:32:07

标签: delphi image exists ram

标题很糟糕所以我会解释:

嗨,我创建了4张图片,其中角色(游戏角色,汽车)看向不同的方向,每次按箭头键(向上看向上看,向下看向下看,左看向左看,向右看看右边),这是代码:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var path,dleft,dright,dtop,dbot:string; 
begin
path:=paramstr(0);
dleft:=extractfilepath(path)+'Images\Pacman_Left.bmp';
dright:=extractfilepath(path)+'Images\Pacman_Right.bmp';
dtop:=extractfilepath(path)+'Images\Pacman_Top.bmp';
dbot:=extractfilepath(path)+'Images\Pacman_Bot.bmp';

  case Key of
     VK_UP:
    begin
      image6.Picture.LoadFromFile(dtop);
      image6.Top := image6.Top - 10;
      end;
     VK_DOWN:
       begin
       image6.Picture.LoadFromFile(dbot);
      image6.Top := image6.Top + 10;
      end;
    VK_LEFT:
       begin
       image6.Picture.LoadFromFile(dleft);
      image6.Left := image6.Left - 10;
      end;
    VK_RIGHT:
       begin
       image6.Picture.LoadFromFile(dright);
      image6.Left := image6.Left + 10;
  end;
  end;
end;

我认为我使用的代码非常糟糕,因为如果我按下一个键不止一次,它会重新加载图像,只要我按下相同的键就会继续这样做,这样浪费了ram 。我该怎么办? 感谢

3 个答案:

答案 0 :(得分:1)

一些改进:首先加载所有图像(例如,在应用程序启动时):

var
  bmCarLeft, bmCarRight, bmCarUp, bmCarDown: TBitmap;

...

bmCarLeft := TBitmap.Create;
bmCarLeft.LoadFromFile(dleft);
...

然后你可以做

Image6.Picture.Assign(bmCarSomething)

每次你需要改变它。

答案 1 :(得分:1)

有很多方法可以做到这一点 经典方式:
一张包含物品(汽车)所有状态的图片,并使用Canvas.CopyRect()方法从一个到另一个绘制适当的图像;
另一种方式:
将所有“精灵”加载到TImageList并使用TImageList.Draw()方法 等等。
主要思想:使用目标图片的Canvas属性并在其上绘制您想要的内容。

答案 2 :(得分:1)

从长远来看,改变管理图像的方式是最好的,但在短期内,最简单的解决方案是跟踪当前加载的图像,这样您只能在实际需要时加载新图像,例如:

type
  eWhichImage = (imgUp, imgDown, imgLeft, imgRight);

const
  ImgFiles: array[eWhichImage] of string = (dtop, dbot, dleft, dright);

procedure TMyForm.ImageNeeded(const Img: eWhichImage);
begin
  if image6.Tag <> Ord(Img) then
  begin
    image6.Picture.LoadFromFile(ImgFiles[Img]);
    image6.Tag := Ord(Img);
  end;
end;

case Key of
  VK_UP:
  begin
    ImageNeeded(imgUp);
    image6.Top := image6.Top - 10;
  end;
  VK_DOWN:
  begin
    ImageNeeded(imgDown);
    image6.Top := image6.Top + 10;
  end;
  VK_LEFT:
  begin
    ImageNeeded(imgLeft);
    image6.Left := image6.Left - 10;
  end;
  VK_RIGHT:
  begin
    ImageNeeded(imgRight);
    image6.Left := image6.Left + 10;
  end;
end;