コラム / バイナリエディタ / 25



これから、
新規作成
開く
フォームを閉じる
時に、変更がされていたら、
はい/いいえ/キャンセル
を表示する→分岐
機能をつくろうと思います。
メインメニュー>新規作成
をクリック。
procedure TForm1.New1Click(Sender: TObject);
begin
    //新しく作るんだからパスは未定。
    FilePath:='';
    //今書かれてるテキストをあぼーん。
    Memo1.Clear;
end;
の頭にコードを追加して
procedure TForm1.New1Click(Sender: TObject);
begin
    if Memo1.Modified then begin
        Case MessageDlg('( ^ω^)変更されてるけど保存するお?',
        mtConfirmation,mbYesNoCancel,0) of
             mrYes:begin
                SaveAs1Click(Sender);
             end;
             mrNo:begin
                //何もしない
             end;
             mrCancel:begin
                Exit;
             end;
        end;
    end; 
    Memo1.Modified:=False;

    //新しく作るんだからパスは未定。
    FilePath:='';
    //今書かれてるテキストをあぼーん。
    Memo1.Clear;
end;
としてください。うわ!長!
じっくり見ていきましょう。
追加された部分は、
if Memo1.modified then begin
    (略)
end;
となっています。
Memo1.modifiedですが、メモコンポーネントの
modifiedプロパティーは、テキストが変更されていたらTrue
変更されていなければFalse となります。
変更されていたら、
Case MessageDlg('( ^ω^)変更されてるけど保存するお?',
        mtConfirmation,mbYesNoCancel,0) of
    (略)
end;
に行きます。 おっと、ここで新しい構文。
Case of - end; が出てきました。
使い方は
Case 分岐値 of
    値a:begin
       命令1
    end;
    値b:begin
       命令2
    end;
    値c:begin
       命令3
    end;
     ・
   ・
   ・
end;
という風に書き、
分岐値が値aなら命令1 値bなら命令2 値cなら命令3 が 実行されます。
if else は、真か偽 男か女 生きるか死ぬか 財か愛か
の2択でしたが、
caseの場合は、赤か黄色か青か vipかラウンコかメンヘルか動物大嫌いか スク水か女子高生か猫耳か
と、何択でもできます。
ちなみに最後のは一つに選ぶのは難しいです。
case文の分岐値は、2択ではダメですから、
論理型は使えません。整数型や列挙型という型でなくてはなりません。
そして残念ながら「文字列は使えません」 ここはマジ微妙。
また、ofのあとに 値:begin end; というように選択肢を並べるわけですが、
最後に end; をつけるにもかかわらず、
「of の次にはbeginをつけてはダメ」です。
便利な割りに変な仕様なCase文です。
今回の場合は、分岐値は
MessageDlg('( ^ω^)変更されてるけど保存するお?',
        mtConfirmation,mbYesNoCancel,0)
となっています。
MessageDlgは整数型を返す関数です。
難しい引数が入ってますが、がんばって説明すると
MessageDlg(表示する文章,ダイアログのタイプ,ボタン,使わない);
となります。
あ いや 使わない っていうのはもちろん冗談です。
ただ実際使わない。。。
ボタンの中に [ヘルプ] を入れる場合に、
そのヘルプと対応させる、
ヘルプトピックのコンテキストID
ってのを指定するんですが、ヘルプボタンを入れないので 使わないってことです。
つか、ヘルプトピックとか作るの大変じゃん?(?
まぁ正直に言うと自分は使い方知りません。うわっはっは
じゃぁ他のところを説明しましょう。
表示する文章
これは簡単です。showmessageと同じように、
ダイアログにメッセージをつけられます。
この場合は、変更されている場合に保存するか聞くダイアログなので、
'( ^ω^)変更されてるけど保存するお?'
を指定するわけですね。 もちろん好きに変えてもOK。
ダイアログのタイプ
これは、入れられる値が決まっています。
めんどくさいのでヘルプコピペ
mtWarning 黄色の感嘆符が表示されているメッセージボックス
mtError 赤色の停止のマークが表示されているメッセージボックス
mtInformation 青色の i が表示されているメッセージボックス
mtConfirmation 緑色の疑問符が表示されているメッセージボックス
mtCustom	 ビットマップがないメッセージボックス。メッセージボックスのキャプション にはアプリケーションの実行可能ファイルの名前が表示されている
メモ帳だと、黄色い△のアイコンが出て、
ちょっと嫌な感じです。
目に優しい緑色の疑問符にしました。
赤の停止標識はうぜえし、青のiは恐らく「インフォメーション」ですし。
もちろん好みで変えてもいいですw
ボタン
これは、ダイアログにつけるボタンを指定します。
ボタンの種類を表す値があるので、表示したいボタンの値を、
[mbOK,mbNO,mbCancel]
という風に、[] でくくって コンマ区切りで指定します。
ところが、はい/いいえ/キャンセル などの良く使う組み合わせは、
既に組み合わせとして定義してくれてあります。
その一つが
mbYesNoCancel
であり、 はい/いいえ/キャンセル を指定できます。
まとめると
 MessageDlg('( ^ω^)変更されてるけど保存するお?',
        mtConfirmation,mbYesNoCancel,0)
は、
「( ^ω^)変更されてるけど保存するお? を 表示する、
 緑色疑問符のアイコンの、 はい/いいえ/キャンセル ボタンを持った
 ダイアログボックスを作り、押されたボタンを教えろ」
という関数になるわけですね。
それじゃぁ、返り値はどうなるのかというと、
mbYes ボタンが押されたなら、返り値は、 mrYes
mbNo なら mrNo  mbCancelなら mrCancel
というように、bがrになって返ってきます。
今回は、mrYes mrNo mrCancel が返ってくるかもしれないわけですね。
では、Case of - end; の中を見て見ましょう。
            mrYes:begin
               SaveAs1Click(Sender);
            end;
            mrNo:begin
               //何もしない
            end;
            mrCancel:begin
               Exit;
            end;
値:begin
    処理
end;
でしたね。
順番に見ていきましょう。
            mrYes:begin
               SaveAs1Click(Sender);
            end;
mrYesだったら、SaveAs1Clickを実行しています。
これ、名前をつけて保存のクリックイベントで飛ばされる手続きでしたね。
これで、名前をつけて保存 をクリックしたことになります。
そのあとcase of - end; の次の処理に行きます。
            mrNo:begin
               //何もしない
            end;
コメントがあるだけで何もしないみたいです。
何もしないでCase of - end; の次の処理へ。
            mrCancel:begin
               Exit;
            end;
なんと、Exitしています。
手続きの強制終了ですから、それ以降の処理には進みません。
新規作成の処理が行われないことになります。
ふう、これでCase文の全容がわかりました。
その後に追加されてる
   Memo1.Modified:=False;
ですが、新規作成してリセットするので、
Modifiedを偽 にしてます。 Falseは論理型の偽 ですね。
だいぶ長くなったので、開く、閉じるはまたあとで