CodeWarriorからCocoaへ2009/04/02 18:44

ベクターデザインにMacintoshのアプリケーションを登録してあります。
名称はListPrintです、名前からわかるとおり印刷ツールです。
最初はTHINK-Cで開発を始めて、
シマンテックのC++に書きかえて、最後はCodeWarrior版をアップしてあります。
年月を調べたらすでに10年も前の作品になってしまいました。

そこで同じものをCocoaで作成することにいたしました。
取りかかったのは、2009年3月13日からですが、これについて書こうと思います。

CodeWarrior版の紹介2009/04/02 22:05

ListPrint
先ずはCodeWarrior版の内容を紹介します。タブ切り替えのウィンドウを採用しております。

ListPrintはベクターデザインのサイトにフリーウェアーとして登録されています。
これは月にたった1本ですがいまだにダウンロードがあります。

Power MacintoshG3 DT2332009/04/02 23:46

私のメインマシンは「Power MacintoshG3 DT233」です。
CocoaはMacOS 10.0のとき、つまり最初にリリースされたときにDT233にインストールして少し触ってみました。
しかし、全く資料もないし、遅いし、まだ実験中のようなOSでした。
それ以来まったく見向きもしておりませんので初めてと言える状況です。

DT233でMacOS-Xでは無理があるのでマシンはMiniでOS-Xは10.4を使っています。
(現在はMacOS-X 10.5が最新ですので、ひとつ前のバージョンになるようです)
それでも基本的な部分は同じですから勉強には問題がないでしょう。

操作インターフェースは同じままにします、つまり同じものを作るです。
しかし、違うOSなので細かい部分は修正・変更が必要にはなります。

Cocoa版の仕様紹介2009/04/03 18:57

昔はウィンドウを表示させるにもロジック作成が必要でしたが、現在ではデザインツールで配置するだけで済みます。
作成を始めてから、まだ1ヶ月たっていないのですが概要処理はほぼ出来あがっています。
Cocoaのインターフェースが優れているのか、または、私の能力が優れているのか不明ですが、実際にここまで出来ているのは事実です。

●文書と画像を表示させるビューを新たに設けました。
 Cocoaですのでこの程度のことをやらせるのは当然の仕様だと思います。

●右上はツリーの階層を辿ることでファイルを選択させる仕様です。
 ルート(/)からのみの参照だととても分かり難いので中間フォルダを先頭に指定できる仕様を考えました。
●フォントは300種類以上もあるのでポップアップボタンでは使いものになりませんので、
 パネルを表示させて選択するCocoa仕様に変更しました。
 また、フォントは本文とヘッダでそれぞれ選択可能ですので「フォント変更..」ボタンを押した側が有効になるように動作させます。

 左下のView(白い部分)には選択したフォント・サイズによって文字が表示されます。

●マージンは通常は「用紙設定」で決められるのですが、使う・使わないを選択可能な仕様としました。

最初は、awakeFromNibって何? デリゲートって何? IBOutletって何? 接続って何? これって何???という状態でしたが、
ここまで出来あがってくると開発方法が分らないと言うことはなくなります。
あとはメソッドの使い方とか、どんな方法が用意されているとかの詳細な部分を調べてゆけば完成に近づいていきます。
と言いながら、これがまた結構大変なのも事実です。底なしと思えるほどのクラスとメソッド群の山ですから。
しかし、全部を知る必要はないのがオブジェクト指向です、必要な機能を構築する部分のみでよいのですから。

開発環境 Xcode2.52009/04/04 14:29

今回は単独ウィンドウのツールアプリなのでCocoaApplicationです。
立上げ当初は調査と実験が必要なのでもっと多くのクラスファイルを作成しておりましたが、現在はご覧の通りシンプルです。

AppController:アプリケーションのコントロールクラスです。
ModelController:モデルクラスの制御用に設けたコントロールクラスです。
FileSystemItem:モデルクラスのモジュールです。

InterfaceBuilderのインスタンスとして作成したのは「AppController」と「ModelController」の2つです。
「FileSystemItem」は既存サンプルをそのまま持ってきてAnythingPrint仕様に合わせた修正を加えてあります。
これは階層ツリーでファイル情報を取得するのに使っています。

InterfaceBuilderの画面と合わせて見ないと分りにくいですが、アメブロは1記事1画像の制約があるのでしかたがありません。

