Macintosh Developer Online (MDOnline)


2000年6月17日発行号 - もうちょっとNavigation



以前にもお知らせしましたが、昨年末のEメール環境崩壊以来、独自の電子メール環境をずっと作り続けています。細々とやっていましたけど、1週間程前に、新し物好きさんに掲載してもらったら、ダウンロードはもちろん、プログラム作成に加わってくれる人もでてきて、以前よりもピッチは上がっています。
http://msyk.locus.co.jp/macos/ome/
で、それまでに気がつかなかったのですけど、「インターネットロケーションファイル」って、じつはかなりいろいろあることを知りました。システム標準のもの以外に、アプリケーションが勝手に作るものもあるわけです。たとえば、Internet Explorerは、アドレスやリンク部分をデスクトップなどにドラッグ&ドロップすることで、インターネットロケーションファイルを作りますが、それは、システム標準のもではなく、いわばInternet Explorer文書の1つなのです。それをダブルクリックすると、無条件にInternet Explorerが起動します。FinderはAppleScriptでインターネットロケーションファイルからの情報取りだしをサポートしていますが、アプリケーション独自に作るファイルまではサポートしていないことが分かりました。
インターネットロケーションファイルに本物と偽者があるというのは言い過ぎなのですが(笑)、強いて言えば、システムワイドなものとローカルな物があるというところでしょうか。それに気付き、混乱しながらもなんとか対処しているというところです。
(新居雅行 msyk@mdonline.jp


【Carbon化シリーズ】Navigation Serviceに対応(3)

2回に渡ってNavigation Service対応をしてきたが、まだまだ引っ張る。ファイルを開くダイアログボックスに関して、Navigation Serviceのいろいろな機能をもう少し使って見よう。ダイアログボックスをモードレスにしてサイズ変更ができるようにする。それから、最初に表示されるフォルダを指定する方法も使って見よう。さらに、コールバックルーチンに、アプリケーションで指定した値を引き渡す方法も試してみた。

さて、ファイルを開くAPIの関数はNavChooseFileであったが、前回はその4つ目の引数をNULLにしていた。ここには、ダイアログボックスが表示されているときに発生したイベント処理の関数を指定する。ダイアログボックスでもウインドウ処理をはじめさまざまなイベントが発生するが、そうしたイベントが発生したときに、アプリケーションで定義した関数にコールバックするという仕組みが用意されている。このイベント処理関数の指定は、イベント処理というよりも初歩的な段階では、「ダイアログをモードレスにし、サイズ変更を可能にする」ということを実現する。つまり、NavChooseFileはイベント処理関数が指定されていれば、モードレス&リサイズ可能にするというような仕様なのである。
まず、イベント処理関数myNavEventProcを作成した(プログラムは別の記事を参照)。TextDrawのDoCommand.cのソースファイルにとりあえず定義した。また、この関数のプロトタイプも定義する必要がある。TextDrawではmyPrototypes.hにまとめて記述しているので、そこに記述を増やしている。

コールバックルーチンなので、引数は定義通りに指定する。3つあるが、引数のcallBackSelectorがコールバックに対して要求していることを示す値が入っている。つまり、ダイアログボックスで発生するイベントの種類が分かる。これが、kNavCBEventであれば、アップデートなどの通常のEvent Managerで出てくるイベントである。他に、kNavCBCancelのように、キャンセルボタンをクリックしたことを示すような、Navigation Service独特の値も取ることがある。通常のイベント以外にファイルを開くダイアログボックス独特のイベントも発生するということだ。このイベントの種類もかなりたくさんあるので、詳細はAPIのドキュメントを見てもらいたいが、通常とは異なる動作をダイアログボックスに求めないのであれば、特にイベント処理を組み込む必要はない。

Navigation ServiceのAPIでは、こうしたコールバックルーチンに対して、アプリケーションの値を引き渡しできるメカニズムが用意されている。「コールバックユーザデータ」などと呼ばれているが、そのデータのやりとりのために、構造体を定義した。

typedef struct MyUserData  {
    int     field1;
    long    field2;
} MyUserData, *MyUserDataPtr, **MyUserDataHandle;

NavChooseFileを呼び出す前に用意したMyUserData構造体を、コールバックルーチンでも参照できるようにするということをとりあえず目指すことにする。イベント処理のコールバックルーチンmyNavEventProcでは、ユーザデータは引数から取り出すことができるようになっている。つまり、コールバックする時にルーチンにユーザデータを引き渡すという仕組みが動いている。

以上のような準備のもと、FileメニューのOpenを選択した時に呼び出されるDoOpenCommand関数を書き換えた(プログラムは別の記事を参照)。ダイアログのオプションには、既定値を使うようにしてみた。
実行すると以下のようなダイアログボックスが表示されるが、タイトルバーがあり、位置を移動させたり、サイズの変更ができるようになっている。別のアプリケーションに切り替えることもできる。また、位置を移動させると、その位置を覚えていて、次回にダイアログボックスを表示したときには、画面の中心ではなく、移動した先の位置になっている。
ダイアログ設定はNavGetDefaultDialogOptionsで既定値を設定したが、タイトルバーは「開く」、ボタンは「キャンセル」「開く」になり、メッセージはない。これをベースに自分好みに設定を変えることになるだろう。

◇表示されたNavigation Service対応のダイアログボックス
 

まず、イベント処理のコールバックルーチンはmyNavEventProcという名前だが、これからユニバーサルポインタを取得するためにNewNavEventProcマクロを利用している。
ダイアログボックスで最初に表示するフォルダを、常に起動ボリュームの「書類」フォルダとなるようにする。FindFolderで「書類」フォルダを探し、そのFSSpec構造体を作っている(なお、FindFolderを使うために、Finder.hをインクルードしている)。そこから、AppleEventのディスクリプタをAECreateDescで作成し、結果をNavChooseFileの1つ目の引数に指定している。なお、最後にはこのディスクリプタを破棄している。ここでは、書類フォルダ固定としたが、もし、最後に開いていたフォルダが次にも開くようにするのであれば、NavChooseFileの1つ目の引数はNULLでかまわない。
イベント処理のコールバックルーチンは、前に紹介しているが、イベント処理ルーチン側ではたいしたことをしていない。「キャンセル」ボタンがクリックされた時に、SysBeepでシステム警告音を発生させているだけだ。イベント発生時のさまざまな情報は、引数から得られるようになっているが、構造体がかなり複雑なので、ドキュメントを読み込まないと理解できないかもしれない。ただ、イベント処理ルーチンは、特に何もしなくても、基本的な動作はうまくいくようだ。たとえば、アップデートイベントに対応するプログラムをわざわざ記述する必要はなく、ダイアログボックスのアップデートは自動的に行われている。とにかく、Navigation Serviceでやってくれない作業をイベント処理コールバックルーチンで書き加えるということでよさそうだ。

ユーザデータの処理は、結果を追ってもらいたい。NavChooseFileの最後、つまり8番目の引数に、構造体のアドレスを引き渡した。それがコールバックされたmyNavEventProcでは、3つ目のNavCallBackUserData型の引数として、システムから伝達される。この型はvoid *なので、キャストなどを適当にすれば、呼び出し元のユーザデータをコールバック側で知ることができるという仕組みなのだ。

次回は保存のダイアログボックスをNavigation Serviceに対応させていくことにしよう。

カテゴリ:Carbon/CF, Carbon化


【Carbon化シリーズ】Navigation Serviceに対応(3)-myNavEventProc

void myNavEventProc(
            NavEventCallbackMessage callBackSelector, 
            NavCBRecPtr callBackParms, 
            NavCallBackUserData callBackUD)
{
    EventRecord* thisEvent = ((callBackParms->eventData).eventDataParms).event;
        //イベント情報を取得しておく
    MyUserData userData = *(MyUserDataPtr)callBackUD;
        //ユーザデータを、コールバックルーチンで取り出す
    switch (callBackSelector)   {   //イベントの種類に応じ
        case kNavCBEvent:      //一般的なイベントなら
            switch (thisEvent->what)    {   //イベントの種類に応じ
               case updateEvt:     //アップデートイベントなら
               break;          //ここでは何もしないけど…
               }
            break;
        case kNavCBCancel:     //キャンセルボタンが押されたなら
            SysBeep(1);        //システム警告音を鳴らす
            break;
    }               //…という風にイベントごとの処理を記述する
}

カテゴリ:


【Carbon化シリーズ】Navigation Serviceに対応(3)-DoOpenCommand

void DoOpenCommand()
{
    OSErr          er;
    NavReplyRecord    reply;
    NavDialogOptions   dialogOptions;
    NavTypeListHandle  typeList;
    Point          dialogPosition = {-1,-1};
    AEDesc         defLoc;
    FSSpec         defLocSpec;
    short   fVolRef;
    long        fDirID;

    NavEventUPP       neProc = NewNavEventProc(myNavEventProc);
        //イベント処理関数のユニバーサルポインタを用意
    MyUserData uData = {15,16}; //ユーザデータを初期化

    typeList = (NavTypeListHandle)GetResource(’open’, 128);
        // openリソースをそのまま利用する
    NavGetDefaultDialogOptions(&dialogOptions);
        //ダイアログ設定は既定値
    er = FindFolder (kOnSystemDisk, kDocumentsFolderType, kDontCreateFolder, &fVolRef, &fDirID);
        //書類フォルダを探す
    er = FSMakeFSSpec(fVolRef, fDirID, "\p", &defLocSpec);
        //書類フォルダのFSSpecを構築
    er = AECreateDesc(typeFSS, &defLocSpec, sizeof(FSSpec), &defLoc);
        //書類フォルダのAppleEventディスクリプタを生成

    er = NavChooseFile (&defLoc, &reply, &dialogOptions, neProc, NULL, NULL, typeList, &uData);
        //ダイアログボックスを表示
    if(er == noErr && reply.validRecord)    {   //ファイル選択が行われたなら
        long  count, index;
        er = AECountItems(&(reply.selection), &count);  //選択されたファイルの個数を得る
        if ( er == noErr) {
            for (index = 1; index <= count; index++)  {    //1つ1つのファイルを取得する
               AEKeyword theKeyword;
               DescType       actualType;
               Size            actualSize;
               FSSpec     documentFSSpec;

               er = AEGetNthPtr(&(reply.selection), index, typeFSS, &theKeyword,
                   &actualType,&documentFSSpec, sizeof(FSSpec), &actualSize);
               if (er == noErr)
                   LoadFromFile(&documentFSSpec);   //ファイルを開く
            }
        }
        er = NavDisposeReply(&reply);
        ReleaseResource((Handle)typeList);
    }
    AEDisposeDesc(&defLoc);   //ディスクリプタを破棄
}

カテゴリ:


コマースサイトを簡単に作成できるツールがリリース

Smith Micro社は、オンライン販売サイトなどを容易に構築できるツール「WebCatalog Builder」をリリースした。価格は$99.95となっており、Mac OS 8.5以降で利用できる。250のデザインのテンプレートが含まれており、それをもとにサイトを構築できる。また、サーバは通常のインターネットプロバイダで利用できるものであるとしている。ショッピングカートを含むようなWebサイトを、HTMLやプログラミングなしで構築できるとしている。

関連リンク:WebCatalog Builder: Your EBusiness Launch Kit!
カテゴリ:オーサリング系


マイクロソフトの次期Officeの内容がさらに明らかに

MicrosoftはOffice 2001として、ワープロ、表計算などの汎用アプリケーションのセットをアップデートする予定だが、その内容について、より多くの情報が公開されている。ワープロや表計算などの従来からあるアプリケ璽轡腑鵑砲弔い討蓮△いつかのアップデートはなされるものの、Windows版Office 2000もすでに出ていることもあって、すべてが目新しい機能ではない。新しく公開された情報から読み取れる製品内容からは、むしろ電子メールやスケジューラを統合したソフトウエアにアクセントがあるということだ。
現在のOffice 98では、Outlook Expressがメールソフトとして添付されているものの、Office 2001では新しいメールとスケジューラなどのPIM機能が組み込まれたアプリケーションが含まれるようだ。Windows版ではOutlook 2000があるように、Macintosh版でも単なるメールクライアントではない情報管理ツールが含まれることになる。Palmなどとの連係はすでに知らされたことではあるが、電子メールに、スケジュール、仕事一覧、メモなどを機能として含み、英語辞書との統合やフォローアップとして項目をきめられた時間内で処理したかを管理するような機能が含まれる様だ。Outlook 2000は「デジタルダッシュボード」として、企業システムの個人個人が使うポータルのような位置づけもされているが、Office 2001に含まれるメール&PIM機能は、個人が使うという点にフォーカスされており、Macintoshユーザ層を考慮した機能となっている。
また、ワープロなども、選択作業がやりやすいテンプレートの提示や、あるいはウィザード機能による文書作成など、使い勝手を高める機能も含まれている。一方で、データベースソフトはやはり含まれないままである。個人ユーザの比率が高いMacintosh市場にマッチしたOfficeを目指している点はより明確になっていると言えるだろう。

関連リンク:Microsoft MacTopia
カテゴリ:アプリケーション


REALbasicのレポート作成ツール、データベースから帳票を作成

Aaron L. Bratcher氏によって開発されている「Report Writer 2.0」は、データベースにあるデータから印刷帳票などのレポートを作成するツールだ。価格は$129.95だが、プレビュー版がダウンロードして利用できる。REALbasicをベースにして作られており、REALbasicから利用できるデータベースに対して接続できる模様だ。BodyやHeader、Footerなどのパートに分かれた設計画面に、フィールドやあるいはテキスト、線や長方形といった基本的なオブジェクトを配置して、レポートを作成できる。データベースシステムでの帳票作成ツールとして利用できるものだろう。

関連リンク:Aaron Bratcher’s Data Tools
カテゴリ:REALbasic, データベース


2000/6/15に公開されたTIL-Jの記事

日本語での技術情報を提供するTech Info Library-Jで、別掲の記事以外に6月15日に以下の記事が公開されている。文書のアドレスは以下の通りだ。

◇100384JO:QuickTime 4.1.2: 新機能について
 http://til.info.apple.co.jp/cgi-bin/artnum?id=100384
4.1.2の新機能ではなく、4.1の新機能、つまりQuickTime PlayerのAppleScript対応などが簡単にまとめられた文書。

◇58511JN:AirMac Base Station: 多数のユーザがいる環境にインストールする
 http://til.info.apple.co.jp/cgi-bin/artnum?id=58511
やや期待してしまう見出しではあるが、内容はごく簡単に概要が述べられているだけである。

◇15926JC:漢字Talk 7.5: 機能拡張マネージャを使って機能拡張の互換性の問題を解決する
 http://til.info.apple.co.jp/cgi-bin/artnum?id=15926
◇58492JN:Mac OS ROM と bootROM との違い
 http://til.info.apple.co.jp/cgi-bin/artnum?id=58492
◇58061JN:Mac OS 設定アシスタント: 使いたいプリンタがリストに表示されない
 http://til.info.apple.co.jp/cgi-bin/artnum?id=58061
◇58524JN:iBook: CD から起動するとネットワークサービスが利用できません
 http://til.info.apple.co.jp/cgi-bin/artnum?id=58524
◇24571JN:AppleShare IP: AppleShare IP 6 Admin に関する FAQ
 http://til.info.apple.co.jp/cgi-bin/artnum?id=24571
◇60130JN:Mac OS X Server: Workspace Manager について
 http://til.info.apple.co.jp/cgi-bin/artnum?id=60130
◇60237JN:Mac OS X Server: MacOS.app と Mac OS X Server のパフォーマンス(修正)
 http://til.info.apple.co.jp/cgi-bin/artnum?id=60237
◇58423JC:Power Mac G4: Mac OS X Server のサポートについて(修正)
 http://til.info.apple.co.jp/cgi-bin/artnum?id=58423
◇31137JN:AppleShare IP First Aid 6.3: AppleShare IP First Aid 6.3 について
 http://til.info.apple.co.jp/cgi-bin/artnum?id=31137
◇43046JN:トラブル克服ハンドブック: トラブルを解決する: 問題点
 http://til.info.apple.co.jp/cgi-bin/artnum?id=43046

関連リンク:Tech Info Library - Japan
カテゴリ:Tech Info Library-J


Video Extension 1.0の国際版がリリース

すでに英語版としてリリースされている「Video Extension 1.0」の英語版の国際版がリリースされている。NuBus搭載機およびPCIバスではない古いタイプのPowerBookにおいて、内蔵ビデオあるいはビデオカードで、利用できるすべての解像度への設定ができるようにする。

関連リンク:Video Extension 1.0
カテゴリ:周辺機器