コラム / 置換ツールを作ろう / 9



だらだらと解説してきましたが、これでやっと、
アプリの核に手をつける準備ができましたwww(おせーーー
たしか、最初に確認した仕様は、
-クリップボードの中身を読む
-置換する
-クリップボードに入れなおす
でしたね。
もちろんこのメインの部分も、何かしらのイベント時に実行させたいわけなんですが、
デザインしたフォームを見ればそんなのは一目瞭然で、
アッー! ボタンが押されたら実行です。

img22.png

onClickイベント、ありました。これです。
しかし、ボタンってどう見ても 押すためのもの ですよね。
ボタンを置いたってことは、押すものを置いた。⇒押したときの処理をしたい。
ってことだと思います。
そんなことでいちいちこんな英語がわーーわーわーわー 
なインスペクタを見るのはめんどうです。
Delphiでは、コンポーネントのイベントには、
デフォルトで設定されているものがあり、
コンポーネントをダブルクリックするだけで、
そのイベントを編集できます。

img23.png

いえーす!

img24.png

さっそくコードを書きましょう。
まずは、クリップボードのテキストを取り込む部分。
procedure TForm1.Button1Click(Sender: TObject);
begin
    if not clip.HasFormat(CF_TEXT) then begin
        showmessage('( ^ω^)クリップボードの中身がテキスト形式じゃないお・・・');
        exit;
    end;
end;
取り込む部分の前に、テキスト形式かどうかチェックしてみました。
画像のコピペ中に間違ってこのアプリをクリックしちゃうかもしれないですもんね。
さっそく、このコードを解説していきましょう。
begin-end は、大丈夫ですね。 処理の記述範囲です。
さて、変数の代入も演算もする前にいきなりifとか、
このコラムはどーなってんでしょうかwwww
おっと余談はおいといて
if というのは、制御構文の一つで、
if 式 then 文
と書きます。まぁこれは文法上のルールでして。わかりやすく?書くと。
if 判定 then begin
    命令達
end;
と書きます。beginとend;は、イベントとかといっしょで、
複数行のプログラムをくくっています。
「ifは、判定の結果が 真 ならば、命令達を実行します。」
先に命令の方を見ちゃいましょうね。(逃げ
showmessage();
exit;
とかいてあります。
「showmessageは、引数として与えた文字列を表示する
OKのみのダイアログボックスを表示する手続きです。」
手続き、というのは、プログラムのなかの、実行するもののことで(何?)、
ただ、手続き; と書けば、実行されます。引数がある場合は、
手続き(引数);と書きます。複数の引数の場合は、uses節でみたように、
手続き(引数1,引数2,引数3・・・);と、コンマ区切りで列挙します。
引数というのは、手続きに与える情報のことです。
例えば、ブーンしろ!という命令があったとします。
ブーンするには、場所がいくつかあるので、公園でブーンしろ!
駅前でブーンしろ!女子便所にブーンしろ!とか、いろんなパターンがあるのです。
でも、それぞれ細かく説明しなくても、「ブーンする」という部分は共通ですよね。
そして、「どこをブーンするのか」だけを可変にすれば効率がいいです。
このように、「命令の中で、処理を変えるときに指示するもの」が引数です。
(すごい我流の説明です。わかる人には m@(^Д^)プギャー って言われるぐらい。
まぁ、showmessage手続きは、引数の文字列を表示する んですよ。(さっきも書いたけど
つまり、( ココ );が、ダイアログボックスの本文になるわけですね。
じゃぁ、「'( ^ω^)クリップボードの中身がテキスト形式じゃないお・・・'」 
この両端の、シングルクォートはなんでしょうか。
実は、シングルクォートで括ったものは、プログラムの中で、
「文字列」として認識されます。括らないと、識別子、数値、として扱われ、
あわや、全角文字はエラーになります。
なんでこんな無駄な仕組みになっているかというと、

sirokuro.png

ってとこかなw
次の行、exit;は簡単です。
「exitは現在実行されている手続きから抜けます。」
この場合の手続きってのは、イベントも含みます。
まぁとにかく、他の事は無視して終了ーーーー ピピー 
さて、ifの中身はわかりました。
このshowmessageの中身とexitの働きから考えれば、
not clip.HasFormat(CF_TEXT)
というのは、「クリップボードの中身がテキスト形式じゃないなら」
という意味になる(というかそうさせたい)のはおkですね。
not というのは、右に続く論理値の真偽を逆転させる 論理演算子です。
まぁ、not だしね。
さて今回一の大悪党。clip.HasFormat(CF_TEXT)とはなんなのか。
.がついてますね。つまり、clipのHasFormat(CF_TEXT)を実行しろ。
という意味です。
HasFormatってのは、TClipbordクラスで定義されてる関数です。 
この関数ってのが曲者でして、「値を返す手続き」なんです。
値を返すとはどういうことかというと、
「関数は式の中で、その返した値かの用に扱われる」ってこと。
難しいですね。
いったん先に進んでみましょう。
HasFormatの意味は、
「クリップボードの中身が引数で指定した形式で取得できる場合 真 を返す」
となっています。
式の中で、返した値かの用に扱われる ということは、
もしHasFormat結果が真の時は、not clip.HasFormat(CF_TEXT)は、
not 真    もし結果が偽の時は、
not 偽   となります。
notは真偽を逆にしてしまうのですから、
もしHasFormat結果が真の時は、not clip.HasFormat(CF_TEXT)は、
not 真 → 偽   結果が偽の時は
not 偽 → 真   ということになります。
ということは・・・・?
この式はifの判定の部分に書かれていましたね。
ifは判定が真なら命令を実行する制御構文です。
つまり!!!!!!!!
もしHasFormat結果が真の時は
    if 偽 then begin
    命令
    end;
となり 命令は実行されず!
もしHasFormat結果が偽の時は
    if 真 then begin
    命令
    end;
となり実行されるのだ!!! そしてその中にはexit;があるから・・・
→中断!
というわけです。(関数の説明はいずこへ
さて、あとわからないのは、HasFormatの引数です。
実はこれ、
テキストかどうか調べるときはCF_TEXTを入れるって決まってるんです^^
(他の判定方法はヘルプを見てみてください。
というわけで、クリップボードの中身がテキストじゃないとエラーがでる処理が完成しました!
長くなったのでいったん実行してみましょう。
ファイル>全てを保存 したあと(しなくてもいいけどねwww
プロジェクト>project1をコンパイル

img25.png

としてから、プロジェクトフォルダにアクセスして(なつかしー

img26.png

project1.exeをダブルクリックです。

img27.png

テキストの時は何も起きないので、
ためしに適当なファイルを 右クリ→コピー してから、 アッー! ボタンを押してみましょう。
ブーンがでたらここまで成功です!
これだけでも感動しませんか?だめすか?