HTMLエディタを作る(18)(2001/01/04)
新着情報 トップメニュー ボードメニュー 掲示板 お手紙はここ!

うう。このソフトも、もうすぐ二年が経過しようとしている……(^^;) まぁ、マジで完成が間近ですけどねェ。はは。当初に想像してたのと微妙に違いますが、概ね思う壺でいい感じだ。あとはまぁ、マクロの強化と、複数ファイルの同時編集、タグチェッカとプログラムランチャ。ヘルプの充実……ぞのぐらいしか。
技術的にはさほど困難は無いと思うんで。今年中には何とかモノにしたいかな。うん。

記事としてネタにできるほどの話がなくなった感があります。試行錯誤って少なくなった。もちろん、誤解に基くバグってのは後を立たんのだけど、基本的には一々書くほどでもなかったりします。



そう極端なバグは無いと思うんですが、ただ、昔にデバッグした部分と言うのは、別の修正によって往々にしてバグ化してるわけで。どっかでキリをつけて、全体的なデバッグに入らなくちゃ……と思いつつ、新世紀に至ってしまったのは痛い話であります。仕方がないけど。

その割には、意味不明な機能は増していたりは、する。

技術的困難と言う点は、VCL のバグってのが一番厄介かも知れません。MPS においては TCoolBar ShowText プロパティTrue の時、バンドが再描画される毎にずれると言う現象が明らかになってます。Delphi-ML のバックログで確認したので俺が入れたバグじゃないことは間違い無いんですが、ML においても解決されていないのだ……ううーん。

そのバグはウィンドウのサイズを変えたときが一番顕著なので、前のバージョンでご覧なれるでしょう。打つ手がないので現行では TCoolBar.ShowText := False として回避。残念無念



マクロプリプロセッサは大体においてバグ取り完了……かな。解釈ミスもないし。あとは反応のある語彙を増やすだけ……。が、すでに実用してる範囲ではことさら増やしてもなぁ(^^;) 最初に思いついてても、使わない機能って多いみたいで。なんとも。

マクロの拡張について、テキストの処理系……全角・半角の変換なんかはいるよね。あと IME 制御とか。
スクリプトツールバーの入れ替えなんかもできるに越した事はないし。
なんだ、あれこれ有るじゃないか(笑)



今回のリリースは…… SSTP を使ってみたって話。SSTP というのはですね、デスクトップアクセサリ偽春菜≠ノ対して制御したりするためのプロトコルです。

まぁ MPS に搭載する意味はないけど、五月蝿くするって点では面白いのでやってみました。今まで何度か TCP/IP を利用するアプリケーションを開発するための実験を行ってたものの、失敗続きでかなり嫌いになってたんですが……初めて成功! ちゃんとパケット飛んでいるので感動することしきり。

TCP/IP も基礎の基本しか解ってないんですけど、何よりコンポーネントの癖が……添付のサンプルでは動いているのに自分で書くと動かんのだもの。やんなっちゃう。リクエストのしかたとかも知らなかったんで闇雲にデータ飛ばしてたりもしてたしねェ。

が、今回は奇跡的に上手く言ったらしい。SSTP の、CGI からデータを投げる Perl のサンプルがあって、そのおかげも大きいです。俺 Perl は知らないんですけど、辛うじて読むぐらいは出来ました。いやいやいやいや。

単純には、以下のコーディングで可能です。


begin
  SL := TStringList.Create;
  SL.Append( 'SEND SSTP/1.0' );
  SL.Append( 'Sender: Masoushinzen Project' );
  SL.Append( 'Script: \hメッセージ転送テスト中です。\e' );
  SL.Append( '' );

  ClientSocket1.Address := '127.0.0.1';
  ClientSocket1.Port    := 11000;
  ClientSocket1.Open;
  ClientSocket1.Socket.SendText( SL.Text );
  ClientSocket1.Close;
end;

これでデスクトップに偽春菜がいれば、吹出しに出力されるはずです。
ここでは SSTP プロトコル自体には触れません。あくまで MPS への実装での苦労話と言う事で……

まず、IP アドレスについて。自分自身のアドレスってどうやって設定したら良いか知らないんですよね。やっぱり DHCP サーバーにお願いしなければいけないと思うんですけど。難しすぎてどーにもこーにも。自分の環境なら DHCP サーバー使わないで決め打ちできるだろうけど。
って言うか、ユーザーに設定させても良いかもしれんが……なんか違うでしょう

ところが、偽春菜にメッセージを飛ばすあるアプリケーションの動作を見ると、127.0.0.1 というアドレスがあるじゃないですか。要するに自分自身のことらしいんだけども……ループバックアドレスとか言うそうな。と言うわけで、ローカルならまったく解決してしまった……

パケットを投げるコンポーネントは、Internet タブにある TClientSocket。設定すべきプロパティは AddressPort のみ、あと状況に応じて OnErrorOnRead を実装しよう。イベントに付いては、SSTPローカルな時間で二秒以上の接続を拒否する事から、要らん処理は控えたほうが良い模様。まぁ、二秒も掛かる処理なんてあまり考えられませんが。

当初は謎なことに、


begin
  ClientSocket.Open;
  ClientSocket.Close;
end;

だけで発生する OnWrite イベントSoket.SendText() してたりしまして(^^;) そうじゃないと転送できないんですよ……。先のコードで OnWrite イベントが割り当てられていると、処理の有無にかかわらず何も起きなくなります。どんなつもりか知らんけど、変。なかなか気がつきませんでした。今まで駄目だった理由がここにあったんです。

SSTP の場合、リクエストに対する返答が返されますので、要らないと言う場合を除いては OnRead は必要です。受け取ったデータは文字列と言うよりテキストとして返される(改行コード CRLF を含んでいる)ので、TStrings.Text で引き受けると処理が楽になりますが、イベント内で受ける関係上、バッファを開放するタイミングに注意が必要になります。

俺の場合、送受信のバッファを統一していたんですが、終了時のメッセージでハマりました。具体的には、イベントが発生しているものの、シングルスレッドであってみればイベントハンドラがすぐには起動されず、フォームの OnDestroy が終った後でやっと順番が回ってきた時には、既にバッファが開放されていまていて例外が発生しました。

結局、受け皿は単なる String 型で確保する事に……。必要ならば TStrings.Text に落とせば良ろしかろう。

これら、二つのイベントに関係するもの以外は特に壁もなく、比較的あっさりと実装できちゃいました。



と、いうわけで、0.2.1.34 のリリースなむめり。何げにビルド番号が跳ね上がってしまってますが。気になさらないように(笑)


ダウンロードする(MPS0201.EXE/938KB)



あとまぁ、偽春菜は使ってるよという人のためのサンプルと言う事で。

ダウンロードする(sstptest/171KB)


新着情報 トップメニュー ボードメニュー 掲示板 お手紙はここ!