TStringListの値を渡すようにするには?

解決


ががが  2005-06-07 22:58:17  No: 15417

こんにちは。
クラサバプログラムでサーバ上のカレントディレクトリに存在する全てのデータを
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)


ん?  2005-06-07 23:25:55  No: 15418

sizeOf(FolderInfo)
これが実際どんな値を返すか調べましたか?

調べたらわかると思いますが、4しか返ってきません。
なぜなら、クラス型の変数は,実際にはオブジェクトを参照するポインタです。

> Writebuffer(FolderInfo,sizeOf(FolderInfo));
このように書いたことはありませんが、FolderInfoがたとえ、追加した文字列を送ってくれる正しい書き方だとしても、4バイト分しか送ってくれません。

おそらく、文字列本体である FolderInfo.Text が、今回送信したいデータと推測できます。
FolderInfo.Text を送るような記述にしましょう。

ま、うまいこと送信できても次の質問が「クライアントでの読み取りバッファサイズ」でしょうか?


ががが  2005-06-07 23:34:14  No: 15419

ん?さん
回答ありがとうございます。

調査不足でした。質問する際にもっと調査してから
質問する事にします。
申し訳ありませんでした


ん?  2005-06-08 03:46:08  No: 15420

いやいやいや、申し訳ないぢゃなくて、「あぁ、そういう見方(デバック方法)があるんだ」と思っていただきたい。

目標のコードで動かないのであれば、簡単なコードで試して動きを確かめるのが第一歩。

まず、「うまくいかない」ということは、
 1)送り側が正しく送っていない
 2)受け側が正しく受け取っていない
と、考えられるでしょう。

では、まず先に調べるのが、送り側が正しいか。
で、第一と第二引数で、どっちが簡単に確認できるかというと、もちろん第二引数のLongint(?)
じゃ、サイズは合ってるの?・・・いいえ。4でした。
なぜ?・・・ヘルプで調べると「クラスは実際にはポインタ」としっかり書いてある。
この時点で、送っている文字列のサイズではないから、おかしい。
・・・と、順番に考えていけば、どこに問題があるかわかってくるはずです。

なお、このようなWriteBufferで、正しく送信できているか確認するには、TFileStream.Writeを使って、ファイルに書き込んでみるのが一番です。
記述方法は同じです。
少なくとも、TStringListに入ったフォルダ名・ファイル名をファイルに保存できるようになれば、正しくデータを送信できるようになります。

なお、TFileStream + 文字列 で過去ログを検索すれば、書き方も書いてあるでしょう。


ががが  2005-06-08 19:43:05  No: 15421

昨日のレス
>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());
//////////////////////////

上記のようなロジックで値を受け取ることが出来ました。
ヒントを頂きありがとうございました。

また、エラーが出る際にも何が原因なのか
順序立てて考える事が大切だと分かりました。
ありがとうございました。


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

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






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