【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部...

23
© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. 第6第 ‟ 第第第 第 第第第第第第„ 第第第第 2 ププププププププププププププププププ DELPHI 第第

Transcript of 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部...

Page 1: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential.

第 6 回‟ 文字列 と オブジェクト„

シーズン 2 :プログラミング言語をやさしく覚えよう

DELPHI の部

Page 2: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

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 日 作ってみよう(1)第 9 回 3 月 27 日 作ってみよう(2)

セミナー情報 : 下記の Web サイトhttp://forms.embarcadero.com/starter-tutorial-webinar

Page 3: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

3© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

第 6 回 「文字列 と オブジェクト」

今日のねらい• 文字列を知る• 文字列の操作• クラスとオブジェクトの概略を知る

実施内容• 文字列の型• 文字列の代入とヘルパーについて• クラスとオブジェクトの意味を知る• クラスの定義とオブジェクトの宣言

Page 4: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

4© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

無料版 Delphi 10.1 Berlin Starter Edition 入手方法

エンバWeb 製品 Delphi Starter

バナー 登録 Get

無料で使える開発環境をダウンロード

EDN* に登録済の方は EDN アカウントでダウンロード可

登録完了後、自動でインストーラーのダウンロード開始

インストール時にシリアルキーを入力

登録時のメールアドレスにシリアルキーが配信される

• シリアルキーを知らせるメール内にも再ダウンロードリンク有• ダウンロード、インストール参考ブログ: https://goo.gl/CCBNdx

Page 5: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

5© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

文字と符号化 符号化

• コンピュータ上で文字を表すために、数値化する方式を定めたもの

文字コード• 符号化方式に沿って文字を数値化したもの

符号化方式:符号化方式は複数あり、 Delphiで使用する代表的なもの紹介• Shift_JIS : 日本環境で使用する文字を日本の規格( JIS )にのっとり符号化したもの

• UTF-8 : Unicode で定めている世界の文字群を、1バイト ~4バイトの可変長で符号化

• UTF-16 : Unicode で定めている世界の文字群を2バイトまたは4バイトで符号化

文字 Shift_JIS UTF-8 UTF-16

あ 82A0 E38182 3042

A 41 41 0041

⌘ - ( 未対応 ) E28C98 2318

Page 6: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

6© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

文字列 ( 型 ) 文字の集合を扱うためのデータ型

プログラム上で文字を表示したりデータベース上でデータとして格納してあったり…• String 型 ( = UnicodeString 型 )

• 最も一般的。 UTF-16 符号化形式のコードで文字列を格納する

• UTF8String 型• UTF-8 符号化形式のコードで文字列を格納する

• AnsiString 型• 日本語環境下ではデフォルトとして Shift_JIS 符号化のコードで文字列を格納する

• 各種指定の符号化(例: EUC-JP )などを設定することも可能

• UTF-8 型の符号化を指定することも可能。これが実際には UTF8String 型 の正体

• Char や AnsiChar• これらは文字単体のデータ型: Char は UTF-16, AnsiChar 日本語環境下のデフォルトで Shift_JIS 符号化コードを使用

Page 7: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

7© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

文字列型の代入(暗黙の変換) それぞれの文字列を相互に代入すると、可能な限り「文字」をキープする

• String 型 (UTF-16) <-> AnsiString 型 (Shift_JIS) • 変換しても同じ文字をキープする(文字コード変換が行われる)

• Unicode サポート文字で、 Shift JIS がサポートしていない文字の場合、 Shift_JIS側では対象文字が失われる

• String 型 <-> UTF8String 型 (UTF-8)• 変換しても同じ文字をキープする (文字コード変換が行われる)

• 文字コードが違えども Unicode 文字はサポートされているので、文字が失われることはない

• UTF8String 型 <-> AnsiString 型 (Shift_JIS) • 変換しても同じ文字をキープする(文字コード変換が行われる)

• Unicode サポート文字で、 Shift_JIS がサポートしていない文字の場合、 Shift_JIS 側では対象文字が失われる

• 単に ` ` でくくっただけの文字 ( 例 str := ‘ 文字’ ;)• UTF-16 (UnicodeString) 型の文字として扱われる ( 現行の Delphi では文字は UTF16 の Unicode 文字として扱う )• 代入変換は String 型と同じ

Page 8: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

8© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

文字列型の代入(コード例) 文字列相互代入の例

var sjis : AnsiString; utf16 : string; utf8 : UTF8String;begin sjis := ‘⌘ ’; //Shift_JIS にない文字なので文字化けする。 '??' に変換される utf16 := ‘⌘ ’; //Unicode サポート文字につき問題なく‘ ’が代入できる⌘ sjis := utf16; // Shift_JIS にない文字なので文字化けする。 '??' に変換される utf8 := utf16; //Unicode サポート文字につき問題なく代入できる sjis := ‘ 日本語’ ; //SJIS サポート範囲なので、問題なく‘日本語’が代入できる utf16 := sjis; //Unicode 文字はほぼ SJIS サポート文字を網羅しているので代入可能 utf8 := utf16: //Unicode サポート文字につき問題なく‘日本語’が代入できるend;

