【delphi / c++builder starter チュートリアルシリーズ】 シーズン2 delphi の部...
TRANSCRIPT
© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential.
第 4回‟Function と Procedure ( 関数と手続き)„
シーズン 2 :プログラミング言語をやさしく覚えよう
DELPHI の部
2© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
Delphi / C++Builder Starter チュートリアルシリーズ
シーズン 2 : 2017 年 1 月 23 日 ~ 3 月 27 日 全 9 回
時間 :毎週 月曜 17 時 00 分 ~17 時 50 分 Delphi 17 時 00 分 ~17 時 20 分 / C++Builder 17 時 30 分 ~17 時 50 分
ねらい :プログラミング言語をやさしく覚えようシーズン 2
第 1 回2017 年 1 月 23
日 シューティングゲームのプログラム第 2 回 1 月 30 日 変数と 型第 3 回 2 月 6 日 条件 とループ第 4 回 2 月 13 日 function と procedure ( 関数と手続き)第 5 回 2 月 20 日 配列 と レコード第 6 回 2 月 27 日 文字列 と オブジェクト第 7 回 3 月 6 日 オブジェクト指向第 8 回 3 月 13 日 作ってみよう(仮)第 9 回 3 月 27 日 コミュニティ と 勉強会
セミナー情報 : 下記の Web サイトhttp://forms.embarcadero.com/starter-tutorial-webinar
3© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
第 4 回 「 function と procedure ( 関数と手続き)」
今日のねらい• 関数と手続きを知る• 関数と手続きの書き方
実施内容• function と procedure の違い• 宣言と実装• 使い方、関連するキーワード
4© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
無料版 Delphi 10.1 Berlin Starter Edition 入手方法
• シリアルキーを知らせるメール内にも再ダウンロードリンク有• ダウンロード、インストール参考ブログ: https://goo.gl/CCBNdx
エンバWeb 製品 Delphi Starter
バナー 登録 Get
無料で使える開発環境をダウンロード
EDN* に登録済の方は EDN アカウントでダウンロード可
登録完了後、自動でインストーラーのダウンロード開始
インストール時にシリアルキーを入力
登録時のメールアドレスにシリアルキーが配信される
5© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
function( 関数 ) と procedure( 手続き ) 名前(識別子)を付けて処理を実装しておき、その名前で呼び出せる
• function : 関数。戻り値がある
• procedure : 手続き。戻り値がない
• ルーチンという名称でひとくくりにすることもある
宣言の後には [ ; ] ( セミコロン ) 関数、手続きにデータを渡すには引数 として受け渡す
処理の実装部はルーチンの名称、パラメーター等の記述の後、
begin で始まり end で終わる
6© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
implementation 部での実装方法 パラメーターがないときにパラメーターの記載のための ( ) は省略可
function の戻り値は Result に代入procedure ルーチン識別子 ( パラメーターの識別子 : パラメーターのデータ型 ); // [;] を忘れずにbegin ShowMessage(str); // 処理実装end;
procedure ルーチン識別子 ; // パラメーターがなければ ( かっこ ) 省略可begin // 処理実装end;
function ルーチン識別子 ( パラメーターの識別子 : パラメーターのデータ型 ): 戻り値のデータ型 ; begin// 戻り値がある function は Result に戻り値を代入 Result := 戻り値 // または関数名(ルーチン識別子)に戻り値を入れるend;
7© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
function と Procedure の 実装コード例 コード例procedure myShowProcedure(str: String); // 渡された文字列を表示する Procedurebegin ShowMessage(str);end;
procedure Hello; // パラメータが必要なければ ( ) は省略可begin ShowMessage('Hello delphi world');end;
function myIncFunction(I: Integer): Integer; // 戻り値がある場合には functionbegin // パラメータ変数はは処理内で変数として使用可能 Result := I + 1; // 戻り値は Result に代入 // myIncFunction := I + 1; のように関数名に代入しても戻り値として返すend;
8© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
ルーチンを呼出し順序を解決する「前方宣言」 先に記述されているルーチンから、より後ろに記載されているルーチンを呼び出せません
forward キーワードを付け、先に宣言しておき解決します
他ユニットから参照されて良い場合には Interface 部で宣言してもよい
procedure SayHi; forward; //forward で実際の処理を記載せずに先に宣言のみ
procedure SayHiHi;begin SayHi; //forward キーワードで宣言しているため呼び出し可能 SayHi;end;
procedure SayHi; //forward で実装を先送りにしてるルーチンの処理をここで記載begin ShowMessage(‘ はい’ );end;
9© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
クラス内に宣言されているルーチン「メソッド」 ※ 「クラス」の詳しくはオブジェクト指向のセッションで説明
Type宣言で TForm1 にくっついているイベントハンドラもメソッドの一つ
procedure TForm1.Button1Click(Sender: TObject);begin //Tform 内の Onclick メソッド における処理実装を記述end;
type // ブロックのクラス内で先にルーチンの宣言を行っておくクラス名 = class( 継承クラス )procedure ルーチン識別子 ( パラメーター : パラメータのデータ型 ); // 定義内でメソッド宣言のみ// 省略end;
procedure クラス名 . ルーチン名 ( パラメーター : パラメータのデータ型 ); // メソッドの実装begin // 省略end;
10© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
自らのルーチンを呼び出すことが可能
自らを呼び出すルーチン。「再起関数」と呼ばれる
ループの代わりに使用したり、フォルダ階層の読み取りなどに使用
function Ruijyou(Base, Exp: Integer): Integer; //Base の Exp 累乗を求める再起関数begin if Exp = 0 then Result := 1 // else Result := Base * Ruijyou(Base, Exp - 1); // 累乗数を減らして自らの関数を呼び出しend;
Ruijyou(3, 3): Integer; // 戻り値は 27
11© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
ルーチンの処理をその場で終了しルーチンを出る「 Exit 」
ループ処理で必要な情報を見つけたときなどにその場でルーチンを終了できる
procedure なら Exit; で ルーチンを出る
function なら Exit( 戻り値 ); で戻り値を指定して出る
//String に ‘ A’ が含まれているかチェックする関数function CheckIncludeA(str: String): Boolean;var ch: Char;begin for ch in str do begin if ch = 'A' then Exit(True); //A を見つけたら戻り値 True で Exit end; Result := False;end;
12© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
パラメータ と戻り値 ルーチンのパラメータと戻り値には定義されているデータ型と一致するデータを渡す
(変数における代入と同じ)
ルーチン使用時の引数(パラメータ)には式を使用可能
function DoubleValue(iNum: Integer): Integer;begin Result := iNum * 2;end;
procedure TForm1.Button1Click(Sender: TObject);vari : Integer;begin i := DoubleValue(8-1); //式の結果、整数値なのでこれは定義と合致 i := DoubleValue(10.2); // 小数点の実数は定義の整数型と異なるので、これはエラーend;
13© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
パラメータのデータ・変数の受け渡しについて ルーチンでパラメータにデータを渡す方法は「値渡し」と「参照渡し」がある
デフォルトでは値渡し• ルーチンの引数として呼び出し元でセットした変数は、呼び出し先のルーチン処理によって変更され
ない
• 呼び出し先のルーチンでは引数は新たにコピーしてから使用される
var キーワードを使用することによって参照渡しができる• ルーチンの引数として呼び出しもとでセットした変数を、呼び出し先のルーチン内の処理によって変
更できる
パラメータの値渡しは、変数内の値だけを渡して、別途利用されるイメージ。参照渡しは、
変数の入れ物ごと渡して変数に対して処理できるイメージ
(例外)参照型と呼ばれる classなどのオブジェクトは値渡しではない
14© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
パラメータのデータ・変数の受け渡しについて(2)
procedure MyNameInput(var str: String); // 参照渡しの var キーワード begin str := ‘Kaz Aiso’; // 参照渡しなので、呼び出し元の変数に値を代入するのと同じ end;
procedure TForm1.Button1Click(Sender: TObject); var myStr: string; begin MyNameInput(myStr); // 呼び出しルーチンに値を代入してもらう ShowMessage(myStr); // 参照渡しなので、変数に呼び出しルーチン先で文字列が入れられている end;
参照渡しのコード例
15© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
関数のオーバーロード 同じルーチン識別子でパラメータ(と戻り値)の異なるルーチンを複数宣言・実装できる
ルーチン宣言の後にoverload;キーワードを記述
パラメータに設定されたデータ型と、呼び出しの際の引数の型で判断して実行される
例 AddFunc(10.1, 1.1); //浮動小数点の引数で下記関数を呼ぶと、2つ目の関数が実行される
function AddFunc(A, B: Integer): Integer; overload; //整数値と整数値のパラメータbegin Result := A + B;end;
function AddFunc(A, B: Single): Single; overload; //浮動小数点と浮動小数点のパラメータbegin Result := A + B;end;
function AddFunc(A, B: Char): String; overload; // 文字型と文字型のパラメータbegin Result := A + B;end;
16© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
デフォルトパラメータ ルーチンのパラメーターにデフォルト値をあらかじめ設定可能
ルーチン呼び出し時に、デフォルト値をもつパラメータは省略可能
デフォルト値は const か値渡し。かつパラメーターリストの後ろにまとめるprocedure MyLogShow(str: string; dt: TDateTime = 0); {TDateTime で宣言されている第2パラメータにデフォルト値 }var dtTemp: TDateTime;begin if dt = 0 then dtTemp := Now // 第2パラメータが省略されていたら、現在時刻を代入 else dtTemp := dt; // 第 2 パラメータの指定があれば、指定された日時の値を代入 ShowMessage(DateTimeToStr(dtTemp) + ': ' + str);end;
procedure TForm1.Button1Click(Sender: TObject);begin MyLogShow(‘ ログ’ ); // 第 2 パラメータはデフォルト値が設定されているので省略可能 MyLogShow(‘ ログ’ , now);end;
17© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
他、関連する機能など
インライン化 (inline 指令 )• コンパイル時に関数を、当該呼び出し箇所にインライン化
• http://docwiki.embarcadero.com/RADStudio/Berlin/ja/手続きと関数の呼び出し(Delphi)
手続き型• ルーチンを型として使用する
• http://docwiki.embarcadero.com/RADStudio/Berlin/ja/手続き型
外部宣言と DLL 読み込み• http://docwiki.embarcadero.com/RADStudio/Berlin/ja/手続きと関数(Delphi)• http://docwiki.embarcadero.com/RADStudio/Berlin/ja/ライブラリとパッケージ
18© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
本日のセミナー内容は弊社ブログに掲載予定
[ コミュニティ ] ↓
[ 日本人ブログ ]
実施内容の再視聴 皆さんが見ているWebページの下に、順次アップロード
エンバカデロWebサイト : http://forms.embarcadero.com/starter-tutorial-webinar [リソース ] – [イベント ]の「Delphi / C++Builder Starter チュートリアルシリーズ」ページ
実施内容サマリー
• Community embarcadero ( コミュニティ エンバカデロ )に Webリンク、サンプルコード情報等
http://community.embarcadero.com/
「エンバカデロ」で検索
19© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
次回の Delphi パートは2 月 20 日(月) 17:00 よ
り
“配列とレコード„ このあと
• リアルタイム放送限定 特別コンテンツ
• C++ パート