第10回 全員集合!スクリーンオブジェクト 「3.目的別オブジェクト紹介 その3.一覧」

10−3 目的別オブジェクト紹介 その3.一覧

先ほどのFieldSelectorでは、全ての情報を直接入力する必要がありましたが、用途によっては「選択式」で入力したい場合があります。
このような状況では、「List」「PopUp」というオブジェクトが利用できます。
ListPopUpは、どちらも値の一覧から情報を選択する、という基本的な働きを持っていますが、それぞれ微妙に違っていますので、まずは「List」から説明しましょう。

Listは、

Listオブジェクト
 
設計時実行時
プロパティ .Left×
.List×
.Top×
.Visible×
.Visible Items×
.Width×
メソッド .Add Data[,n][,NODISPLAY]一覧に値を加え、指定があれば、n番目に追加します。
NODISPLAYオプションを指定すると、一時的に表示が先送りされます
.Clear一覧を全て消します
.Hide非表示にします
.NoItems一覧にある全数を取得します
.Redraw再描画します
.Remove n一覧からn番目の値を削除します
.Selected [n]選択されている位置を得るか、n番目を選択状態にします
.Show表示します
.Text(n)n番目のデータを取得します
イベント値を選択した時

となっています。
まず、.Listプロパティが、△印になっていますが、これは、NS Basicのバージョンによって存在したりしなかったりします。
NS BasicのVer.1.x当時、Listオブジェクトは、プログラム中からしか値がセットできなませんでしたので、このプロパティはIDE上にありませんでした。しかし、Ver.2.03から、この.Listプロパティが追加され、IDE上で簡単に初期値がセットできるようになりました。
これは、後から紹介するPopUpオブジェクトも同じです。

.Visible Itemsプロパティについては、ハンドブックに、

  「アイテム数がこの値を超えると、スクロールバーが表示され、スクロールしてリストの全てを見せることができる」

という記述がありますが、実際はIDE上に配置したサイズに左右され、操作に困らないようにスクロール用の上下矢印が表示されるようです。
しかし困ったことに、例えば、実際にセットした値が10個で、.Visible Itemsを40にセットすると、30個の何もないデータがセットされてしまいます。
これは、バグだと思われますが、実用性を考えると、スクロール用の矢印は適当に表示されますので、このプロパティを意図的に設定する必要はないかもしれません。

プログラム中で、値をセットする際は、.Addメソッドを使い、Startupなどのコードに記述するのが一般的です。
例えば、

    List1004.Add "Palm"

のようにします。複数の値をセットする時は、

    List1004.Add "Palm"
    List1004.Add "VISOR"
    List1004.Add "CLIE"

と連続的に行えば良いのですが、このままだと画面上でチラツキを生じる場合があります。このような場合に、,NODISPLAYオプションを指定します。

    List1004.Add "Palm",NODISPLAY
    List1004.Add "VISOR",NODISPLAY
    List1004.Add "CLIE"

こうすると、3つ目のデータ"CLIE"がセットされるまで実際の表示は更新されませんので、チラツキもなく、また、実行速度も速くなります。

一方、.Addメソッドのもう1つのオプションは、挿入位置の指定です。
例えば、値が10個セットされているところに、

    List1004.Add "Palm",5,NODISPLAY
    List1004.Add "VISOR",20,NODISPLAY
    List1004.Add "CLIE"

を実行した場合、5番目に"Palm"というデータが挿入されますが、20番目を指定した"VISOR"はセットされません。
したがって、この.Addメソッドで位置を指定する場合、現在のリストの最大値を超えることは出来ないようです。

次に、データを取得する方法ですが、n番目に登録されている値を得るには、.Text(n)というメソッドを使います。
具体的には、
    Dim strX as String

    strX=List1004.Text(5)
とすると、5番目に登録されている文字列を取り出すことが出来ます。
一方、何番目が選択されているか?という場合は、.Selectedメソッドを使います。
    Dim intX as Integer

    intX=List1004.Selected
とすれば、選択されているのが何番目か、というのが 変数intXに代入されます。この値は、先頭が 1で、最大が、.NoItemsメソッドで得られる値になります。
これらを組み合わせることで、選択されている位置の文字列を得ることが出来ます。
	Dim strX as String

	strX=List1004.Text(List1004.Selected)
となります。
.Selectedメソッドでは、値を設定することで、その位置を選択状態に変えることができます。

    List1004.Selected=4

と代入すれば4番目の選択肢が選択状態になります。

特定の値を削除するには、.Removeを、全てを削除するには、.Clearメソッドを使います。

また、イベントですが、これは「値を選択した時」に発生します。
一見すると「タップ時」と変わらないようですが、スクロール用の矢印をタップしてもイベントが発生しないことから、「選択時」であることがわかります。
ちなみに、続けて同じ値を選択しても発生します。


Listオブジェクトと同様、一覧から値を選択する目的で使われるのがPopUpオブジェクトです。

PopUpオブジェクト
 