それからアプリ名は「AnythingPrint」にしました、理由は文書だけでなく画像も印刷することにしたからです。
さらにバイナリデータも印刷可能とする為に16進数に変換しての印刷もおこなえます。
つまり、何でも印刷(Anything)です。

開発環境 InterfaceBuilder2.52009/04/05 16:54

ひとつのウィンドウに部品を配置したアプリを作成します。

AppControllerとModelControllerはどちらもNSObjectのサブクラスなので同じものですが、
『File's Owner → AppController』『AppController → ModelController』とデリゲート接続されています。

これはMVCを実現しようと考えてAppControllerはModelControllerを通してモデルにアクセスさせようと考えたものです。
例えば「AppController」でボタンのクリックを受け取り、処理は「ModelController」を呼び出すことにしました。
しかし、必要がないことが分りましたが、これはこれでも良いかなと言うところです。
「AppController」と「ModelController」のどちらでも「OutletとAction」を直接に接続できます。
もっと複雑なアプリの場合には、このModelControllerを沢山作成してゆけば機能分割できると言うことでした。

いずれにしても「AppController」とは別にInterfaceBuilderのインスタンスを作成しないとロジックを全部「AppController」に記述することに成りかねません。

「Font Manager」が薄い水色で作成されておりますが、普通には作成できないインスタンスでした。
これは部品パレットからFontメニューをドラッグ&コピーすると自動的に作成されます。

北朝鮮のミサイル2009/04/06 13:17

ニュースなどでも話題になったのを聞いたことがないので技術論を少々致します。
これは政治的な話ではなく、あくまでも技術的な観点からの話です。

地球は丸いのをご存知だと思います。
ロケットを打ち上げた場合、基地レーダーを使って追跡する必要がありますが、
1台のレーダーで地球全体をカバーできないので離れた位置に複数のレーダーを配備する必要があります。
例えば、日本、ハワイ、アメリカに配備した基地レーダーで追跡してゆくわけです。

今回の北朝鮮のロケットは、ただ打ち上げただけです。
追跡して制御はおこなっておりません、と言うより制御できる環境が整っていないです。
はたしてこれで衛星を軌道に載せられるのでしょうか?
これはミサイルと定義できそうです。

インスタンスと接続する2009/04/06 16:51

Outlets&Action
ウィンドウ上のボタンなどをインスタンスと接続してはじめて動作を制御可能になります。
画面インスタンスはInterfaceBuilderで作成して、AppController.mに制御ロジックを記述します。
Target/Actionとは、ボタンが押されたときに実行するメソッドです。
Outletsとは、メソッドが画面ビューにアクセスするためのオブジェクトのポインタです。

画像はインスタンスAppControllerのものです。
ひとつしか作成しないと全部ここに記載することになるので具合が悪そうです。
機能ごとにインスタンスを作成するのが正常な設計でしょう。

Xcodeで漢字を使えない?2009/04/07 14:39

Xcodeを立上げて新規プロジェクトを選択して...などと基本手順を書いてもつまらないのでやめます。
動き出すと気にもしないようなもので、はまった事柄について紹介しようと思います。

プロジェクトを作成してソースファイルに漢字を入力すると保存できませんでした。
しかたがないのでMacOS-X標準のテキストエディタで作業しておりました。

何の事はない、Xcodeの最初の設定が問題だったのでした。
環境設定/テキスト編集/デフォルトのファイルエンコーディングにUnicode(UTF-8)を選択しておけば問題解決です。
これで新規作成したものは問題なく漢字が使えます、でも既に作成したファイルはだめなので削除して作りなおします。

日本語表示のメニュー2009/04/08 09:04

日本語メニュー
Xcodeが最初に作成するのは英語のMainMenu.nib(English)ファイルです。
日本語化する手順が必要です、
MainMenu.nib(English)を選択してから、ファイル-情報をみる
言語を追加...でJapaneseを選択して追加ボタンを押す。

しかし、日本語化版を作成してもInterfaceBuilderでの表示は英文のままです。
これを手作業でひとつひとつMainMenu変更などしたら大変すぎるでしょう。

これは裏技なのか、正規手順なのか不明ですが?

InterfaceBuilderだと自動作成される。それにコピペしたほがが良い。
(メニューの File/New/ でLanguageをJapaneseにしてNewボタンを押す)

でも、部品パレットからFontメニューを追加すると英文になってしまうのですよね!