コントロールの使い方

コントロールの作り方

Apolloで用意されているコントロールはForm,Label,Button,Editなど、たくさんあるが、コントロールの生成 方法はほとんど同じだ。

コントロール

各コントロールはクラスとして提供されているので、newで生成する。生成時にnewに与える引数も同じで、

  new(parent_control, symbol, caption)
  

のようになっている。

引数の意味は以下のとおり。

parent_control

生成するコントロールの親コントロールオブジェクトを指定する。

symbol

コントロールにつける変数名のようなもの。親コントロールを指す変数がparentで、子コントロールに付けられた シンボルがbutton_01なら、parent.button_01 は子コントロールを指す。 他の兄弟コントロール*1と同じシンボルを付けても特にエラーにはならないようだ。

caption

コントロールが表示する文字列。指定しなくてもOK。

コントロールの配置

子コントロールの配置位置を決めるには、left,topなどのプロパティで設定するが、子コントロールにとっては 親コントロールの外に出ることはない。つまり、親コントロールがウィンドウ内のどこに配置されていても、 子コントロールにとっての原点(0,0)は親コントロールの左上ということになる。

子コントロールの原点

これはなかなか便利で、コントロールの配置を考えるときに、兄弟コントロールとの位置関係だけを考えて ればよくて、他の親コントロールの位置関係はもうひとつ上のレベルで解決すればいい。

領域を作るときは、PanelやGroupBoxというコントロールを使う。これらはある広さを持ち、中に別のコントロールを 含む機能を持つ。

そのような親コントロール(parent)の中に子コントロール(ControlClassのオブジェクト)を作る方法は以下のとおり。

  children = ControlClass.new(parent, :symbol, "キャプション")
  

シンボルを適切に設定しておけば、childrenには以下の方法でも到達できる。

  children = parent.symbol
  

formがフォームを指しているとすると、form.parent.child のようにラベルを指定していくことで、あらゆるコントロールに 到達できることも覚えておくといいかも。

ListViewの使い方

ListViewは高機能ではあるが、使いこなすのは結構難しいと思う。いまだによくわからないところもあるのだが、 使い方をまとめておこう。

Phi::VS_REPOT

ListViewはListView#view_styleを設定することでいくつかのスタイルを選択できる。まだPhi::VS_REPORTという表形式 しか使ったことがないので、これを説明しよう。

VS_REPORTのListView

ListViewの作り方

ListViewは以下のオブジェクトから構成されている。 ListViewを構成するオブジェクト達

ListViewは以下のように作る。

コードで書くとこんな感じになる。

  listview = Phi::ListView.new(form, :listview, "")
  # パラメータ設定
  listview.read_only =  true            # 書き込めない
  listview.view_style = Phi::VS_REPORT  # スタイルを決定
  listview.row_select = true  # 1行全体を同時に選択状態に
  listview.owner_data = true  # 仮想リストビューを有効
  # 列の見出しの作成
  ["No.", "TIME", "COMMENT"].each {|column_title|
    column = listview.columns.add
    column.caption = column_title
  }
  # on_dataイベント定義
  listview.on_data = proc {|list_view, list_item|
    list_item.caption = xxx       # 1列目を設定
    list_item.sub_items.add(xxx)  # 2列目を設定
    list_item.sub_items.add(xxx)  # 3列目を設定
  }
  # 大きさの設定
  listview.width = xxx
  listview.height = xxx
  listview.columns[0].width = xx  # 1列目の幅
  listview.columns[1].width = xx  # 2列目の幅
  listview.columns[2].width = xx  # 3列目の幅
  

on_dataイベントについて

ListViewのowner_dataをTRUEに設定すると、「仮想リストビュー」になる。 ListViewは表形式のコントロールだから、各行毎にデータを保持しているように見える。しかし、行数が数万件に なるようなListViewの場合、すべての行列のデータをListViewに管理させると、メモリの使用量もばかにならない。 このような場合は、「仮想リストビュー」を使う。

「仮想リストビュー」というのは、一見すると数万行のあるように見えて、実は数行分のデータしか管理してない リストビューのことだ。でも、リストビューをスクロールさせたときには、その行のデータを表示しないといけない。 実は、リストビューをスクロールさせると、スクロールする毎に、「xxx行目のデータをちょうだい、ちょうだい」 と言って来る。これがon_dataイベントである。

実際の仮想ビューは、もっと巧妙で、スクロールさせなくても、リストビュー上をマウスが横切っただけで「xxx行目を 書き直さないといけないからデータをちょうだい」とon_dataイベントを発生させてくる。

on_dataイベントの処理は以下のように定義する。つまり、on_dataイベントの引数にListView本体と、データを設定して 欲しいListItemを渡してくるから、listItemの各列の文字列をRuby側で設定しておけばいい。

  # on_dataイベント定義
  listview.on_data = proc {|list_view, list_item|
    list_item.caption = xxx       # 1列目を設定
    list_item.sub_items.add(xxx)  # 2列目を設定
    list_item.sub_items.add(xxx)  # 3列目を設定
  }
  


戻る


*1同じ親コントロールを持つコントロールの意味で使っている。正式な呼び方はなんて 言うんだろうか。