ストリームにデータを読み書きする

ども、Norimakiです。

データを保存するという場合、ストリームを使用することが多くなります。

以前、話題に挙げたTVirtulaTreeViewについてもノードデータの保存は
ストリームに対して行います。

ということで、ストリームに関するデータのやり取りの備忘録をば。

通常、ストリームに対してデータのやり取りをする場合は、

書き込みは

読み込みは

なんて使います。

で、文字列のやり取りをする場合は、こんな感じ。

まぁ、色々と問題のあるコードかもしれませんが、
とりあえずこんな感じ。

まずは文字数を保存して、文字数分読み出したり書き込んだりすると。
そういう感じになってます。

現時点で僕が使用しているDelphiはXE4ですのでstringはunicodeです。
というわけで、バッファサイズはLen*SizeOf(Char) という感じになってます。

ここら辺は良くわかりませんが動くので....。

ということで済ませるのも良くないのでヘルプを見てみました。
ヘルプには、

Unicode(WideString)文字列の場合、Length は、
バイト数を 2 で割った値を返します。

なんて書かれているので、Len*SizeOf(Char)は Len*2 でも
いいんじゃなかろうか。なんて思ったりしています。

たしか、SizeOf(Char)は2だったはず。

で、型に応じてSizeOfとか記述するのも面倒くさい。
ということで、クラスヘルパーとoverloadを使って、

Stream.ReadUserData(変数);

とか

Stream.WriteUserData(変数);

とか出来たら便利じゃない?

便利でしょう。

と思ったわけで。で、こちら。

【宣言部】

【実装部】

こんな感じでどうでしょう。動くと思うんだけどなぁ。
実はまだ動かしてなかったりする。
ReadUserDataのストリームの部分を修正しました(2013/09/13)
⇒ Cntが0の時には読み込まないようにしました。

実際に動かしてみると、boolean型が上手く処理できていなかったようです。
ということで、コメントアウトしてちょっと対処しておきました。

何故うまくいかないかはよくわかりませんが、現時点での対症療法ということで。
小賢しいかもしれませんが、booleanを一時的にinteger型に変換して処理しています。

都合、現時点では6つの型だけを用意していますが、
必要に応じて増やすなりすればよろしいかと。

ではでは。
Norimakiでした。

シェアする

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

フォローする