コラム / 1:1チャット / 6



N3Libは、Winsock+非同期イベント通知で動いてます。
特徴としては、フリーズしない ってことだと思ってもらえれば。
まぁ、使う場合はそれを無視できます。
こっち側でループをしてやって、常に監視しましょう。
TTimerを貼り付けます。
img26.png
0.1秒周期でいいでしょう。
img27.png
onTimerイベントを編集します。
必ずダブルクリックしてからそこに書き込んでくださいね。
procedure TForm1.Timer1Timer(Sender: TObject);
var log:string;
    ptr:Pointer;
    cmd:Integer;
    say:string;
begin
   log:=Session.LastCloseReason;
   if log<>'' then ShowMessage(log);

   if Session.BlockCount(0)>0 then begin
       ptr:=Session.GetBlock(0,cmd);
       UnPack(ptr,'t',[@say]);
       Memo1.Lines.Add(say)
   end;

   if Session.BlockCount(1)>0 then begin
       ptr:=Session.GetBlock(1,cmd);
       UnPack(ptr,'t',[@say]);
       Memo1.Lines.Add(say)
   end;
end;
こんなコードを書きます。
構造としては
1.エラー検知
2.0番さんからデータを貰う
3.1番さんからデータを貰う
となっています。
Session.LastCloseReasonは、何かしら特殊なエラーが起きたら、
書き換わりますが、参照すると消えてしまうので、
文字列型に代入してから使う決まりです。
というわけでlogに代入します。
何も無いときはからっぽで、そうでないなら何かあるわけでして、
log<>''
で判定します。
<> は、左辺と右辺が等しくないならば
という意味で、''は、空っぽの文字列 って意味です。
もし何かあれば
showMessage(log);で、そのエラーを表示します。
復帰処理は書いてません。
自分で再起動してちょ。
次の二つは複雑な処理になっています。
BlockCountは、今たまっているデータブロックの数を返します。
0より多いなら受信処理をするわけです。
GetBlockはデータブロックの開始ポインタを返します。
まぁ、Pointer型の変数に代入してやります。これお約束。
第二引数の、コマンドって奴は、
簡単にメッセージング通信ができるように、と用意してあるんですが、
今回は、
「発言」 以外の種類を送信しないので、適当な変数を渡します。
変数パラメータ(var)ですので、
0とか1とか入れても駄目です。かならずIntegerの変数を入れてください。
で、データブロックのポインタを貰ったら、
そこからデータを取り出します。
それ用の関数、unpackを用意してあります。
Unpackは、第一引数:データブロックのポインタ
第二引数:フォーマット文字列
第三引数:展開先変数のアドレスの配列
と、まぁ、わけのわからない関数ですが、
第一引数はさっき貰ったポインタですね。
第二引数は't'を指定します。
tってのは、「Text」の略で、unpack関数でテキストを展開するときに使います。
今回はテキスト1個だけ送るのでt一文字だけです。
第3引数は[  ]でくくって、
データを入れる変数を,で区切って、@マークをつけて並べる
と丸暗記したほうがよさそうです。
んまぁ今回は、テキスト1個ですので、
string型の変数を[@変数]と、一個だけ書くだけです。
そうすると、unpackによってデータブロックの中のテキストが出てきます。
そしたらそのテキストを、
Memo1.addすればいいわけですね〜
#navi(contents-page-name): No such page: コラム/1:1:チャット