TMemoryStream の使い方について教えてください。
MStream: TMemoryStream;
にあらかじめデータが入っているとして
任意の指定位置から、任意の指定位置まで
又は、任意の指定位置から何個(Byte)を
削除する方法を教えてください。
イメージ的には
MStream.Delete(10, 15);
10バイト〜15バイトまでの6バイトを削除する。
または、10バイトから24バイトまでの15バイトを削除する
とか・・・です。
すみません。
もうひとつ質問があります。
A: TMemoryStream;
B: TMemoryStream;
があり、それぞれデータが入っているとして、
Aのデータの一部をBに置き換えるというのは
どうすればよいのでしょうか?
どちらも Memory プロパティとSystem.Move手続きで実現できます。
早速、Moveを使って作ってみました。
コンパイルは通るのですが、実行時にエラーが出ます・・・
どこがいけないんでしょう?。
procedure TForm1.StremDelete(var SourceStream: TMemoryStream; Start: DWord; Len: DWord);
var
WorkStream: TMemoryStream;
begin
WorkStream := TMemoryStream.Create;
try
WorkStream.Position := 0;
Move(SourceStream, WorkStream, Start);
WorkStream.Position := Start + Len;
Move(SourceStream, WorkStream, WorkStream.Size - (Start + Len) + 1);
SourceStream.LoadFromStream(WorkStream);
finally
WorkStream.Free;
end;
end;
> イメージ的には
> MStream.Delete(10, 15);
> 10バイト〜15バイトまでの6バイトを削除する。
function DeleteMS(ms:TMemoryStream;InitPos,EndPos:integer):Boolean;
var
tmp:TMemoryStream;
begin
result := false;
if (InitPos>EndPos) or (EndPos>ms.Size-1) then exit;
tmp := TMemoryStream.Create;
try
try
ms.Position := 0;
tmp.Write(ms.Memory^,InitPos);
tmp.Write(pointer(PChar(ms.Memory)+EndPos+1)^,ms.Size-EndPos-1);
tmp.Position := 0;
ms.LoadFromStream(tmp);
ms.Position := 0;
result := true;
except
result := false;
exit;
end;
finally
tmp.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ms:TMemoryStream;
begin
ms := TMemoryStream.Create;
try
Memo1.Text := 'abcdefghij0123456789ABCDEFGHIJ';
Memo1.Lines.SaveToStream(ms);
if DeleteMS(ms,10,15) then
Memo2.Lines.LoadFromStream(ms)
else
Memo2.Text := 'Error';
finally
ms.Free;
end;
end;
> Aのデータの一部をBに置き換えるというのは
function ReplaceMS(target,source:TMemoryStream;TargetPos:integer):Boolean;
begin
result := false;
if ((targetPos+source.Size)>target.Size) then exit;
try
target.Position := targetPos;
target.Write(source.Memory^,source.Size);
target.Position := 0;
result := true;
except
result := false;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
a,b:TMemoryStream;
s:string;
begin
a := TMemoryStream.Create;
b := TMemoryStream.Create;
try
Memo1.Text := '012345678901234567890123456789';
Memo1.Lines.SaveToStream(a);
s := 'ABCDEFGHIJ';
b.Write(PChar(s)^,Length(s));
if ReplaceMS(a,b,10) then
Memo2.Lines.LoadFromStream(a)
else
Memo2.Text := 'Error';
finally
a.Free;
b.Free;
end;
end;
みなさん、どうもありがとうございました.
思い通りのことができるようになりました.
ツイート | ![]() |