TMemoryStream の中に24バイトずつに区切られた
データが入っているのですが、
たとえば、10番目のデータを削除して、
11番目以降のデータを10番からにする場合、
新規に TMemoryStream を作成(クリエイト)し、
24バイトずつ read & write でコピーしていき、
10番目をスキップするしかないのでしょうか?
お師匠さん、こんなテもあるよ。
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;
ありがとうございます。
ちなみに、ごくうの師匠は「げんじょう」ですよ。
さて、わからないことがひとつあります。
>Move(p2^, p1^, Size-(p2-Memory));
この3番目の引数が Size - p2 ではなくて Size-(p2-Memory) に
なっているのはなぜでしょうか?
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 では…
玄奘†「そもそもコレではコンパイルも出来ないって」
悟空Ω「すとりぃむのさいずからぽいんたを引いてどうするんかな?」
玄奘†「ま、天竺行きやめての鬼退治も似たようなもんだけどね」
悟空Ω「それもそう、この際ナンでも蟻?」
やっていることは ごくうさんと同じです。
これならちゃんとコンパイルできますよ。
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 番目です。
すみません。イージーミスです。
>Integer(P1) :=Integer(Memory) + DSize * num;
Integer(P1) :=Integer(Memory) + DSize * (num-1);
でした。
ツイート | ![]() |