Delphi All Stars
株式会社フルネスが創設した国内で唯一のDelphiスペシャリスト集団
投稿一覧
2.4 アプリケーションの実行とテスト
アプリケーションの実行とテスト
コンパイル/ビルド/デバッグ/実行
これらの作業(コンパイル/ビルド/デバッグ/実行)は人間が理解できるPascal言語の記述をコンピュータが理解できる機械語に翻訳する作業になります。
Delphiを始め、Pascal系のすべての言語に共通する事であり、同じ作業を必要とする言語にC言語、C++言語が該当します。これらの言語を総称して「ネイティブコンパイラ」と呼びます。
似たような仕組みの言語に「インタプリタ」系の言語があります。有名どころとしては「Java」、「C#」、「VB.net(VB)」が存在します。但し、インタプリタ言語は「ネイティブコンパイラ」系の言語と異なり、アプリケーション単体では動かず、それぞれの言語に対応したライブラリをパソコンにインストールしておかないと、アプリケーションを起動する事が出来ません。逆に言うと、このライブラリさえインストールすればWindowsでも、Macでも、Linuxでも同じ実行ファイルで動いてしまう事になります。(特定のOS環境に依存した機能を使ったり、書き方をした場合は除く)
上記の言語と一線を画するのが「スクリプト」系言語です。「インタプリタ」系言語と同じでライブラリを必要とします。このスクリプト系言語の最大の特徴はただのテキストファイルが実行権限を持って動いてしまう事です。この最大の強みは特定の開発環境がなくとも、極端な話、メモ帳一つで作れてしまう事です。
では、早速作業に入りましょう。
先ず、拡張子を表示できるようにします。
Windows7なら、コントロールパネルを起動し、表示方法を「大きなアイコン」にして、「コントロールパネル」→「フォルダーオプション」→「表示」から、「登録されている拡張子を表示しない」のチェックボックスを外します。
Windows10なら適当なフォルダを開くか、エクスプローラを起動し、「表示」タブを選択、ファイル名拡張子のチェックボックスを入れます。
実行すると、今日の日時を表示してくれるプログラムをネイティブコンパイラ(Delphi)、スクリプト(Visual Basic Script)で作っていきます。
Delphiで実行した場合
コンソールアプリケーションを新規に作り、以下のコードをtryとexceptの間に記述し、実行します。
ソース7
writeln(DateTimeToStr(now)); sleep(4000);
実行結果:
メモ帳を起動します。(Windows7なら、スタートメニューのファイル名を指定して実行から、「notepad」と入力、Windows10なら、コルタナに「notepad」と入力し,Enterを押します)
Visual Basic Script:下記をメモ帳に記述し、「nowtime.vbs」という名前で保存します。完了したら、そのファイルをダブルクリックします。
ソース8
msgbox(now)
違いが判りましたでしょうか?Delphiで記述するには必ずDelphiが必要で、僅かでも変更をするには必ずDelphiで編集しないとなりません。
対して、スクリプトはメモ帳一つでも作れてしまいます。
コンパイル(ビルドも含む)が実行形式プログラム(*.exe)を出力する迄の動き
「Pascalソースファイル(*.pas)」
↓
コンパイラ
↓
「フォームファイル(*.dfm、又は*.fmx)」
「中間オブジェクト(*.dcu)」
「リソースファイル(*.rex)」
↓
リンカ
↓
「実行形式プログラム(*.exe)」
プログラムのテスト
コンパイラとリンカが動いて、実行形式プログラムが生成されても、これでプログラムが正しく動くとは限りません。
先ほどのプログラムを保存が完了したら、新しいプロジェクトを作ります。
メニューから「ファイル」→「新規作成」→「VCLフォームアプリケーション」を選ぶか、ツールバーから新規作成を選びます。
の中から、
を選びます。
すると、見慣れた新規作成のダイアログが出るので「VCLアプリケーションを選びます」。
新しいフォームが表示されるので、以下の画面の様にコンポーネントを配置します。
配置するものは「Edit」コンポーネント2つ、「Button」コンポーネント1つです。
Editコンポーネント二つのTextプロパティを数字の「0」に、
ButtonコンポーネントのCaptionプロパティを「足す」にします。
Buttonのイベントハンドラを記述します。Buttonコンポーネントをダブルクリックします。
ソース9をイベントハンドラに貼り付けます。
try ShowMessage(IntToStr(StrToInt(Edit1.Text) + StrToInt(Edit2.Text))); except //実行時例外の発生 ShowMessage ('計算が出来ません、エラーです。'); end;
ツールバーの中から、右の図の
を押します。
すると、コンパイルが始まります。
正常な計算結果
論理エラーが発生した例
この論理エラーはプログラム設計時に想定された入力が数値と仮定していたものの、実際には数値ではなく、文字列が入力された事によって生じます。例示したものは単純ではありますが、このような事は実際に何かを作ってみると、よくある事で、細心の注意が必要です。今回は入力という見やすいものでしたが、これがインターフェースからは見えない内部的な処理だったりすると、とても厄介なものになります。
設計時エラーの例
今度は、設計時エラーを実践してみましょう。
ソース10を先ほどのイベントハンドラの記述と置き換えます。
try ShowMessage({IntToStr}(StrToInt(Edit1.Text) + StrToInt(Edit2.Text))); except //実行時例外の発生 Showmessage('計算が出来ません、エラーです。'); end;
そして、を押すと、ビルドが始まり、コンパイルの段階でエラーが表示される筈です。
「OK」を押すと、以下の様に31行目が赤く表示される筈です。
イタリック表示にしたところが、エラーの原因箇所です。(IDEではこの様に表示はされません)
ShowMessage({IntToStr}(StrToInt(Edit1.Text) + StrToInt(Edit2.Text)));
では、エラーを修正しましょう。
{IntToStr}の、グリーンの箇所を削除しましょう。
IntToStrとなる筈です。
出来たら、を押して、ビルドをして実行しましょう。今度は実行できたはずです。
先ほどのエラーの意味は「文字列を期待したのに、数値が入っていたので、実行できませんでした」というエラー結果でした。
「IntToStr」はInteger(数値)をString(文字列)に、
「StrToInt」は「String」(文字列)をInteger(数値)に変える、
基本中の基本の型変換になります。次章で詳しく説明するかと思います。
この一連の作業を「デバッグ」と呼び、論理エラーや設計時エラーを修正していく作業になります。ではもう一回、細かくデバッグをしていきましょう。