我有一个项目有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,依此类推。
答案 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
进行四次单独调用)并保存每个资源。