-2

私は 4 つのリソースを持つ 1 つのプロジェクトを持っています。私の要件は、それらを 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 にするかなど。

4

2 に答える 2

3

この行で

ResStream.Position := 1;

ストリームの位置を設定しています。これは、ファイル ポインターを file に設定することに似ています。の値はPositionリソース番号とは関係ありません。ドキュメントには、次のように説明されています。

読み書き用のストリームへの現在のオフセットを示します。

ストリームの現在の位置を取得するには、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;

そのため、この関数を 4 回呼び出す必要があり、毎回リソースの ID と宛先ファイル名を渡します。

于 2013-04-11T20:00:17.280 に答える
1

aのPositionプロパティは、TResourceStream他のTStream子孫と同じ意味です。ストリームのデータ内の現在の読み取りまたは書き込み位置を定義します。設定Position := 1は、次の読み取りまたは書き込み操作がデータの 2 番目のバイトから開始されることを意味します。

Positionストリーム全体を処理する必要があるため、通常はゼロ以外に設定することはありません。ただし、この場合は問題ありませんSaveToFile常にストリームの内容全体をファイルに書き込みます。現職は関係ありません。

各リソースを個別にロードし (つまり、 への 4 つの個別の呼び出しTResourceStream.Create)、それぞれを保存します。

于 2013-04-11T19:59:03.073 に答える