Macintosh Developer Online (MDOnline)


2002年1月30日発行号 - REALbasicで文字化け?



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃Q.オンラインショップで本を買っても送料無料ってホント? ┃今すぐ購入
┃A.本当です!【楽天ブックス】では送料無料でばんがります!┃ ↓
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ↓
http://px.a8.net/svt/ejp?a8mat=BZFSP+3GFM7M+1N6+61C2R

アフィリエイト広告を入れてみました。もし、オンラインで書籍を購入されるご予定があるなら、ぜひとも上記のクリックからたどってください。よろしくお願いします。ちなみに、この広告は郵便番号検索サイトにも入れてみましたが、どれくらいの上がりがあるかは興味ある方も多いでしょうから、またお知らせしましょう。
それから、Knowledge Baseに大量に文書が公開されていますが、いずれも、How to …といったもので、基本操作の説明です。ヘルプから持ってきているのじゃないかと思います。検索しても、基本的なことがこれまでのKBaseだとでてこないので、情報量を増やすのが目的じゃないかと思います。御覧になりたい方は、以下のリンクから、1/28や1/29のところにジャンプしてみてください。

 http://mdonline.jp/kbasecheck.html

それから、WebObjectsの評価版の当選者の方々ですが、実は全員です。あと1つと、プレス説明会でもらったものの合計2つは手元にありますから、欲しい人は先着で差し上げます。メール下さい。