Page 9: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

9© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

文字列から文字単体へのアクセス 文字列の一つ一つにはインデックスでアクセス可能

先頭の文字のインデックスは Low(string)で取る

// 文字列の先頭インデックスと、インデックスを使って文字一つの要素にアクセスprocedure TForm1.Button1Click(Sender: TObject);var str: String; I : Integer;begin str := ‘Hello Delphi world’; I := Low(str); //Low(string) を使用すると先頭インデックスが返る ShowMessage(Str[I] + ‘ / Index:’ + I.ToString ); // インデックスを使ってアクセスend;

この例では先頭の文字インデックスは「 1 」先頭文字は H と表示されました

Page 10: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

10© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

文字列型の代入と連結 文字列の代入には代入演算子 := を使用可能

文字列の結合には + が使用可能

//演算子を使って文字列の代入と結合が可能procedure TForm1.Button1Click(Sender: TObject);var str1, str2: String;begin str1 := ‘Hello’; str2 := ‘Delphi’; str1 := str1 + str2; ShowMessage(Str1); // HelloDelphi と表示されるend;

Page 11: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

11© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

文字列のヘルパー 文字列操作に絶大な効力を発揮

• 一例を紹介

参考 docwiki: http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.SysUtils.TStringHelper_Methods

メソッド 説明

Copy 0 基準の指定された文字列を、コピーして返します。

Equals 指定された 2 つの 0 基準の文字列が同一かどうかを返します。

IsEmpty 0 基準の文字列が空(文字を含んでいない)かどうかを返します。

Replace それまでの文字または文字列を、新しく指定された文字または文字列で置換します。

Split この 0  基準の文字列をサブ文字列に、指定された Separator  を使用して分けます。

ToCharArray この 0  基準の文字列を TArray<Char> ( 1 文字配列)に変換し、それを返します。

ToUpper この 0 基準の文字列を、すべて大文字の文字列に変換して、それを返します。

Trim この 0 基準の文字列から、前後の空白を取り除き、文字群を制御します。

str := 'Happy Birthday Delphi!'; ShowMessage(UpperCase(str)); //UpperCase で大文字に変換

Page 12: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

12© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

Format 関数 設定した書式に基づいて、一連の因数を文字列化する関数

文字列に組み込む書式は %( パーセント文字)の後に設定

参考 Docwiki: http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.SysUtils.Format

//Format の構文Format(‘ 文字列および書式’ , [ 文字列に組みこむデータたちをカンマで区切って連ねる ]);

//Format はこんな感じで使えますvar str1, str2 : String; I : Integer;begin str1 := ‘雨’ ; I := 16; str2 := Format(‘明日の天気は %s 、気温は %d度になるでしょう’ ,[str1, I]); ShowMessage(str2);end;

Page 13: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

13© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

クラスとオブジェクト クラス・オブジェクトとは

• 任意のデータ型(フィールド)を保持できる

• データにアクセス、処理するルーチン(メソッド)を持つ

• 独自のフィールドとメソッドを保持するための、ひとかたまり(クラス)

データの隠蔽、クラスの継承ができる(隠蔽・継承は来週説明予定)• 他のユニットやクラスからフィールド・メソッドへのアクセス制限を行える

• 既存のクラスのフィールド・メソッドを保持しつつ、新しいフィールド・メソッドを追加した

新しいクラスを構築することができる

クラスとオブジェクトの関係• クラスとしてユーザー定義されたデータ型が「クラス」

• クラスの定義を使用するときの実体(インスタンス とも言います)が「オブジェクト」

• 今まで使用してきた「データ型」と「変数」の関係とほぼ同じ。 データ型を→ クラス ・変数→ オブジェクト

Page 14: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

14© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

クラスの定義とオブジェクトの宣言方法 type ブロックでクラスの定義

var ブロックでオブジェクトの識別子を宣言

• オブジェクトは「参照型」なので、この宣言では参照を保持する変数を確保したのみ

• 動的配列の SetLength 同様に「実体」(インスタンス)を作る必要がある

クラスは Create コンストラクタを使い、そのクラスの型のメモリを確保

オブジェクトに Create で確保した「実体」の参照(データの場所)を代入して使う

使い終わったオブジェクトは Free を使い、確保したメモリを解放してフリーにする

Page 15: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

15© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

クラスの定義とオブジェクトの宣言の構文(基本) クラス定義の構文 (基本)

