タイトルAppleScript Working》3 _ AppleScript Studioでテーブルコントロールを使う(2)カテゴリーユーザインタフェース, AppleScript, AppleScript Working
作成日2002/2/6 15:16:7作成者新居雅行
――――AppleScriptプログラム上でのテーブル
プロジェクトにはAppleScriptKit.asdictionaryというファイルがあって、用語が参照できるので、さっそくそれを見ながらのプログラミングということになるのだが、余分な情報があって見づらいのも確かだ。いずれにしても、次のようなオブジェクトの階層があることを知っておく必要がある。
まず、テーブルのオブジェクトは、Data View SuiteにあるTable Viewクラスである。このクラスがテーブルそのものであるが、テーブルの各列としては、さらにTable Columnクラスがあり、このオブジェクトは1つのテーブルに複数個存在する。
一方、Table Viewクラスからは、データソースを示すクラスであるData Sourceも複数個存在するという定義になっているが、Interface Builderで接続したASKDataSourceを参照するには、「Data Source 1」として、1つ目のデータソースを指定すればよい。
続いて、Data Sourceクラスを見るが、いろいろとややこしい感じがするだろう。ここで、考え方として、データソースをデータベースのテーブルのように考えればよい。つまり、データソースには複数のカラムがあるというのが1つの見方だがこの場合のカラムはデータではなくテーブル構造を示すものだ。そして、データ自体は、まず行に保持されるから、データソースには複数の行があるということになる。そして、その行に対して、カラムに対応した複数のセルがあるということになる。1対多の関係を→で示すと、次のようになる。

テーブル定義:Data Source → Data Column
記録データ:Data Source → Data Row → Data Cell

そして、セルにあるデータそのものは、Data Cellクラスのcontentsプロパティで参照することができる。
ここで、とりあえずプログラムをみていただきたい。前記のユーザインタフェースで、ボタンをクリックしたときに、on clickedハンドラが呼び出される。プログラムは後でテキストでも示す。

◇作成したプログラム
 

実際の動きは次のようになる。プログラムを実行すると、まずはウインドウが表示され、ボタンとテーブルが表示されるが、テーブルの中は何もデータはない。見出しだけ、Interface Builderで設定した通りになっている。
そこで、ボタンをクリックすると、テーブルにデータが入力される。また、ダイアログボックスが表示されるが、2行目の2列目のデータが取り出されて、ダイアログボックスで表示されているわけだ。さらに、その後に、1列目の列見出しの文字列もダイアログボックスで表示される。

◇ボタンをクリックするとテーブルにデータがセットされる
 

さらに、テーブルのデータは、ダブルクリックするとセル単位で編集できるようになっている。編集をできるかできないかは、Interface Builderでの設定で可能となっている。

◇テーブルではテキストの編集もできる
 

プログラムをチェックしていこう。まず、ここでクリックしたボタンのclickedハンドラだから、引数のtheObjectはボタンを参照している。従って、以下のようにすれば、変数のtheWindowは、ウインドウそのものを参照する。

set theWindow to window of theObject

次にテーブルをどうすれば参照できるかだが、NSScrollViewの中にNSTableViewがあったことを思い出してほしい。そうすれば、以下のようにすると、theTableがテーブルを参照し、dsがそのテーブルのデータソースを参照できるようになる。

set theTable to table view "table1" of view "scView1" of theWindow
set ds to data source 1 of theTable

初期状態では、データソースにはカラムが一切定義されていないため、行の追加はできない。フィールド定義されていないテーブルのようなものである。そこで、データソースに、新たにカラムを作成するが、makeコマンドを使う。つまり、データソースの中のdata columnの集合の最後に、新しくdata columnを作る。Nameというプロパティは、その列の名前である。列の名前は、テーブルに表示された列名と異なってもかまわないが、データソースを操作するときには、この名前を使うことができる。(2行に分割される部分は「ツ」と記載するが、実際には1行で入力してもらいたい。)

make new data column at the end of the data columns of ds ツ
with properties {name:"num"}
make new data column at the end of the data columns of ds ツ
with properties {name:"place"}

これでカラムが定義できたので、続いて行を作ってデータを保存しておく。行についても、同様で、データソースの行の集合の最後に新しくdata rowをmakeコマンドで作る。ここで、作った行への参照をnewRowという変数におさめておく。そして、その新しい行に含まれているdata cellオブジェクトを参照し、そのcontentsプロパティに対して文字列を設定することで、実際にテーブルにその文字が見えるようになるという具合である。

set newRow to make new data row at the end of data rows of ds
set contents of data cell 1 of newRow to "25"
set contents of data cell 2 of newRow to "浦和"
set newRow to make new data row at the end of data rows of ds
set contents of data cell "num" of newRow to "45"
set contents of data cell "place" of newRow to "鳩ヶ谷"

data cellについては、番号で指定してもいいが、data columnのtitleプロパティの値を利用して、どのセルかと言うことを指定することもできる。上記のプログラムは2つのバリエーションを示しているので、プログラムと、テーブルでのデータ設定結果を見比べてもらいたい。
ところが、ここで、次のようなプログラムは動かないものかと若干は期待したけど、これはだめであった。やはり、data rowがさらに複数のdata cellというオブジェクトにつながっているため、直接書き込むことはできないのである。

make new data row at the end of data rows of ds ツ
with properties {num:"34", place:"所沢"}

逆にデータソースからデータを取り出す場合も、まったく同様である。たとえば、2行目の2列目のデータを取り出して、ダイアログボックスに表示するのは、次の部分である。

display dialog (contents of data cell "place" of data row 2 of ds) as string

また、テーブルに見えている列の名前は、table columnオブジェクトを参照して、そのheader cellを参照し、さらにそれのstring valueプロパティを参照することで、得ることができる。このあたりは、オブジェクト階層が深い。

display dialog (string value of header cell of table column 1 of theTable) as string

列幅については、header cellのcell sizeプロパティを取得することでわかる。{ 30, 17 }のようなリスト形式で得られ、単位はドット数である。1項目目が幅なので、

item 1 of cell size of header cell of table column 1 fo theTable

のようにすれば、列幅が分かるということだ。
他に知りたいものとなると、まずは行数となると思われる。行数は、countコマンドで数えればいいので、変数dsがデータソースを参照しているとすれば、

set numRows to count (data rows of ds)

とすれよい。
テーブルの中で選択されている行や列を知るには、table viewクラスのselected rowやselected columnプロパティを使う。これだと、何行目が選択されているのかが分かるが、1行目あるいは1列目は、いずれのプロパティも「1」になる。これらのプロパティが0の場合には選択されていないことになる。たとえば、2行目を選択すると、行全体は選択されているが、特定の列は選択されていないので、selected rowは2であるが、selected columnは0となっている。なお、列を選択できないようにAttributesを設定すると、selected columnプロパティの取得時にはエラーが出る。

データソースとテーブルが分離していることと、データソース内部でのデータ構造を理解することで、テーブルは自由に扱えるようになるだろう。
(この項、以上)
関連リンク