WO評価版当選者(敬称略):中瀬秀司、いとう、野倉、ぽもな、津村、オージェ、poplife、本多、中島信人、shino、hayato、Hitch、め、T、竹内秀樹、竹田由孝、えむ、有賀啓之、松尾孝則
(新居雅行 msyk@mdonline.jp


【MacWIRE配信予定】Office v.Xで使うREALbasicは実用にはちょっと支障あり

Office v.X for Macのアプリケーションには、Visual Basicだけでなく「REALbasic」というメニューがついているのに驚いた人も多いかもしれない。REALbasicは確かにOffice Automationという機能によって、REALbasicで作ったアプリケーションから、Excelなどをプログラムでコントロールすることができた。Visual BasicもREALbasicも、どっちもBasic言語だけにある意味では「相性のいい」組み合わせだ。また、以前に記事で報告したように、Office v.XのVisual Basicの機能は全然進化しておらず、デバッグなどの作業がやりづらい。本格的なプログラム作成はREALbasicか…と思いたいところだが、残念ながらそれはどうもまだまだ問題があるようだ。

◇Office v.Xでは、マクロ機能にREALbasicが加わった
 

REALbasicは、Real Software社が開発している開発ツールで、Carbon対応によりMac OS Xでもネイティブアプリケーションを生成できる。Pro版だとWindows版のアプリケーションも作成できるので、手軽な開発ツールとして確固とした地位を築いた。日本ではアスキーが代理店となっている。本家のVisual Basicと同様、容易に開発ができる点に加えて、データベース利用についてもさまざまな配慮があり、業務アプリケーションを構築するという世界でも耐えうるスペックとなっている。Office対応のプラグインによって、REALbasicからOfficeのアプリケーションをコントロールできるようになっている。Officeでは、REALbasic 3.5以降での対応ということになっているが、現在は3.5.2の日本語版が最新版だ。サンプル版での利用ということも不可能ではないが、実質的にプログラムを作成するとなるとライセンスを購入する必要がでてくるだろう。

まず、ExcelなどからREALbasicを使うには、REALbasicのアプリケーションとREALbasicのPluginsフォルダを、Microsoft Office Xフォルダの中のOfficeフォルダに移動、ないしはコピーをしないといけない。REALbasicのアプリケーションがこのフォルダにないといけないようだ。たとえば、Officeフォルダの中に、REALbasicフォルダがあってその中にアプリケーションやプラグインがある…というのではだめなのである。また、Pluginsフォルダには、もちろん、Office Automationのプラグインをダウンロードして入れておく必要がある。

◇Mac OS XではREALbasicはOfficeフォルダにないといけない
 

これは少し不便ではあるのだが、もっと問題なのは、REALbasic本体がOfficeフォルダになくても、Excelなどからメニュー呼び出しできてしまうことである。もっとも、REALbasic側の対応が進んで、Officeフォルダになくてもいいようになることを見越してのことだとは思うが、いきなり使おうとして面喰らうかもしれないので、フォルダ位置は注意しよう。
もっと不便なのは、REALbasicで生成したアプリケーションもOfficeフォルダになければならないということだ。別のフォルダにおいてダブルクリックして実行してもエラーになる。つまり、Excelと連動させたいようなシステム構築においてはちょっと自由度が下がってしまうという問題がある。

さて、実際のプログラミングだが、Visual Basicでのプログラミング経験があれば、Excelなどのプログラミングについてはほとんど迷うことはないかもしれない。以下の図は、Office Automationのプラグインセットにあったサンプルプログラムを改良したプログラムだ(もとのプログラムはちょっとあんまりだったもので…)。ウインドウにリストがあって、ボタンがある。ボタンをクリックすると、リストの内容をExcelのワークシートにコピーするといったものだ。

◇ExcelをコントロールするREALbasic側のプログラム
 

プログラムの内容を見る前に実行結果をみてもらおう。REALbasicで実行してボタンをクリックすると、Excelでは新しいウインドウが開き、シート名を変更してセルにリストにあるデータを展開し、合計値を計算している。ただ、A4のセルに見られるように、文字化けしているのが大きな問題である。

◇Mac OS XではREALbasicはOfficeフォルダにないといけない
 

つまり、ソースに記述した日本語がきちんととおっていないというのは、プログラムを作る上ではかなり大きな支障になるだろう。REALbasicは日本語版を利用しているが、何か設定があるのと思って探したけど、該当するものは見つからなかった。なお、同じようにワークシート上のセルの文字列を取り出した場合でも、セルの文字列が日本語なら文字化けしていた。この点が解決しないようでは、やはりREALbasicで何か作ろうという気にはなりにくいだろう。(これに関する解決方法が分かるのであれば、ぜひとも知りたいので教えていただきたい。)

などと結論がでていながらも、プログラムをどう作るのかはチェックしたい。ここで、ExcelApplicationというクラスのインスタンスをnewで生成しているが、これにより、起動しているExcelのアプリケーションを参照できる。もし、Excelが起動していなければ、ここで起動するが、その場合はギャラリは出ないので、起動はけっこう早い。そして、ExcelApplicationのインスタンスの参照から、Excelで定義されているさまざまなメソッドがそのまま使えるということだ。ただ、ExcelのVisual Basicでは、WorksheetやRangeといったクラスが、ExcelWorksheet、ExcelRangeといった名前で管理されるようである。あらかじめDimで変数定義をしておく必要があるので、そこでREALbasic側で規定された名前を使う必要があるだろう。
新たなブックを開くには、WorkbooksにAddを利用したり、RangeメソッドやOffisetメソッド、Valueプロパティというあたりは、ExcelでのVisual Basicとほとんど同じような感覚で使える。ただ、Visual Basicでは参照を変数に記録するのにSetを使うのだが、REALbasicではSetがあるとエラーになるなど、やはり違いもある。だが、そうした細かい点を除くと、とにかくVisual Basicのリファレンスを見ながら、REALbasicでのプログラム作成はできる範囲だろう。

ちょっと期待をしていたREALbasicでのマクロ作成ではあるが、日本語の問題が解決するのを待つしかない模様だ。特に、Macintosh版のOfficeとWindows版のOfficeの大きな違いとして、データベースアクセスのことがある。Windows版だと基幹システムへの接続のような仕組みを比較的容易に組み込めるが、Mac版Excelだとそう簡単には行かなかった。だが、REALbasicは、MySQLやPostgreSQLをはじめ、OralceやSQL Server、4D、OpenBaseといった商用サーバまでプラグインが用意されているため、たとえばExcelでデータベースに接続してデータを取り出すといった仕組みがこれまでよりもぐっと作りやすくなるという利点がある。新しい機能はそう簡単には使えないと言ってしまえばそれまでだけど、この日本語の問題は、Office側の問題なのか、REALbasic側の問題なのか、外見からは判断しずらい。とにかく、良い方向に行くのを願うのみということだろうか。
それから、REALbasicのコントロールに対応するのは、Word、Excel、PowerPointであり、Entourageには対応していない。もっともEntourageはVisual Basicでのプログラミングにも対応していないので、それは仕方ないことなのかもしれないが、やはりREALbasicでの利用はViual Basicの延長であることが伺える。

カテゴリ:開発ツール, 文書作成アプリケーション


今から始めるCocoaプログラミング》文書ファイルを扱うアプリケーションを作る(16)Preferencesの組み込み(5)環境設定値を記録する

User Defaultsを使う、NSUserDefaultsクラスの機能についてはすでに解説したが、結果的に、その機能を使って、PreferencesWindows.javaのソースは以下のように作成した。ソースを見ながら変更点を解説しよう。

/* PreferencesWindow */

import com.apple.cocoa.foundation.*;
import com.apple.cocoa.application.*;

public class PreferencesWindow extends NSWindow {

NSTextField initHeightTextField; /* IBOutlet */
NSTextField initLeftTextField; /* IBOutlet */
NSTextField initTopTextField; /* IBOutlet */
NSTextField initWidthTextField; /* IBOutlet */

public void setupInitValue(Object sender) { /* IBAction */
initLeft = initLeftTextField.intValue();
initTop = initTopTextField.intValue();
initWidth = initWidthTextField.intValue();
initHeight = initHeightTextField.intValue();

NSUserDefaults ud = NSUserDefaults.standardUserDefaults();
ud.setIntegerForKey(initLeft, "Position Left");
ud.setIntegerForKey(initTop, "Position Top");
ud.setIntegerForKey(initWidth, "Width");
ud.setIntegerForKey(initHeight, "Height");
}

static int initLeft ;
static int initTop ;
static int initWidth ;
static int initHeight ;

static {
NSUserDefaults ud = NSUserDefaults.standardUserDefaults();
if(ud.objectForKey("Position Left") == null) {
Object obj[] = {new Integer(20), new Integer(100),
new Integer(400), new Integer(200)};
Object keys[]
= {"Position Left", "Position Top", "Width", "Height"};
ud.registerDefaults(new NSDictionary(obj, keys));
}
initLeft = ud.integerForKey("Position Left");
initTop = ud.integerForKey("Position Top");
initWidth = ud.integerForKey("Width");
initHeight = ud.integerForKey("Height");
}

/* これがないと実行時にエラー */
public PreferencesWindow(
NSRect contentRect, int styleMask,
int backingType, boolean defer) {
super(contentRect, styleMask, backingType, defer);
setDelegate(this);
}

public void windowDidBecomeKey(NSNotification aNotification) {
initLeftTextField.setIntValue(initLeft);
initTopTextField.setIntValue(initTop);
initWidthTextField.setIntValue(initWidth);
initHeightTextField.setIntValue(initHeight);
}
}

まず、User Defaultsに記録する値の名前を、"Position Left", "Position Top", "Width", "Height"いうことにしておく。特にネーミングの規則はないようであるが、適当に自分で規則を作っておけばよいだろう。
環境設定ウインドウのOKボタンをクリックすると、setupInitValueメソッドが呼び出される。ここでは、テキストフィールドの値をクラス変数に記録したが、ついでに、User Defaultsにもそれらを書き込んでおけば、OKボタンをクリックすることで、User Defaultsに確実に記録されることになる。
一方、アプリケーションを起動したときには、記録されているUser Defaultsを読み出したい。その方針として、アプリケーション内ではクラス変数で環境設定の値を管理しているので、staticイニシャライザで、User Defaultsからの取り出しを行い、アプリケーション起動時に確実に処理されるようにした。読み出しを行えばいいのだが、integerForKeyメソッドで数値で得たい。もちろん、文字列で得てから処理するとうい手もあるが、ここでは、1つの名前に対する値が存在するかどうかを判断して、それがない場合には、はじめてUser Defaultsを利用するものと判断し、値とキーのセットを配列で定義して、registerDefaultsメソッドを使ってNSDictionaryクラスで必要な値のセットをまとめて設定した。その後、User Defaultsから読み出しを行っている。

このままだと、アプリケーションを起動し、環境設定ウインドウを呼び出すと、環境設定のウインドウにあるテキストフィールドは空欄のままだ。つまり、環境設定のウインドウを表示したときに、現在のクラス変数の値を各テキストフィールドに記入する必要がある。そのために、ウィンドウのデリゲートを利用する。NSWindowは、キーウインドウとなったときに、デリゲートされているオブジェクトに対してwindowDidBecomeKeyメソッドの呼び出しを行う。ここでは、PreferencesWindowのコンストラクタで、setDelegate(this);によって、まず、自分自身をデリゲート先に指定した。そして、アプリケーションメニューのPreferencesを選択すると、環境設定ウインドウがキーウインドウになる(このウインドウのmakeKeyAndOrderFrontメソッドを呼び出すようになっているからだ)。したがって、PreferencesWindowクラスのwindowDidBecomeKeyメソッドが呼び出されるという仕組みである。ここで、クラス変数の値をテキストフィールドにセットすればよい。

繰り返しとなるが、以上のリストで、アプリケーションの識別子「net.msyk.mosaeditor」はまったくでてこない。アプリケーション設定をしておき、前回に説明したメソッドを使う範囲では、識別子は自動的に認識されて、それを元に設定がされるのである。

なお、User Defaultsに設定された値は、defaultsというコマンドで参照することができる。ここでは識別子はnet.msyk.mosaeditorであるので、

% defaults read net.msyk.mosaeditor

とコマンドを与えれば、設定されている値が以下のように参照できる。

{Height = 400; "Position Left" = 0; "Position Top" = 0; Width = 500; }

defaultsコマンドの詳細はmanコマンドのマニュアルで見ていただくとして、設定を書き込んだり、あるいは削除したりということもできる。いずれにしても、とりあえずアプリケーションを作成している段階では、正しく書き込まれているかどうかをチェックすることは、Terminalからコマンドをたたけばできるということだ。(なお、defaultというコマンドもあるが、これはシェルスクリプトのswitchステートメントで使うキーワードだ。)

また、自分のホームフォルダにあるLibrary/Preferencesに、アプリケーションの識別子から名前をとった「net.msyk.mosaeditor.plist」というファイルがある。ダブルクリックすると、Developer ToolsでインストールされるProperty List Editorで、ファイルの内容が参照できる。中身はXML形式であるが、このアプリケーションを使うと階層表示で内容を参照することもできる。

◇User Defaultsの結果を残すファイルを参照した
 

環境設定ウインドウのユーザインタフェースの組み込みと、User Defaultsを使った永続記憶の方法を5つの記事でお届けしてきたが、次回はCocoaならではの機能を紹介しよう。メニューを追加するだけで、いきなり高機能(!?)ワープロになってしまうというところだ。
(この項、続く)

カテゴリ:Java, Cocoa, 今から始めるCocoaプログラミング


オープンソースのクロスプラットフォームフレームワークがCarbon対応

AD Softwareは、C++で利用できるアプリケーションフレームワークのOOFILE 1.4をリリースした。データベース利用のための機能を含んだアプリケーションフレームワークで、Ver.1.3は1999年にリリースされており久しぶりのアップデートとなった。Ver.1.4では、Carbon対応となり、Mac OS、Mac OS Xに加えて、WindowsやUNIX向けにも利用できるようになっている。レポート作成ソフトなどのソースとともに公開されている。フレームワーク自体はオープンソースであるが、一部のデータベース部分だけを有償として、商品として販売されている。dBase互換のデータベースエンジンを含むOOFILE Personalが$99、さらにFaircomのc-tree Plusが追加されたOOFILE Professionalが$1,599となっている。また、c-tree**を含まないOOFILE Professionalが$650となっている。XMLを含むさまざまなサンプルも用意されている。

関連リンク:OOFILE
カテゴリ:データベース, ライブラリ