データを移動するには?


げんぞう  2007-08-09 04:32:08  No: 27345

TMemoryStream の中に24バイトずつに区切られた
データが入っているのですが、
たとえば、10番目のデータを削除して、
11番目以降のデータを10番からにする場合、
新規に  TMemoryStream  を作成(クリエイト)し、
24バイトずつ  read  &  write  でコピーしていき、
10番目をスキップするしかないのでしょうか?


ごくう  2007-08-09 07:25:14  No: 27346

お師匠さん、こんなテもあるよ。
  procedure DeleteBlock({var} stream: TMemoryStream; n: Integer);
  const
   DSIZE = 24;
  var
   p1, p2: PChar;
  begin
   with stream do begin
    p1 := PChar(Memory) + (n * DSIZE);
    p2 := p1 + DSIZE;
    Move(p2^, p1^, Size-(p2-Memory));
    Size := Size - DSIZE;
   end;
  end;


げんぞう  2007-08-09 18:50:34  No: 27347

ありがとうございます。
ちなみに、ごくうの師匠は「げんじょう」ですよ。

さて、わからないことがひとつあります。
>Move(p2^, p1^, Size-(p2-Memory));
この3番目の引数が  Size - p2 ではなくて  Size-(p2-Memory)  に
なっているのはなぜでしょうか?


桃遊記  2007-08-10 00:35:45  No: 27348

http://72.14.235.104/search?q=cache:WiLrvWs_p7sJ:www.geocities.co.jp/SilkRoad/2781/charactor/character.html+%E3%81%92%E3%82%93%E3%81%9E%E3%81%86+%E3%81%94%E3%81%8F%E3%81%86&hl=ja&ct=clnk&cd=1&gl=jp
玄奘†「ワタシはゲンジョウよりもゲンゾウと呼んで欲しいけど」 
悟空Ω「オイラもソッチの方が好きだね」
玄奘†「ところで、ハッカイやサゴジョウは何処へ?」
悟空Ω「ハッカイは山へ芝刈り、サゴジョウは川で洗濯さ」
玄奘†「おいおい、それじゃモモタロウだろ」
悟空Ω「そう、敵は鬼ヶ島にあり、皆の者いざ行かん」
玄奘†「そんな、じゃ、ワタシはどうなるんだい?」
悟空Ω「天竺はやめて一緒に鬼退治に行こうよ、お師匠さん」
玄奘†「でもワタシにはアリガタイお経を貰いにいく大切な使命が…」
悟空Ω「その話はもう飽きたんじゃない?お師匠さん」
玄奘†「そういえばそうだねぇ、お経より宝物の方がいいか、それじゃイザ鬼ヶ島へ」
悟空Ω「では、お師匠さんは今日からオイラのお供の猿だよ」
玄奘†「ン?なんでオマエが桃太郎でワタシが猿?ギャクだろ?」
悟空Ω「ううん、ギャグもまた真ナリさ」

>この3番目の引数が  Size - p2 では…
玄奘†「そもそもコレではコンパイルも出来ないって」
悟空Ω「すとりぃむのさいずからぽいんたを引いてどうするんかな?」
玄奘†「ま、天竺行きやめての鬼退治も似たようなもんだけどね」
悟空Ω「それもそう、この際ナンでも蟻?」


みんみん  2007-08-10 08:14:27  No: 27349

やっていることは  ごくうさんと同じです。
これならちゃんとコンパイルできますよ。

procedure DeleteBlock(ms :TMemoryStream; num :integer);
const
  DSize =24;
var
  P1 ,P2 :Pointer;
begin
  with ms do
  begin
    Integer(P1) :=Integer(Memory) + DSize * num;
    Integer(P2) :=Integer(P1) + DSize;
    Move(P2^,P1^,Size - DSize * num);
    Size :=Size -DSize;
  end;
end;

指定できるのは、1番目〜n 番目です。


みんみん  2007-08-10 08:17:55  No: 27350

すみません。イージーミスです。

>Integer(P1) :=Integer(Memory) + DSize * num;

  Integer(P1) :=Integer(Memory) + DSize * (num-1);

でした。


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

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






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