Macintosh Developer Online (MDOnline)


2001年3月7日発行号 - AirPort 1.3のTIL



今日の配信では、始めて(笑)Windowsのプログラムを紹介することになってしまいました。Webサイトからプログラムをコピーされる場合には、シングルクォーテーションを全角から半角にすることを忘れないでください。よろしくお願いします。メールの文面からはそのままコピー&ペーストできるかと思います。
このところ、空気中の花粉の濃度が高いせいで、体調はいまひとつです。なるべく外出しないようにしているのですが、家の中にいてもあまり変わらないような気がします。うちではアレルギー対策として、空気清浄機をもちろん用意していて、仕事場と寝室に置いてあります。年がら年中起動しているわけで、壊れて買い替えたものを今使っているわけです。ただ、寝室にある新しい方はそれなりに効果があるような気がするのですけど、仕事場にある方がきちんと機能していないという疑いがあったりします。どうも、このところ、仕事場に何時間が滞在すると鼻の調子が悪くなるといった具合です。書籍がいっぱいあるのでハウスダストとか、カビの影響もあるのかもしれないけど、実はこちらの空気清浄機は安物を買ってしまったのです。性能もさることながら、24時間で自動的に電源が消えて連続運転しないというスペックがいちばん腹が立ちますね。これって買ってみて始めて分かったし。そういえば、今も電源はオフになっています。毎日手動で起動しているので、だから効果が薄いのでしょうか? パソコンといい、サーバといい(当たり前か)、空気清浄機といい、我が家にはつけっぱなしの電化製品があちこちにあります。
(新居雅行 msyk@mdonline.jp


【WindowsオフィスでWebObjects】Direct to Web向けにデータベースを変更する

Direct to Webから書き込みができるようにするには、Accessのデータベースを変更しないといけないことを、一連の連載で紹介した。Direct to WebでAccessのデータベースをWebで公開した場合、Webブラウザ側から新たなレコードを作成したり、あるいは編集するときなど、Accessのオートナンバー型のフィールドの扱いの問題で、修正や新規レコード作成ができないという事態になってしまった。よくよくしらべると、Direct to Webのメカニズムとして、自分自身で主キーの管理をしており、オートナンバー型で自動的に主キー値をシリアルに設定するデータベース側の処理とうまく処理が噛み合わないのである。Direct to Webからの書き込みを可能にするには、オートナンバー型をあきらめ、数値型の長整数型フィールドに変更するしかないということが分かったという次第だ。
しかしながら、そうなると、今度はAccessのデータベースファイルをAccessで開いた時のアプリケーション利用に支障が出る。オートナンバー型の主キーフィールドを使う理由は、主キー値の設定を自動的に行うということで、設定する以上は何もしなくても、たとえばフォームで新しいレコードを作成したときには主キー値が確実に設定されるというメリットがあるからだ。しかし、オートナンバー型から数値型に変更してしまうと、その機能が利用できない。
ここで、Direct to Webでの書き込みもでき、しかも、Accessのデータベースファイルを開いてフォームやレポートなどでの作業の両方をしたいということを考えた。結論的には、まずは主キーフィールドをオートナンバー型でないように変更する。そして、Accessのフォームに、オートナンバーの処理に相当する機能を付け加えることにした。

本来、オートナンバーに替わる連番自動入力機能を、テーブルに定義できればいいのだが、Accessではたとえばテーブルのフィールドの既定値プロパティでは、ユーザ定義関数が使えないなどの制約がある。トリッキーなことをしても仕方ないので、無難な線としては、フォームにプログラムを加えるという手法を考えた。ただし、この方法だと、テーブルのデータシートビューで新しいレコードを手入力するときには要注意ということになる。もっとも、一般的にはそう言うそういうアプリケーションは「作り込んだ」ものとは言えないとは思うので、フォームでの新規入力以外は除外しよう。
Accessのフォームでは、レコードソースとしてテーブルを指定するのが一般的だと思うので、その状態での話をしたい。SQLステートメントなどを指定する場合には、取り出すフィールドに主キーフィールドが含まれるようにすればよいだろう。まず、その主キーのフィールドを、コントロールにいったん配置しよう。これはうまく動くことを確認すれば後から削除すればいい。もちろん、そのまま配置しておいてもかまわない。
そして、フォームのイベントプロシージャを記述する。「挿入前処理」というイベントに対して別掲のようなプロシージャを記述する。もちろん、AccessなのでVisual Basicのプログラムだ。Access 2000向けなので、思い切ってADOを使ってみた。これは一例なので、実際に作成されているデータベースに合せて調整をしてもらいたい。

Private Sub Form_BeforeInsert(Cancel As Integer)

Dim rs As New ADODB.Recordset
Dim pkNum As Long
Dim tableName As String
Dim pkField As Variant

’=============================
’いちおう、ここをカスタマイズすれば、そこそこ汎用的かも
tableName = Me.RecordSource ’フォームのデータソースとなるテーブル
Set pkField = Me.id ’主キーのフィールドを参照
’=============================

rs.Source = _
"select PK from EO_PK_TABLE where NAME=’" & tableName & "’"
rs.ActiveConnection = Application.CurrentProject.Connection
rs.CursorType = adOpenDynamic
rs.LockType = adLockOptimistic

rs.Open
rs.MoveFirst
pkNum = rs.Fields("PK").Value + 1
rs.Fields("PK").Value = pkNum
rs.Update
rs.Close

pkField.Value = pkNum

End Sub

このプロシージャをきちんと動かすために、少しは変更しないといけない。まずはフォームのデータソースにあるテーブル名だ。これを変数tableNameに得る。データソースにテーブルを指定していれば、単にRecordSourceプロパティで得られるが、そうでない場合にはここをカスタマイズすればいい。下手にプログラムするよりは、どっちにしてもフォームごとにこのプロシージャを設定することになるので、文字列定数を入れるのが無難だろう。
次に、主キーフィールドに対応するコントロールを、pkField変数で参照するが、プログラムは主キーフィールドがidという名前の場合だ。違う名前からこの部分を修正すればいいだろう。そのフィールドをフォームに配置すると、コントロール名がidというテキストフィールドが配置される。だから、そのコントロールが存在すればコントロールを参照するが、コントロールを削除するとレコードソースに存在するidフィールドを参照することになる。いずれにしても、pkField変数に代入している部分は、実際のテーブルにあわせないといけないということになる。
あとは、ADOの機能を利用して、Direct to Webが作成するEO_PK_TABLEの内容から、テーブルの主キー値の値を取り出し、それを主キーフィールドにセットし、1だけ値を増加させ、EO_PK_TABLEに戻しているというわけだ。ちなみに、取り出した値に1を増やしたものを主キーフィールドに設定しているのが処理のポイントだ。あと、EO_PK_TABLEの値を変更することから、とりあえずは無難に動的カーソルにし、楽観的ロックにしてある。

このイベントプロシージャは、レコードを新規入力する必要のあるフォームすべてに設定しなければならない。汎用的に作ってもう少し短くまとめることもできなくはないとは思うが、そのあたりは実際に作っているアプリケーションに合せていただければと思う。
こうして、新規にレコードを作成する場合、どこかのフィールドに文字を1文字でも入力すれば、上記のイベントプロシージャが呼び出され、主キーフィールドにシリアル値が入力されるという具合になる。これで、なんとか、AccessのアプリケーションとDirect to Webが両立できたかというところだ。

カテゴリ:Windows, WebObjects


【TIL】AirPort 1.3に関する文書が公開、コンピュータ間通信はIBSSをサポートなど

Tech Info Libraryに、AirPort 1.3に関する文書が掲載された。また、既存の文書についても、1.3向けに更新が行われている。それらをまとめてお届けしよう。
なお、MDOnlineの2001/3/6号ではAirPort 1.3のソフトウエアがダウンロードできないことを報告したが、現時点ではダウンロードできることを確認した。ちなみに、日本語版のシステムにはインストールできなくなっている。

◇106143 - AirPort 1.3: AirPort Base Station Software File Relocated
 http://til.info.apple.com/techinfo.nsf/artnum/n106143
CD-ROMに含まれていた「AirMac Base Station Software」というファイルはAirPort Admin Utilityなどに統合された。

◇106142 - AirPort 1.3: Unable to Access Other Computers After Joining Computer-to-Computer Network
 http://til.info.apple.com/techinfo.nsf/artnum/n106142
コンピュータ間での通信モードの場合、パスワードを間違えた後には、接続ができなくなる。再接続する時にパスワードを間違え内容にする。

◇106140 - AirPort 1.3: Using Computer-to-Computer Mode (IBSS)
 http://til.info.apple.com/techinfo.nsf/artnum/n106140
AirPort 1.3では、IBSS(The Independent Basic Service Set)という規格に基づいたコンピュータ間ネットワーク機能が新たに加わった。これはBase Stationがなくても、ネットワークを構築できるということを意味する。AirPortでの設定方法が図入りで掲載されている。

◇106144 - AirPort 1.3: PPPoE - Software Base Station Does Not Connect to Internet as Expected
 http://til.info.apple.com/techinfo.nsf/artnum/n106144
PPPoEでの設定をしたにもかかわらず、うまく接続できない場合の対処方法が記載されている。プロバイダによって供給されたソフトウエアで接続した状態で、AirPortの設定をするように記載されている。

以下の文書は、AirPort 1.3以前のバージョン向けに公開されたものだが、Ver.1.3に対応した修正が行われている。文書のタイトルとアドレスを示しておく。

◇60422 - AirPort Wireless Communications: FAQ - Part 3 of 3
 http://til.info.apple.com/techinfo.nsf/artnum/n60422
◇58569 - AirPort 1.2 and Earlier: Using Computer to Computer Mode
 http://til.info.apple.com/techinfo.nsf/artnum/n58569
◇58579 - AirPort Setup Assistant: Steps to Complete Before Base Station Setup
 http://til.info.apple.com/techinfo.nsf/artnum/n58579
◇58604 - AirPort Base Station: DHCP Client ID Support
 http://til.info.apple.com/techinfo.nsf/artnum/n58604
◇58546 - AirPort Base Station: X2 Modem Compatibility
 http://til.info.apple.com/techinfo.nsf/artnum/n58546
◇58531 - Mac OS 9: Keychain Not Applicable to AirPort 1.0
 http://til.info.apple.com/techinfo.nsf/artnum/n58531
◇58521 - AirPort: Compatibility With Earlier Macintosh Products
 http://til.info.apple.com/techinfo.nsf/artnum/n58521
◇58568 - AirPort: Use the Same Software Version on All AirPort Devices
 http://til.info.apple.com/techinfo.nsf/artnum/n58568
◇58727 - AirPort Base Station: Technical Specifications
 http://til.info.apple.com/techinfo.nsf/artnum/n58727
◇58509 - AirPort Base Station: Factory Default Settings
 http://til.info.apple.com/techinfo.nsf/artnum/n58509
◇58548 - AirPort Card: Disable During Air Travel
 http://til.info.apple.com/techinfo.nsf/artnum/n58548
◇58572 - AirPort Base Station: Mounting Orientation Does Not Affect Performance
 http://til.info.apple.com/techinfo.nsf/artnum/n58572
◇58596 - AirPort Base Station: How to Set up for Active Roaming
 http://til.info.apple.com/techinfo.nsf/artnum/n58596

また、AirPortを使ったネットワーク構築の手法を説明したドキュメント「Designing AirPort Networks」のVer.1.3対応版は別にダウンロードできる。なお、このドキュメントは、AirPort 1.3のソフトウエアには含まれている。

◇Designing AirPort Networks 1.3
 http://asu.info.apple.com/swupdates.nsf/artnum/n12022

カテゴリ:Knowledge Base(旧TIL), ネットワーク


スクロールバーのついた複数のTextEditをダイアログボックスに配置したサンプル

サンプルコードに公開された「ScrollingTextUserPane」は、ダイアログボックスに複数のUserPaneを配置し、そこにスクロールバーの付いたテキスト編集コンポーネントのTextEditを配置することのサンプルとなっている。Carbon対応で、CodeWarrior、Project Builder、MPWでビルドできるようになっている。Ver.2.0となっているが、バージョン履歴がないことから、新しく公開されたものと思っていいと思われる。作成されたアプリケーションを起動すると、3つのTextEditによるテキストフィールドが配置され、それぞれスクロールバーがつけられている。編集にかかったテキストフィールドが紫色の枠で囲まれるなど、TextEditごとのアクティベートの処理がきちんと組み込まれている。Carbon対応だが、Carbon Event Managerは使っていない。コントロールの利用方法のサンプルと言えるだろう。

関連リンク:ScrollingTextUserPane 2.0
カテゴリ:アップルからの開発資料, ユーザインタフェース


【TIL】ヘルプでメモリが足りないというエラーが出る場合の対処

Mac OSのヘルプ表示において、メモリが十分あるにも関わらずメモリ不足とエラーを出す場合の対処方法について、Tech Info Libraryに掲載された。Mac OS 9.xおよびUSB Printer Sharing 1.0.1以前を使っている場合に発生する問題としている。初期設定フォルダにある「Appleヘルプ初期設定」フォルダの、Help Viewer Accessorsというファイルを削除すれば問題は解決するとしている。

関連リンク:Mac OS 9: Help Viewer "Not Enough Memory" Message
カテゴリ:Knowledge Base(旧TIL), トラブルシューティング, Mac OS 9