【第9回】
第3章:インターネットを利用しよう
送信ミスをなくすための工夫
(00/07/07)
こんにちはnakkaです。前回まで作成したメールソフトを、今回はさらに改良します。メールソフトはコミュニケーションの手段ですから、送信ミスは厳禁です。そこで、送信中のキャンセルを可能にしたり、送信直前にメール本文や送信先メールアドレス、件名(サブジェクト)を確認できるようにします。
Windows用の拡張APIで送信キャンセルを可能に
前回のソケットの使い方は同期型といって、データの受信や送信が完了するまで他の処理が行えませんでした。これでは、データの送受信中にウィンドウを描画することすらできず、ソフトが固まったように見えます。今回はWindows用に拡張されたソケットのAPIを使用して、送信中のキャンセルなどが行えるように改良します。
Windows用に拡張されたAPIの“WSAAsyncSelect()”を使用すると、データの受信や送信が可能になったときに、ウィンドウにメッセージが届くようになります。このため、メッセージが届くまでの間は他の処理をすることができるのです。これを実現するためには通信を行う前に“WSAAsyncSelect()”というAPIでウィンドウやメッセージの登録を行います。
/* ソケットのイベントの設定 */
if(WSAAsyncSelect(Soc, hWnd, WSOCK_SELECT,
FD_CONNECT | FD_READ | FD_CLOSE) == SOCKET_ERROR){
lstrcpy(ErrStr, "イベント設定に失敗しました");
return -1;
}
|
上記の登録を行うとデータの受信や送信が可能になったときに、登録してあるメッセージがウィンドウに届きます。そのメッセージを受け取ったときに受信や送信を行うとすぐに処理が帰ってくるため、前回のように動作が固まることがなくなるのです。
送信中に他の処理が行えるようになったので、送信ダイヤログで送信のキャンセルができるようにしました。ユーザーがキャンセルボタンが押したときに、プログラムは送信のキャンセルを示す“RSET”というコマンドを送信したのち、“QUIT”というコマンドを送信しているだけです。そのままプログラムがソケットとウィンドウを閉じて終了します。こうしてできたのが次のプログラムです。通信回線が高速の場合はあっというまに送信が完了して、キャンセルすることができないので注意しましょう。
プレビュー表示で本文確認
送信時に確認用のダイアログと送信するテキストファイルのプレビュー表示を追加しました。このように、間違って送信してしまわないための何らかのしくみを加えておかないと、大切なメールを他の人に送信してしまったなんて事態が起こります。彼女に送るはずのメールを間違えて会社の上司に送ってしまったら「あー、しまった!」なんて嘆いても後の祭りです。
プレビュー表示するには、送信前に送信確認ダイアログで[プレビューボタン]を押します。すると、送信確認ダイアログの下側が大きくなって、送信するテキストファイルのプレビューが表示できるようにしました。送信用のショートカットアイコンに送信相手の写真画像を登録しておけば、相手を間違えることはないでしょうから、プレビュー表示できるとほとんどの送信ミスはなくなるはずです。
送信中は何をやっているの?
機能は出揃いましたが、メールを送信するときに何も情報を表示していないことに気が付きましたか? 多くのメールソフトが送受信のステータスを表示しているように、メールの送信中などプログラム内部で何か処理を行うときは、できるだけ進行状況を表示するといいでしょう。処理に多少の時間がかかるとき、ユーザーはプログラムが何をやっているかわからないという不安にかられるものです。現在何を行っているのか、またどのくらいまで完了したのかをユーザーに見せてあげるといいと思います。ということで、このメール送信プログラムではサーバーとのコマンドのやり取りを表示するようにしてみました。
さらに、メールを送信する前の送信確認ダイアログで本文をプレビュー表示させるだけでなく、送信先のメールアドレスとメールの件名を表示すると親切でしょう。これでユーザーが送信前にチェックしたい情報がすべて送信確認ダイアログに表示されるようになりました。さらに、これまでファイル名をそのままメールの件名にしていましたが、ファイル名には使えない文字があるし、送信直前にならないとメールにふさわしい件名ってなかなか思いつかないので、件名の変更もできるようにしてみました。
これでメール送信ソフトは完成です。次回はとうとう最終回。インターネットを利用したソフトの続きということでHTTPを扱ったソフトを作ってみます。お楽しみに。
(nakka)