こんにちは。
クラサバプログラムでサーバ上のカレントディレクトリに存在する全てのデータを
D:フォルダ名
F:ファイル名
として取得し、クライアントのリストボックスに
一覧を表示したいと考えています。
TStringListに格納されたリストをWriteBufferを
使ってBufferに書き込んで
クライアント側でバッファから読んで書き込む処理を
こう考えていまが
どうもうまくいきません。
WriteBuffer,ReadBufferの使い方や
TStringListがいまいちよく理解していないので
使い方がそもそも間違っているのかもしれないのですが、
どなたか教えていただけないでしょうか?
お願いします。
サーバ側
CDir=カレントディレクトリです
FolderInfo:=TStringList.create;
FindFirst(CDir+'\*.*',FaAnyFile,sr);
repeat
if(sr.name<>'.') and (sr.name<>'..') then
if (sr.Attr in [faDirectory])=true then
begin
FolderInfo.add('D:'+sr.Name);
end
else
begin
FolderInfo.add('F:'+sr.Name);
end;
until FindNext(sr) <> 0;
FindClose(sr);
Writebuffer(FolderInfo,sizeOf(FolderInfo));
クライアント側
Test:=TstringList.Create ;
form1.Readbuffer(Test,SizeOf(Test));
form1.listbox1.Items.Assign(Test)
sizeOf(FolderInfo)
これが実際どんな値を返すか調べましたか?
調べたらわかると思いますが、4しか返ってきません。
なぜなら、クラス型の変数は,実際にはオブジェクトを参照するポインタです。
> Writebuffer(FolderInfo,sizeOf(FolderInfo));
このように書いたことはありませんが、FolderInfoがたとえ、追加した文字列を送ってくれる正しい書き方だとしても、4バイト分しか送ってくれません。
おそらく、文字列本体である FolderInfo.Text が、今回送信したいデータと推測できます。
FolderInfo.Text を送るような記述にしましょう。
ま、うまいこと送信できても次の質問が「クライアントでの読み取りバッファサイズ」でしょうか?
ん?さん
回答ありがとうございます。
調査不足でした。質問する際にもっと調査してから
質問する事にします。
申し訳ありませんでした
いやいやいや、申し訳ないぢゃなくて、「あぁ、そういう見方(デバック方法)があるんだ」と思っていただきたい。
目標のコードで動かないのであれば、簡単なコードで試して動きを確かめるのが第一歩。
まず、「うまくいかない」ということは、
1)送り側が正しく送っていない
2)受け側が正しく受け取っていない
と、考えられるでしょう。
では、まず先に調べるのが、送り側が正しいか。
で、第一と第二引数で、どっちが簡単に確認できるかというと、もちろん第二引数のLongint(?)
じゃ、サイズは合ってるの?・・・いいえ。4でした。
なぜ?・・・ヘルプで調べると「クラスは実際にはポインタ」としっかり書いてある。
この時点で、送っている文字列のサイズではないから、おかしい。
・・・と、順番に考えていけば、どこに問題があるかわかってくるはずです。
なお、このようなWriteBufferで、正しく送信できているか確認するには、TFileStream.Writeを使って、ファイルに書き込んでみるのが一番です。
記述方法は同じです。
少なくとも、TStringListに入ったフォルダ名・ファイル名をファイルに保存できるようになれば、正しくデータを送信できるようになります。
なお、TFileStream + 文字列 で過去ログを検索すれば、書き方も書いてあるでしょう。
昨日のレス
>FolderInfo.Text を送るような記述にしましょう。
を参考に
FolderInfoに格納されたアイテム数を、あらかじめクライアント側に送信し
受け取った回数分Readln()で受け取るようなロジックにしてみました
見た目的には望んでいた処理が行えるようになりました。
・前提条件
FolderInfo.Text=aaa.txt
bbb.txt
ccc.txt
ddd.txt
Cnt=FolderInfo.count
//////////////////////////
サーバ側
Write(FolderInfo.text);
クライアン側
for i:=1 to cnt do
Form1.listbox1.Items.Add(ReadLn());
//////////////////////////
上記のようなロジックで値を受け取ることが出来ました。
ヒントを頂きありがとうございました。
また、エラーが出る際にも何が原因なのか
順序立てて考える事が大切だと分かりました。
ありがとうございました。
ツイート | ![]() |