TMemoryStream の使い方について

解決


大仏グミ  2004-11-17 21:01:53  No: 11792

TMemoryStream の使い方について教えてください。

MStream: TMemoryStream;
にあらかじめデータが入っているとして
任意の指定位置から、任意の指定位置まで
又は、任意の指定位置から何個(Byte)を
削除する方法を教えてください。

イメージ的には
MStream.Delete(10, 15);
10バイト〜15バイトまでの6バイトを削除する。
または、10バイトから24バイトまでの15バイトを削除する
とか・・・です。


大仏グミ  2004-11-17 21:10:25  No: 11793

すみません。
もうひとつ質問があります。

A: TMemoryStream;
B: TMemoryStream;

があり、それぞれデータが入っているとして、
Aのデータの一部をBに置き換えるというのは
どうすればよいのでしょうか?


盧舎那  2004-11-17 21:34:36  No: 11794

どちらも Memory プロパティとSystem.Move手続きで実現できます。


大仏グミ  2004-11-17 22:35:05  No: 11795

早速、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;


つっか  2004-11-17 23:24:19  No: 11796

> イメージ的には
> 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;


大仏グミ  2004-11-18 17:49:39  No: 11797

みなさん、どうもありがとうございました.
思い通りのことができるようになりました.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加