• クラス定義の識別子は慣例的に接頭に T を使う ( TMyClass とか TMyForm) type //type ブロックでクラス定義を行う クラス定義識別子 = class //’class’ でクラスであることの定義を意味する フィールド識別子 : フィールドデータ型 ; // クラスで保持するデータ(フィールド)の定義 procedure メソッド識別子 ( パラメータ : パラメータデータ型 ); // クラスに紐づいたメソッド { クラス定義内ではメソッドも定義のみ。実装は implementation ブロックで行う } function メソッド識別子 ( パラメータ : パラメータデータ型 ): 戻りデータ型 ; end; // クラス定義も end; で締める

var //var ブロックでオブジェクトの識別子宣言を行う オブジェクト識別子 : クラス定義識別子 ; { ここではオブジェクトの参照を保存するための識別子を宣言したのみ }begin オブジェクト識別子 := クラス定義識別子 .Create; { これでクラスの実データ領域(インスタンス)を確保して、その参照をオブジェクト識別子に代入した } オブジェクト識別子 .Free; // これでオブジェクトのために確保したメモリを解放end;

Page 16: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

16© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

クラス定義とオブジェクト宣言、使用と解放のコード例 コード例type //type ブロックでクラス定義を行う TDate = class //Tdate というクラス定義識別子を、「 = class 」としてクラス定義 Year, Month, Day: Integer; // クラスで保持するデータ(フィールド)の定義 procedure SetValue(Y, M, D: Integer); // クラスに紐づいたメソッド { クラス定義内ではメソッドも定義のみ。実装は implementation ブロックで行う } function UruuDoshi: Boolean; end; // クラス定義も end; で締める

procedure TForm1.Button1Click(Sender: TObject);var //var ブロックでオブジェクトの識別子宣言を行う Birthday : TDate; { ここではオブジェクトの参照を保存するための識別子を宣言したのみ }begin Birthday := TDate.Create; { これでオブジェクトの実データ(インスタンス)を確保して、その参照をオブジェクト識別子に代入した } Birthday.SetValue(1995, 2, 14); if Birthday.UruuDoshi then ShowMessage(‘ うるうどしです ') else ShowMessage(‘ うるうどしではない’ ); Birthday.Free; // これでオブジェクトのために確保したメモリを解放end;

Page 17: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

17© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

クラスのメソッド実装例 実装例implementation //implementation ブロック{$R *.fmx}

procedure TDate.SetValue(Y, M, D: Integer); { クラス定義識別子 .( ドット ) メソッド定義識別子の形式で実装。 TDate クラス定義の SetValue メソッド実装という意味 }begin Year := Y; // メソッド実装内ではクラスの定義識別子なしでフィールドを使用可能 Month := M; Day := D;end;

function TDate.Uruudoshi: Boolean; { クラス定義識別子 .( ドット ) メソッド定義識別子の形式で実装。 TDate クラス定義の uruudoshi メソッド実装という意味 .戻り値型は Boolean}begin Result := IsLeapYear(Year); //System.SysUtils に入っているうるう年チェック関数end;

参考 SysUtils について: http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.SysUtils

Page 18: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

18© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

実は既にクラスは使用しています 自動的に作成されたフォームもクラス

追加しているボタンなどのコンポーネントもクラス

ボタンクリックなどのイベントハンドラもクラスに紐づいたメソッド

イベントハンドラの実装(ボタンクリック時の動作などのプログラム)もメソッドの実装

//マルチデバイスアプリケーションを作成すると自動的に作られている Form1 も、 TForm クラスを継承した TForm1 クラス識別子の定義type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { private 宣言 } public { public 宣言 } end;

Page 19: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

19© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

private, public , protected… 隠蔽と公開

private, public , protected キーワードとは何か?

• 他ユニット上からのフィールドやメソッドのアクセスを制限、公開するためのキーワード

• private → 他ユニットからは参照できず、アクセスもできない

• public → 他ユニットから参照、アクセス可能

• protected → 他ユニットからは使用できない、当クラスを継承するクラスで参照・アクセス可能

アクセス制限を行うと…

• 外部からフィールドをアクセスさせないことにより、直接参照されなくなる

• 将来的なコードの改変時に直接アクセスされない内部フィールドなどは、コード改変の影響が少ない

Page 20: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

20© 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/

「エンバカデロ」で検索

Page 21: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

21© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

第 6 回 「文字列 と オブジェクト」

今日のねらい• 文字列を知る• 文字列の操作• クラスとオブジェクトの概略を知る

実施内容• 文字列の型• 文字列の代入とヘルパーについて• クラスとオブジェクトの意味を知る• クラスの定義とオブジェクトの宣言

Page 22: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

22© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp

次回の Delphi パートは3 月 6 日(月) 17:00 よ

“オブジェクト指向 „ このあと

• リアルタイム放送限定 特別コンテンツ

• C++ パート

Page 23: 【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第6回 「文字列 と オブジェクト 」

23© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential.