德尔福资源节约

时间:2013-04-11 19:46:08

标签: delphi

我有一个项目有4个资源。我的要求是将它们保存在4种不同的路径中。所以我定义了以下代码:

procedure TMainForm.FormCreate(Sender: TObject);
var
  ResStream: TResourceStream;
begin
  ResStream := TResourceStream.CreateFromID(HInstance, 00001, RT_RCDATA);
  try
    ResStream.Position := 1;
    ResStream.SaveToFile('C:\MyFile.dll');
  finally
    ResStream.Free;
  end;
end;

我从这个论坛得到了它。然后我读了http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/delphivclwin32/!!MEMBEROVERVIEW_Classes_TResourceStream.html。但 TResourceStream.Position 对我来说并不清楚。对于第一个资源,它应该是1,对于第二个资源它应该是2,依此类推。

2 个答案:

答案 0 :(得分:3)

在这一行

ResStream.Position := 1;

您正在设置流的位置。这类似于在文件中设置文件指针。 Position的值与资源编号无关。文档描述如下:

  

指示流中用于读写的当前偏移量。

     

使用“位置”获取流的当前位置。这是   流数据开头的字节数。

实际上你根本不应该设置Position。它没有任何意义。你的代码可以是:

procedure SaveResourceToFile(const ID: Integer; const FileName: string);
var
  Stream: TResourceStream;
begin
  Stream := TResourceStream.CreateFromID(HInstance, ID, RT_RCDATA);
  try
    Stream.SaveToFile(FileName);
  finally
    Stream.Free;
  end;
end;

所以你需要调用这个函数四次,每次都传递资源的ID和目标文件名。

答案 1 :(得分:1)

Position的{​​{1}}属性与其他TResourceStream后代的TStream属性相同。它定义流数据中的当前读取或写入位置。设置Position := 1意味着下一个读或写操作将从数据的第二个字节开始。

您通常不希望将Position设置为零以外的任何值,因为您希望处理整个流。但是,在这种情况下,无关紧要SaveToFile始终将流的整个内容写入文件。目前的立场无关紧要。

单独加载每个资源(即,对TResourceStream.Create进行四次单独调用)并保存每个资源。