設計時実行時
プロパティ .Anchor Left×
.Font ID×
.Height×
.LabelR/W
.Left×
.List×
.Top×
.Visible×
.Visible Items×
.Width×
メソッド .Add Data[,n][,NODISPLAY]一覧に値を加え、指定があれば、n番目に追加します。
NODISPLAYオプションを指定すると、一時的に表示が先送りされます
.Clear一覧を全て消します
.Hide非表示にします
.NoItems一覧にある全数を取得します
.Redraw再描画します
.Remove n一覧からn番目の値を削除します
.Selected [n]選択されている位置を得るか、n番目を選択状態にします
.Show表示します
.Text表示されている値を参照するか、セットします
.ItemText(n)n番目の値を取得します
イベント値を選択した後

ListPopUpは、どちらも一覧で選択できるオブジェクトであり、基本的なところは似ています。
なので、ここでは、両者の相違点を中心に説明したいと思います。
まず、プロパティのうち、高さを表す.Heightですが、PopUpオブジェクトは、表示上1段で表示されるため、関係がなさそうに見えます。しかし、実際のオブジェクトは、この.Heightで指定した値の中段にPopUpが表示されます。

    

そして、選択用の▼をタップすると、.Visible Itemsプロパティで設定した行数だけ一覧が表示されます。
このプロパティも、Listオブジェクトと同様に実際のアイテム数を越えて指定すると、勝手なデータが追加されるようです。
また、選択肢とは無関係な.Labelプロパティではじめに表示される文字列が指定できますので

  「タップして選択してね」

などの文字列を表示できます。
.Listプロパティで初期値が設定できるのは、Listオブジェクトと同じように、バージョンによる制約があります。
.Font IDがありますので、フォントの種類が指定できるのも、Listオブジェクトにはない機能ですね。
(ハンドブックには、Listにも、.Font IDの記述がありますが・・・)

値の追加と削除については、Listオブジェクト同様に、.Addメソッドを使います。 大きく異なるのが、選択された値を取得する方法です。
Listオブジェクトでは、
    Dim strX as String

    strX=List1004.Text(List1004.Selected)
でしたが、PopUpオブジェクトでは、
	Dim strX as String

	strX=Pop1004.ItemText(Pop1004.Selected)
と、.ItemText()メソッドを使います。
では、もう1つ、.Textメソッドがあるけど、何が入るの?と思いますね。実は、.Textメソッドは「表示されている文字列」を取得するものです。
ちょっと、ややこしいですが、例えば、

    設計時
       .Label="タップして選択してね"

として、実行直後、Popupから何も選択していない状態で、次のコードを実行します。

      1)Pop1004.Text
      2)Pop1004.ItemText(Pop1004.Selected)

その結果、1)の場合には "タップして選択してね"が入りますので、設計時にセットした初期値が入っています。
一方、2)の場合には、"***"という文字列が返されます。
これは、何も選択されていない状態では、.Selectedメソッドで得られる値が「0」のままであるため、データが選択されないからです。
(先頭データは、「1」番目のデータになります。)
しかし何も選択しなくても、画面上には「タップして〜・・・!」の表示がありますので、その表示は、.Textメソッドでは取得できるわけです。
ここで、Listオブジェクトとの違いとして「何も選択していない状態」がある、という点が新たにわかりましたね。
ちょっとした問題として、PopUpオブジェクトでは、実際の表示と選択されている値が異なる場合があることを知っておいてください。
PopUpから、選択をすると「基本的に」表示は「選択されている値」になるのですが、実際ズレを生じることがあります。
したがって、.Textメソッドで値を取得する場合は、事前に.Redrawメソッドで再描画してから取得すると良いでしょう。もちろん、.ItemText()メソッドを使うと、常に選択されているテキストが取得可能です。

イベントは、Listが「選択時」であったのに対して、PopUpは「選択後」です。 具体的には、▼をタップして一覧表示があった後、その中の1つを選択して一覧が閉じた時にイベントが発生しているようです。 どちらも、感覚的に理解できる動作なので、それほど困惑することはなさそうですが、ちょっとした動きの違いがあるようです。

このように、一覧にデータを入れ、そこから選択するオブジェクトとして、ListPopUpが用意されています。 これを使えば、大量のデータから簡単に選択するようなプログラムを作ることが出来ます。もちろん、大量のデータをデータベースと合わせて使うと、更に便利になりますが、問題は「並べ替え」が出来ない点でしょうか。
Visual BASICでは、.Sortedプロパティを使って、自動的にデータの並べ替えが可能ですが、NS Basicでは現時点では実装されていません。
ソートのルーチンを記述しても良いのですが、自動的に並べ替えを行ってくれる仕組みとして、キーモードのデータベースをこっそり利用する、という方法もありますので、興味のある方は、試してみてください。


前へ    目次へ     次へ

第10回 全員集合!スクリーンオブジェクト 「3.目的別オブジェクト紹介 その3.一覧」