WebObjects プログラミング WebObjects4.5.1 Objective-C によるアプリケーション開発の基礎 -1- ご注意 (1 ) 本書はキヤノン株式会社が 1992 年に作成したテキストに基づいており、原文についての著作権は キヤノン株式会社にあります。 (2 ) 本書はキヤノン株式会社の了承をうけ、平手幸治が加筆修正しています。 (3 ) 本書は無償で配布することを条件に了承を受けています。販売はできません。 -2- オブジェクト指向 プログラミング -3- オブジェクト指向プログラミングとは? ・データのかたまり(変数)にそれを繰作する手続き(メソッド)を伴ったものをオブジ ェクトと呼んでいます。 ・オブジェクト内部の変数には、外部から直接アクセスすることはできません(カプセル 化 )。 ・オブジェクト外部からオブジェクトにアクセスするには、オブジェクトにメッセージを 送ります。 メッセージ 変数1 変数2 メソッド 1 { aaa; } メソッド 2 { aaa; } ・オブジェクトにメッセージが送られると、メッセージに対応するメソッドの 1 つが呼び 出され、処理を実行します。 ・どのメソッドも、オブジェクト内の変数にアクセスすることができます。 ・処理が終了すると、オブジェクトは結果を返します。 変数1 変数2 メソッド 1 を呼びだす メッセージ メソッド1 { } aaa; メソッド2 { 返り値 } aaa; 呼びだされた メソッド オブジェクト オブジェクト -4- ・オブジェクトは電子部品の IC と考える事ができます( Software-IC) 。 メッセージの送り手は、メソッドが実行した結果だけを考え、メソッド内部がどのような 仕組みで動作するのかを考える必要がありません。 テキストフィールドオブジェクト メッセージ setStringValue:@"Hello" テキスト setStringvalue: は、コロンの後の値を設定しなさいと いう意味の Objective-C 形式のメッセージです。 Hello ・オブジェクト指向プログラミングのアプリケーションは、このようなオブジェクトの集 まりです。オブジェクトがメッセージを送り合うことで処理が進行します。 ボタンオブジェクト データベース オブジェクト スライダーオブジェクト 12.5 グラフ描画オブジェクト 入力フィールド オブジェクト ・メッセージセンデイングは関数呼びだしとは異なり、メッセージとそれを受け取るオブ ジェクトの結合は、コンパイル時に決定しません。プログラムが実行している時にメッセ ージが送られてはじめて決定します(動的結合)。 オブジェクトの独立性が高い -5- オブジェクトの生成 ・オブジェクトを作るには、まず、クラスを定義します。 ・クラスには、オブジェクトが持つべき「変数の宣言」や「メソッドの宣言や定義」を記 述しておきます。 ・実行時にクラスにオブジェクトを作成させるためのメッセージを送る度に、クラスの記 述に基づいたオブジェクトが 1 つ作られます。こうしてできた個々のオブジェクトをイン スタンスと呼びます。 生成せよ スライダ スライダクラス ( 設計図 ) スライダのインスタンス ( 製品) ・ 1 つのクラスから、クラスの定義に基づいたインスタンスを幾つも作ることができます。 ・特に、インスタンスの持つ変数をインスタンス変数、メソッドをインスタンスメソッド と呼びます。 メッセージ インスタンス変数 変数1 生成せよ 変数2 メソッド1 { クラス } aaa; メソッド2 変数 1 の型宣言 { aaa; } 変数2の型宣言 変数1 変数2 メソッド1 { aaa; } メソッド2 メソッド1 { aaa; } メソッド 2 { aaa; } { } aaa; 変数1 変数2 インスタンスメソッド メソッド1 { クラス aaa; } メソッド2 { } aaa; インスタンス -6- クラスとインスタンス ・実は、クラスもまたクラスオブジェクトというオブジェクトです。オブジェクトにはク ラスオブジェクトとインスタンスの 2 種類があるのです。 生成せよ クラス 変数 1 の型宣言 変数2の型宣言 変数1 変数2 メソッド1 { aaa; } メソッド1 { 実行時に生成 } aaa; メソッド2 メソッド2 { aaa; } { } aaa; インスタンスメソッド + 生成せよ インスタンス { aaa; } クラスメソッド クラスオブジェクト コンパイル時に 生成 class.h ・ class.m ・ ・・・・・ ・ ・・・・・ ・ ・・・ ・ ・・・ ・・・ どちらもオブジェクト クラスを記述する ファイル クラスオブジェクトは、コンパイル時にファイルの記述から作られます。 インスタンスは、実行時にクラスオブジェクトから作られます。 ・クラスオブジェクトに働くメソッドをクラスメソッド、インスタンスのメソッドをイン スタンスメソッドと呼んで区別しています。 ・クラスメソッドもインスタンスメソッドもクラスに記述します。ただし、クラスにメッ セージを送ってインスタンスメソッドを呼びだす事はできません。 インスタンスを作成する為にクラスオブジェクトに送る「生成せよ」というメッセージは クラスメソッドに相当します。 -7- クラスの継承 .クラスの継承を利用して、作成済のクラスの詳細を知らなくとも、そのクラスを拡張、 変更することができます。 クラス A 生成せよ クラス B Object クラスを継承 クラス A を継承 変数 1 の型宣言 変数1 変数2 変数3 変数3の型宣言 メソッド1 変数2の型宣言 { メソッド1 { aaa; } aaa; } メソッド3 { aaa; } メソッド2 { aaa; } メソッド3 メソッド 2 { aaa; } { } 既存のクラス aaa; クラス B のインスタンス 新規に作成したクラス 生成せよ クラス C クラス A を継承 変数1 変数2 メソッド1 変数の宣言と メソッドの定義の 両方を継承する { aaa; } メソッド4 { aaa; } メソッド2 { aaa; } メソッド 4 { } aaa; クラス C のインスタンス 新規に作成したクラス ・例えば、クラス B を新規に作成し、ここに「クラス A を経承する」と宣言して置きま す。すると、クラス B から生成したインスタンスは、クラス B での記述だけでなく、維 承を宣言したクラス A の「インスタンス変数の宣言」と「メソッドの定義」の両方が使 用可能になるのです。これをクラスの継承といいます。 ・この継承関係を以下の様な図で表します。 全てのクラスは、NSObject クラスを根底とする階層をなしています。 クラス B 新規のクラス ( クラスB) を既存のクラスの NSObject クラス A クラス C スーパークラス サブクラス、 既存のクラス ( クラスA) を新規のクラスの スーパークラスと読んでいます。 サブクラス -8- ・クラスを階層化することにより、以下の利点があります。 −複雑なコードを分離して整理する。 NSObject SCSI ImageScanner CannonScanner SCSI 接続のスキャナのドライバで、 SCSI に関する部分とスキャナ固有の コードを別のクラスに分離し、メンテナンスを容易にする。 −クラスに共通なコードを−つにまとめることができる。 NSObject ImageScanner CannonScanner Printer DokokanoScanner SCSI SCSI 接続のスキャナのドライバで、デバイスに依らない SCSI クラスを 一度作っておくと、他のデバイス(例えば SCSI 接続のプリンタ)のため の再利用がし易い。 WebObjectsのAppIicationKitの例(一部) NSWindow NSObject NSResponder NSApplication NSView イベント処理 描画処理 ボタン NSControl NSButton NSText NSSlider 文字列処理 NSButton も NSText も、画面表示( View)されて、マウスやキーボードからのイベン トを受けつける(Responder)機能は、同じです。どちらも NSView と NSResponder を維承しています。 -9- メソッドの上書き ・スーパークラスにあるメソッドと同じ名前のメソッドをサブクラスに定義した場合、サ ブクラスのメソッドの方が有効になります。これを上書き(オーバーライド)するとい います。 クラス A Object ク ラ ス を 継 承 クラス D 生成せよ クラス D のインスタンス クラス A を 継 承 変数1 変数2 変数 1 の型宣言 変数2の型宣言 メソッド1 { aaa; メソッド1 { aaa; } メソッド 2 { a = 90; } メソッド 2 { a = 1; } } メソッド2 { a = 90; } ク ラ ス D で定義しているインスタンスメソッド ※インスタンス変数は、上書きできません。 - 10 - Objective-C - 11 - Objective-Cについて ・ Objective-C は、 C 言語にオブジェクト指向プログラミングのスタイルを取り込んだ、 ANSI-C のスーパーセットです。 ・ WebObjects の C コンパイラは、Objective -C と ANSI-C、C++を混合したコードをコン パイルすることができます(ただし、C++のクラスライブラリはバンドルしていません)。 ・ WebObjects のコンパイラでは、文字列、注釈に日本語が使用できます。 ・ヘッダファイル等は、下記のディレクトリに納められています。 /Apple/Library/Frameworks/ - 12 - id型 ・個々のインスタンスは、インスタンス識別子(1d)によって識別します。 ・どのインスタンスにメッセージを送るかは、id で指定します。 ・ id を代入する変数の宣言として、 1d 型が追加されています。C 言語の他のデータ型 (int, float など)と同様に扱うことができます。 例 id myObject; id infoData, SelectedCell; ・ id 型の変数は、いかなるクラスのインスタンスの id も代入することができます。 ・インスタンスにメッセージを送るには、メッセージを送りたいインスタンスの id を 知る必要があります。 id 変数1 ※ どの id も代入されていない時 は、 nil( ヌルオブジェクトポイ ンタ ) = (id) 0 になります。 変数2 メソッド1 id { } 変数1 aaa; メソッド2 { 変数2 aaa; } メソッド1 { } aaa; メソッド2 { id aaa; } 変数1 変数2 ? インスタンスにメッセージを送るに は、相手のインスタンスのid が必要 メソッド1 { } aaa; メソッド2 { } aaa; メッセージ データ型一覧表 id インスタンス識別子(インスタンス)データ構造体へのポインタ) Class クラス(クラスデータ構造体へのポインタ) SEL メソッドのセレクタ識別子( =unsignedint) 例 SEL method; method=@selectoe( moveTo::) ; STR 文字列( = c h a r *) IMP id を返すメソッドインプリメンテーションへのポインタ BOOL 論理値( YES または NO) - 13 - メッセージ式 ・オブジェクトにメッセージを送るためにメッセージ式を使用します。 reply = [object message] ・オブジェクト(object)にメッセージ(message)が送られ、 処理後、返り値(reply)が返されます。 ・Object(レシーバ)は、 クラスに送る場合は、 クラス名、 インスタンスに送る場合は、id 型の変数です。 (id)object 変数には、 受信インスタンスの id が 代入されている。 id 変数1 変数2 メソッド1 { } message aaa; メソッド2 { aaa; } 受信インスタンス 処理が終わると、 インスタンスからの 返り値が返される。 id object ; reply = [object message]; 送信インスタンス ・ C 関数の書けるところであればどこでも、メッセージ式も使用できます。 例 val = [textField floatValue]; //関数と同じ様に使用できる flag = checkmax(val); if(flag < 0) { flag = 0.0; } - 14 - メッセージ ・メッセージは、頭文字が小文字で始る英数字の文字列です。メッセージを送ると、対 応するメソッドが呼び出されます。 例 char *rep; rep = [instance filenmae]; filename メッセージを送ると、対応する fllename メソッドが呼び出され ます。 ・引数を伴ったメッセージは、引数の数だけコロンが付いています。 例 [instance setFloltValue:32.5]; [instance moveTo:22.0 :30.4]; 「moveTo:22.0 :30.4」メッセージを送ると、対応する moveTo::メソッド が呼び出されます。コロンもメソッド名の一部です。 ・引数が 2 つ以上あるメッセージで、各コロンの前にメッセージが分かれて付いているメ ッセージもあります。 例 [instance setStringVa1u:@"Welcome" at:3]; 「setStringValue:at:」で一つのメソッドです。SetStringValue:と at:を 分けて考える事はできません。 ・リファレンスマニュアル(/Apple/Documentation/Developer )には以下の様に記述されて います。 - (float)getParameter:(int)aArgument 返り値の宣言 引数の型宣言 float rep; rep = [ins getParameter:123]; 上記のメソッドを呼び出す為のメッセージ送信例 +は、クラスメソッド −は、インスタンスメソッド - 15 - クラスの定義 ・クラスは、クラス名をファイル名とした 1 対のファイルで記述されます。 クラス名 .h インタフエースファイル クラス名 .m インプリメンテーションファイル ※クラス名の頭文字は大文字にして下さい。日本語は使用できません。 インタフエースファイル(クラス名.h) #import <AppKit/AppKit.h> @interface クラス名:スーパークラス名 { インスタンス変数の宣言; } +クラスメソッドの宣言; -インスタンスメソッドの宣言: @end インプリメンテーションファイル(クラス名.h) #import クラス名.h @implementation クラス名 + クラスメソッドの定義 { /* コード */ return self; } - インスタンスメソッドの定義 { /* コード */ return self; } @end #import は、#include と同じ機能を持ちます。ただし、入れ子でファイルを読み込んだ 際に#import は同じファイル名のファイルを 2 回以上読み込みません。 通常、クラスの使用者には、インターフェースファイルは公開し、インプリメンテーシ ョンファイルは公開しません。 - 16 - インスタンス変数の宣言 ・インタフエースファイルの{ }内で宣言した変数は、インスタンス変数です。 ・ここで宣言された変数は、インスタンス生成時にそのインスタンス内に確保されます。 そのインスタンスが消滅するまで、解放されません。 例 @interface Class:SuperClass { char str[256]; int length; id anObject; } ※変数名の頭文字は小文字にして下さい。 日本語は使用できません。 @end ・インスタンス変数は、そのインスタンス内のどのインスタンスメソッドからでもアクセ スする事ができますが、そのインスタンスの外部からは直接参照できません。 (変数のスコープは、インスタンス内) ・インスタンス変数は、上書きできません。スーパークラスのインスタンス変数と同じ変 数名の変数を宣言するとエラーになります。 - 17 - メソッドの宣言と定義 メソッドの宣言 ・インタフエースファイル( .h)の{ }の外に宣言を記述します。 (関数のプロトタイプ宣言と同じ役割があります)、 @interface Class:SuperClass { ・・・・・・ } - (char *) fi1ename; ※行未のセミコロン()を忘れない様に。 ; - moveTo:(float)x :(float)y; - setStringValue:(const char *)str at:(int)num; @end ・クラスメソッドは、 メソッド名の前に + を付けます。 インスタンスメソッドは、メソッド名の前に - を付けます。 ・スーパークラスに同じ名前のメソッド名があった場合は、上書き(オーバーライド)に なり、サブクラスの定義の方が有効です。 メソッドの定義 ・インプリメンテーションファイル(.m)に定義を記述します。 ・メソッドの定義は、関数の定義に非常によく似ています。 ({ }内は、C 関数と同じ記述です) @implementation Class - (chae *)filename ※メソッド名および各部分の頭文字は { 小文字にして下さい。 ・・・ 日本語は使用できません。 return name; } @end 返り値(return)の型は、メソッド名の前に( )で囲んで宣言します。 ※型宣言を省略すると id 型となります(ANSI-C では int 型)。 上記のメソッドを呼び出すメッセージ例 char *rep; rep = [instance filename]; - 18 - ・引数を伴ったメソッドは、引数の数だけコロンを付けます。コロンの直後に引き数の型 を( )を付けて宣言します。 - setFloatValue:(float)value { ・・・ return self; } - moveTo:(float)x :(float)y { ・・・ return self; } ※コロンもメソッド名の−部です。 ・上記のメソッド名は、 moveTo::といいます。 上記のメソッドを呼び出すメッセージ例 [instance setFloatValue:32.5]; [instance moveTo:22.0 :30.4]; ・引数が 2 つ以上ある時は、各コロンの前にメソッド名を分割して付けることができま す。 - setStrringValue:(NSString *)str at:(int num) { ・・・ return self; } 上記のメソッドを呼び出すメッセージ例 [instance setstringValue:@"Welcome" at:3]; ※コロンもメソッド名の一部です。 上記のメソッド名は、setStringValue:at:といいます。 - 19 - インスタンスの生成 ・クラスに alloc メッセージを送るとそのクラスのインスタンスを生成します。(インスタ ンスをメモリ上に割り付ける) #import "Class.h" ※使用するクラスのインタフエースファイル( .h )が 必要です。 id instance; instance = [Class alloc]; ・インスタンスは、使用する前に初期化をする必要があります。インスタンスに init メッ セージを送るとそのインスタンスを初期化します。 [instance init]; ・以下の様に入れ子状にした書き方もできます。 #import "Class.h" id instance; instance = [[Class alloc] init]; ・ init は、クラスによって異なります。どのような init メソッドを使用するかは各クラス のリファレンスマニュアルを参照して下さい。 例 image = [[NSImage alloc] initSize:&size]; View = [[View alloc] initWithFram:&rect]; Window = [[Window alloc] initWithContentRect:・・・・・・]; ・インスタンスの生成には alloc, init の代わりにクラス固有のメソッドを使用するクラス もあります。特に一時的なインスタンスを生成する場合に使用します。 例 string = [NSString stringWithCString:cString] - 20 - インスタンスとメモリ ・インスタンスは、実行時に alloc によって生成される時、動的にメモリが割り当てられ ます。 ・インスタンスが不要になったら、メモリを解放しなければなりません。不要になったイ ンスタンスが残ってしまうと様々なエラーの原因となります。 ・インスタンスに release を送ると、そのインスタンスが確保していたメモリ領域が解放 され、インスタンスは消滅します。 [instance release]; ・この部分の記述は厳密には正しくありません。作成したインスタンスがプログラムの他の部 分や分散オブジェクト、マルチスレッドなどによりいくつかのオブジェクトから参照されるこ とがあるため、いくつのオブジェクトから参照されているかを覚えておき(リファレンスカウ ンタといいます)、参照しているオブジェクトが無くなったときにインスタンスを削除するよ うになっているからです。 ・ release はリファレンスカウンタの値を 1 減らすという動作をし、リファレンスカウンタの値 が 0 になったときインスタンスが解放されます。インスタンスを作成したオブジェクトだけが 使用するならば、大まかに上の様に考えても問題ありません。 ・一時的に使用するインスタンス( alloc 以外を使って作る物)については自動的に削除されま すので、release を送る必要はありません。 詳細は、オンラインマニュアルや Objective-C の言語マニュアルをご覧ください。 - 21 - Self ・ Self は、インスタンスの自分自身の id が自動的に代入されている id 型のインスタンス 変数です(全てのインスタンスが持っています)。 ・同じインスタンス内のメソッドを呼び出したい場合、レシーバに self を使います。 - find:(char *)word { if([self compare:test with:word]) { ・・・・ } ・・・・ } - (BOOL)compare:(char *)str1 with:(char *)str2 { ・・・・ if(・・・・) return NO; ・・・・ return YES; } 変数1 同じインスタンス内の メソッドを呼び出す際に、 self を使用する。 変数2 メソッド1 { aaa; } メソッド2 { aaa; } ・特に返すべき返り値がない場合は、Self を返して下さい。 ・ Self を YES の意味に使用するメソッドもあります。 return self; (= return YES;) ≠ 0 return ni1; (= return NO;) = 0 - 22 - Super ・レシーバに super を指定する事により、サブクラスで上書きされたスーパークラスのメ ソッドを呼び出すことができます。 ・メソッドの機能を(置き換えでなく)追加したい時に使用します。 スーパークラス - setData:(float)value { ・・・・ content = value; return self; } そのサブクラス - setData:(float)value { ・・・・ //追加機能 if(value < 10.0) return nil; //追加機能 [super setData:value]; //スーパークラスの return self; メソッドが呼びだされる。 } ・インスタンス変数の初期化ルーチンで良く利用されます。 ・ init は、インスタンスが生成されて、最初に、1 度だけ送られてくるメッセージです。 これを上書きして独自の初期化ルーチンを書くことができます。 - init { [super init]; //本来の初期化ルーチンを呼びだす comtent = 0; //独自の初期化ルーチンの追加 return self; } - 23 - Application Kitの基礎 - 24 - ApplicationKitについて ・ ApplicationKit は、WebObjects のユーザインタフエースの構築に必要なほとんどのコー ドが記述された高機能なライブラリです。 ・オブジェクト指向プログラミング言語の Objective- C のクラスライブラリとして記述さ れています。ボタンやスライダ、ウィンドウなどがオブジェクトとして扱えます。 .ボタンやウィンドウといった基本的な部品だけでなく、セーブ・オープンパネルやス クロール、印刷、ドラッグ&ドロップといった高機能な部品もサポートしています。 ・ ApplicationKit のオブジェクトにカスタムオブジェクト(プログラマが新たに作成した オブジェクト)を追加する形でプログラミングします。 アプリケーション カスタム オブジェクト メッセージ ボタン オブジェクト 描画オブジェクト 12.5 テキストフィールド オブジェクト クリック スライダオブジェクト Application Kit マウス ・ ApplicationKit を使用する事により、プログラマはアプリケーション間でユーザインタ フェースの統一が図れます。 - 25 - ApplicaitonKitのクラス NSObject NSCell NSColor NSColorList NSColorPicker NSCursor NSDataLink NSDataLinkManager NSDPSContext NSEvent NSFileWrapper NSFont NSFontManager NSHelpManager NSImage NSImageRep NSInputManager NSInputServer NSLayoutManger NSMenu NSMenuItem NSParagraphStyle NSPasteBoard NSPrintInfo NSPrintOparation NSPrinter NSResponder NSRulerMarker NSScreen NSSelection NSSpellCheker NSSpellServer NSTableColumn NSTextAttachment NSTextContainer NSTextTab NSWorkSpace NSMutableAttributedString NSActionCell NSBrowserCell NSImageCell NSTextAttachmentCell NSButtonCell NSFormCell NSSliderCell NSTextFieldCell NSDPSServerContext NSComboBoxCell NSSecureTextFieldCell NSTableHeaderCell NSBitmapImageRep NSCachedImageRep NSCoustomImageRep NSEPSImageRep NSMutableParagraphStyle NSApprication NSWindow NSVire NSTextStorage NSPanel NSBox NSClipView NSRulerView NSScrollView NSSplitView NSTableHeaderView NSText NSControl NSBrowser NSButton NSColorWell NSImageView NSMatrix NSScroller NSSlider NSTableView NSTextField NSColorPanel NSDataLinkPanel NSFontPanel NSPageLayout NSPrintPanel NSSavePanel NSOpenPanel NSCStringText NSTextView NSPopUpButton NSForm NSComboBox NSSecureTextField ・ ApplicationKit を使用する為には、以下のインタフエースファイル(.h)が必要です。 #import <AppKit/AppKit.h> ・各クラスの詳細は、オンラインクラスリファレンスマニュアルを参照して下さい。 - 26 - NSApplicationクラス ・ WebObjects のアプリケーションは、ユーザのマウスやキーボードの操作(ユーザアク ション)によって駆動するイベント駆動型のアプリケーションです(イベントが来るま でアプリケーションは待機している)。 ・ NSAp1ication クラスのインスタンス(NSApplication)は、ウィンドウサーバからイベン トを受け取り、適切なオブジェクトにイベントを配布します。これを処理するメインイ ベントループが、NSApplication クラスに既に記述されています。 ・ NSApplication を 1 つだけ持つ事により、アプリケーションとウィンドウサーバとのコ ネクションを確立し、アプリケーションの実行に必要な環境を整備し、イベント駆動型 アプリケーションを構成します。 アクション メッセージ ※すべての WebObjects アプリケーションは、 NSApp(NSApplication クラスのインスタンス ) を1 つ持ちます。 ボタン オブジェクト 12.5 スライダオブジェクト テキストフィールド オブジェクト イベント メッセージ NSApp Application Kit NSApp (NSApplicationクラスの インスタンス ) ウインドウサーバ ユーザーアクション マウス NSApplication クラスの主な機能 −アプリケーションを WindowServer と接続し 、アプリケーションの実行環境を整えます 。 −イベントを処理します(メインイベントループの管理 )。 −アプリケーション内の Window を管理します。 −アプリケーション全体に関する情報を管理します。 − InterfaceBuilder の生成するインタフエースファイル(nib)を解釈、実行します。 - 27 - インスタンスの生成 ・ NSApplication クラスのインスタンスを生成するには、Application クラスに sharedApplication を送ります。 [NSApplication sharedApplication ]; ・このインスタンスの id は、グローバル変数 NSApp に自動的に格納されます。 イベント処理 ・イベントループが動いている間だけ、イベントは処理されます。 ・ NSApp に run を送ると、メインイベントループを開姑します(メインイベントループ が停止するまで、戻ってきません) 。 [NSApp run ]; ・ NSApp に temlnate:を送ると、メインイベントループを停止します。 [NSApp terminate:self] プログラム例 #import <Appkit/AppKit.h> void NSApplicationMain(int argc, char *argv[]) { [NSApplication sharedApplication]; //ウインドウサーバとの接続、環境設定 [NSBundle loadNibNamed:@"myMain" owner:app]; //nibファイルをロードします [NSApp run]; //メインイベントループの開始 } - 28 - Windowクラス ・ Window クラスは、ウィンドウサーバと交信し、ウィンドウの生成、消去、移動、リサ イズ、クローズなどを行います。 ミニチュアライズボタン タイトルバー 最大化ボタン クローズボタン コンテントエリア ・ Window クラスのインスタンスの 1 つが、ウィンドウの 1 つに対応します。 ・ウィンドウのインスタンスにメッセージを送るということで、対応するウィンドウの生 成、消去、移動、リサイズ、クローズなどの操作を行います。 ウィンドウに対する操作 メソッドの例 - setTitle:(NSString *)aString ウィンドウのタイトルバーに表示される文字列を aString にします。 - orderFront:sender ウィンドウをスクリーンリストの先頭に移動します。 (手前に表示されるということ) - makeKeyAndOrderFront: sender ウィンドウをスクリーンリストの先頭に移動して、キーウィンドウにします。 - oederOut:sender ウィンドウをスクリーンリストから削除します。 (画面から隠れるということ) スクリーンリストとは、画面に表示されるウィンドウの順番表です。 - 29 - Viewクラス ・ View クラスは、PostScript によるグラフィックスの描画をサポートします。 ・ビユーは目に見える(ディスプレイに表示される)オブジェクトです。画面に表示され るオブジェクトは、何らかの形で View の助けを借りています。 ・ビユーは、ディスプレイ上ではウィンドウ内の矩形として表され、この矩形内で PostScript のグラフィックスを描画します。 ・それぞれのビユーがそれぞれの座標系を持っています。 Y ビュー X PostScript 描画コード ビュー Y X PostScript 描画コード ・ View クラスは、Responder クラス(イベント処理が記述されたクラス)のサブクラスに なっている為に、イベント処理としても使用されます。 View の主な機能 −ディスプレイヘの表示、再表示 −プリンタヘの印刷のサポート −アイコンドラッグのサポート −マウスイベントの処理 −キーイベントの処理 −マウスカーソルの変更 - 30 - NSControlクラス ・ NSContml クラスは、直接インスタンスを作って使うクラスではありません。サブクラ スを定義して継承して使います(抽象クラス) 。 Control クラスには、以下のサブクラスがあります。 Button ボタン Slider スライダ TextField テキストフィールド NSColorWell カラーウェル NSBrowser ブラウザー コントロールの 2 つの主な機能 1)コントロールオブジェクトは、ユーザがマウスやキーボードで直接変更できる値を持 っています。プログラムからもこの値を読み出したり、設定したりできます。ユーザと プログラムとの間でデータの受け渡しをさせる為に使用します。 クラス 値の種類 ユーザの値の変更方法 Button 0 または 1 ボタンのクリック(トグル) Slider 数値 ノブの移動(ドラッグ) TextField 数値、文字 キーボードからの入力 NSColorWell NSColor 型 色の変更(カラーパネルからのドラッグ) 2)コントロールは、ユーザにクリックやドラッグなどされると、オブジェクトにメッセ ージを送る様に設定できます(ターゲット・アクション ) 。ユーザの操作によってプロ グラムを起動させるプログラム作成に便利です。 クラス メッセージを送信するユーザアクション Button ボタンのクリック Slider ノブの移動 Textfield リターンキーの入力 NSCllorWell 色の変更(カラーパネルからのドラッグ) ユーザアクション クリック ドラッグなど 2) ユーザーにクリックやドラッグなどをされると、 他のオブジェクトにメッセージを送る。 ターゲット コントロール アクションメッセージ 値 1) 「値」を保持し、ユーザとプログラムの間で データを受け渡しする。 - 31 - 1)値 ・ユーザーは、コントロールの値を画面上で直接確認でき、直接変更することができます。 テキストフィールド スライダ 値: 0.2 値: " テキスト " 値: 0.5 値: "Hello" ・プログラムからは以下のメソッドでコントロールの値の設定、読みだしができます。 値の設定 - setFloatValue:(float)aFloat - setDoubleValue:(double)aDouble - setIntValue:(int)anInt - setStringValue:(NSString)aString - setColor:(NSColor)color //カラーウェルのみ 値の読みだし - (float)floatValue - (double)doubleValue - (int)intValue - (NSString *)stringValue - (NSColor)color //カラーウェルのみ 詳細は、ControI クラスのクラスリファレンスマニュアルをご寛下さい。 例 スライダの値の読みだし スライダ floatvar; floatValue メ ッ セ ー ジ var = [slider floatValue]; 返 り 値 : 0.5 ・設定した値は、ただちにコントロールに反映されます。 テキストフィールド スライダ setFloatValue:0.2 メッセージ [slider setFloatValue:0.2] setStringValue:@"Hello" メッセージ [textField setStringValue:@"Hello"] - 32 - 2)ターゲット・アクション ・コントロールは、ユーザのクリックやドラッグ(ユーザアクション)により、あらかじ め設定しておいたオブジェクト(ターゲットオブジェクト)にあらかじめ設定しておい たメッセージ(アクションメッセージ)を送ります。 ターゲット オブジェクト ユーザアクション クリック ドラッグなど コントロール id target; SEL action; アクションメッセージ ・アクションメッセージは以下の形をしています。 - actionMethod:sender ・(id )sender には、アクションメッセージを送信してきたコントロールの id が代入されて います。これを使ってメッセージを送ってきたコントロールに問い合わせることができ ます。 この変数にはスライダーの id が代入されている スライダ 値 :0.2 setValue:self 値 :0.5 floatValue - setValue:sender { float v; v = [sender floatValue]; ・・・ return self; } 返り値 :0.5 ・ターゲットとして別のコントロールを指定し、アクションとして以下のメソッドを設定 すると、コントロールの値を別のコントロールに設定してくれます。 - takeFloatValueFrom:sender - takeDoubleValueFrom:sender - takeIntValueFrom:sender - takeStringValueFrom:sender - 33 - Foundation Kitの基礎 - 34 - FoundationKitのクラス NSObject NSProxy NSArray NSAssertionHandler NSAttributedString NSAutoreleasePool NSBundle NSCharacterSet NSCoder NSConditionLock NSConnection NSData NSDate NSDecimalNumberHandler NSDeserializer NSDictionary NSDistributedLock NSEnumerator NSException NSFileHandle NSFileManager NSFormatter NSHost NSInvocation NSLock NSMethodSignature NSNotification NSNotificationCenter NSNotificationQueue NSPipe NSPPL NSPort NSPortMessage NSPortNameServer NSPosixFileDescriptor NSProcessInfo NSProtocolChecker NSRecursiveLock NSRunLoop NSScanner NSSerializer NSSet NSString NSTask NSThread NSTimer NSTimeZone NSUserDefaults NSValue NSMutableArray NSMutableAttributerString NSMutableCharacterSet NSArchiver NSUnarchiver NSPortCoder NSMutableData NSCalendarDate NSMutableDictionary NSDirectoryEnumerator NSDateFormater NSNumberFormatter NSMutableSet NSMutableString NSCountedSet NSTimeZoneDetail NSNumber NSDecimalNumber NSDistantObject - 35 -
© Copyright 2024 ExpyDoc