「Curlにて実現したい動作について」カテゴリーアーカイブ

Curlに対する要求仕様について、過去にお問い合わせの多かった事例を紹介いたします。記載日時点での状況(最新or問い合わせ時指定バージョンにおける仕様)を元に回答したものです。
 

[Ctrl+C]と同様の処理を行うコンテキストメニューを作成したい

◆ご質問◆
コンテキストポップアップメニューのメニューに「コピー」を追加し、
追加したメニューの「コピー」を選択した際に「Crtl+C」と同様の機能を実装することは可能でしょうか?

◆回答◆
FocusManagerが管理する標準のコマンド(コピーコマンド)を取得し、
MenuPaneを生成して、そのMenuActionに取得したコピーコマンドを割り当てることで実現可能です。

詳細はサンプルをご参照ください。

{curl  5.0,6.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}

{define-class public MyTextFieldUI {inherits StandardTextFieldUI}
  {constructor public {default control:#TextField=null, …}
    {construct-super control = control, …}
  }

  {method private {make-menu-pane-for-text-field view:View}:MenuPane
    let fm:FocusManager = {non-null view.focus-manager}
    {return
        {MenuPane
            {on e:GrabRelease do
                {if self.input-method-enabled? then
                    let local?:bool = {set? self.input-method-enabled?}
                    {try
                        set self.input-method-enabled? = false
                     finally
                        {if local? then
                            set self.input-method-enabled? = true
                         else
                            {unset self.input-method-enabled?}
                        }
                    }
                }
            },
            {MenuAction
                label = {host-localize “Cut”},
                bound-command = {fm.get-command “cut”}
            },
            {MenuAction
                label = {host-localize “Copy”},
                bound-command = {fm.get-command “copy”}
            },
            {MenuAction
                label = {host-localize “Paste”},
                bound-command = {fm.get-command “paste”}
            },
            {MenuAction
                label = {host-localize “Delete”},
                bound-command = {fm.get-command “delete”}
            }
        }
    }
  }

  {method open public {on-context-menu-event e:ContextMenuEvent}:void
    {if not e.consumed? then
        {if-non-null v = {self.get-view} then
            {if-non-null
                menu-pane = {self.make-menu-pane-for-text-field v}
             then
                {e.consume}
                {menu-pane.popup self, e.x, e.y}
            }
        }
    }
  }
}

{do
    {the-standard-look-and-feel.register-ui
        TextField,
        MyTextFieldUI
    }
}

{TextField width = 100pt}

全選択する範囲をアクティブなフレーム内のみにしたい

◆ご質問◆
フレームを使用して表示している画面で「Crtl+A」を押下した場合、
画面全体が選択状態になりますが、アクティブなフレーム内のみ全選択にすることは可能でしょうか?

◆回答◆
DiscreteGraphicSelectionFrameを適切にコントロールすれば可能ではないでしょうか。

[Curl開発者ガイド]→[グラフィカルユーザーインターフェイス]→[選択]
→[個別選択]→[個別選択の概観の設定]
ここのサンプルにCtrl+Aで選択されるオブジェクトが
フレーム(DiscreteGraphicSelectionFrame)毎になっています。

アクティブなフレームというのがどのグラフィック階層のフレームであるのかを
プログラムで指定する必要があるかとは思いますが、
その指定を予め決めておけばいいのではないでしょうか。

常に行選択状態とならないRecordGridでTab遷移を行うには

【ご質問】
常に行選択状態とならないRecordGridにて、
Tabでフォーカス遷移をさせることは可能でしょうか。

【回答】
オープンコントロールを利用してStandardRecordGridUIに
処理を追加することで、Tab遷移をさせることが可能となります。

詳細はサンプルをご参照ください。
(修正箇所はstandard-record-grid-ui.scurlの2440行目から2444行目までを追加しております。)

ただし、オープンコントロールを使用しているため、
パッケージをロードする際にパフォーマンスに影響が生じる可能性がありますので、
使用時にはご注意ください。

ExcelからRecordGridにデータを貼り付けするには

【ご質問】
Excelで複数セルをコピーし、RecordGridの一つのセルを選んで貼り付けを行うと、
そのセルを基点に複数のセルにまたがって貼り付ける様にしたいのですが可能でしょうか。

【回答】
RecordGridのペーストコマンド(RecordGridPaste)を
エクセルからのペーストの機能に追従する様に改変し、
RecordGridの内部で使用されているTextFieldから呼び出すようにすることで実現出来ます。

詳細はサンプル(バージョン7・8用バージョン5・6用)をご参照ください。

RecordGridにてrecord選択時にKeyPressイベントを発生させるには

【ご質問】
Record選択時にEnterキーを押下しても、Actionイベントが発生せず、
editable?=trueのカラム上が選択範囲のときのみKeyPressイベントが発生するようでした。
画面初期表示時に、RecordGridにKeyPressイベントが発生するように
フォーカスを当てたいのですが、どのようしたら実現できるでしょうか?

【回答】
RecordGridにイベントを追加するのではなく、
SkinnableRecordGridUIクラスにKeyPressイベントを追加することで、
RecordGridにKeyPressイベントが発生させることが可能です。

また、editable?=falseのセルでもイベントが発生するようにするためには
カスタムセルを作成し、セルが持つTextFieldにKeyPressイベントを追加します。

詳細はサンプルをご参照ください。

{curl 7.0,8.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}
{applet
    {compiler-directives careful? = true}
}

{define-class public EnterKeyCell {inherits StandardStringCell}

  {constructor public {default}
    {construct-super}
  }

  {method public {create-editor}:TextField

    let editor:TextField = {super.create-editor}

    ||セル上で操作するテキストフィールドに対して、
    ||Enterキーのイベントを追加する。
    {editor.add-event-handler
        {on e:KeyPress do
            {if e.value == KeyPressValue.enter then
                {popup-message “EnterKey Press Event 拾いました。”}
                {e.consume}
            }
        }
    }
    {return editor}
  }
}

{let rs-choice-grid:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField
                “choice”, caption = “選択”, domain = bool
            },
            {RecordField
                “service”, caption = “サービス”, domain = String
            }
        },
        {RecordData choice = false, service = “良いサービス”},
        {RecordData choice = false, service = “普通サービス”},
        {RecordData choice = false, service = “悪いサービス”}
    }
}

{let rg:RecordGrid =
    {RecordGrid
        width = 264pt,
        height = 192pt,
        name = “sample”,
        automatic-columns? = false,
        column-selection-enabled? = false,
        record-selection-enabled? = true,
        select-current-record? = true,
        record-source = rs-choice-grid,
        {RecordGridColumn  width = 0.8cm, “choice”},
        {RecordGridColumn  width = 3.2cm, “service”, editable? = false, cell-spec = EnterKeyCell},
        ui-object = {SkinnableRecordGridUI                                       
                        {on e:KeyPress do
                            {if e.value == KeyPressValue.enter then
                                {popup-message “EnterKey Press Event 拾いました。”}
                                {e.consume}
                            }
                        }
                    }
    }
}

{Dialog rg}

{do
    {rg.request-key-focus}
}

入力メソッドがアクティブ時に文字列を取得するには

【ご質問】
入力メソッドがアクティブの時(input-method-focus-behaviorがInputMethodFocusBehavior.activateの時)の
入力キーイベントや文字列を取得することは可能でしょうか?

【回答】
“StartCompositionEvent”、”CompositionChangeEvent”、
“EndCompositionEvent”、”CompositionResultEvent”を利用することで可能です。

これらのイベントを入力コントロールのUIクラスに記述してはいかがでしょうか。

詳細は以下のサンプルをご参照ください。

{curl 7.0,8.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}
{applet
    {compiler-directives careful? = true}
}

{let start:Frame = {Frame color = “blue”, font-weight = “bold”}}
{let change:Frame = {Frame font-weight = “bold” }}
{let end:Frame = {Frame color = “blue”, font-weight = “bold”}}
{let result:Frame = {Frame color = “red”, font-weight = “bold”}}

{VBox
    {TextField width = 5cm,
        input-method-focus-behavior = “activate”,
        ui-object = {SkinnableTextFieldUI
                        {on e:StartCompositionEvent do
                            {start.clear}
                            {change.clear}
                            {end.clear}
                            {result.clear}
                            {start.add replace? = true, “イベントが開始しました”}
                        },
                        {on e:CompositionChangeEvent do
                            {change.add replace? = true, e.string}
                        },
                        {on e:EndCompositionEvent do
                            {end.add replace? = true, “イベントが終了しました”}
                        },
                        {on e:CompositionResultEvent do
                            {result.add replace? = true, e.string}
                        }
                    }
    },
    {Table columns = 2,
        “イベントの開始”, start,
        “入力中の文字列”, change,
        “イベントの終了”, end,
        “入力結果”, result
    }
}

MessageDisplayの検証時の背景色変更について

◆ご質問◆
MessageDisplayを使用しTextFieldコントロールの検証を行った場合に、
背景色を指定することは可能でしょうか。
TextFieldコントロールのcontrol-content-backgroundオプションと、
MessageDisplayを同時に指定した場合、control-content-backgroundの設定が反映されません。

◆回答◆
MessageDisplayのプロパティ「required-entry-background」を設定することで可能です。

詳細はCurl開発者ガイドの
「グラフィカル ユーザー インターフェイス」→「ダイアログとコントロール」
→「コントロールにおけるデータ検証」
をご参照ください。

プログレスバーの表示

◆ご質問◆
検索などで長い時間がかかる処理が走った際に、
プログレスバーで処理中であることを表現したいです。
タイマーで実現できるかと試行錯誤しましたが、どうもうまくいきませんでした。
どのように行えばよいのでしょうか?

◆回答◆
このような場合、別プロセスにてプログレスバーを表示させることが宜しいかと思います。

Curl内の処理で時間が掛かる場合、タイマーなどでは対応できません。
Curlの検索の処理に時間が掛かっている間は他の処理を行なうことができず、
止まっているような状態に見えます。

このような場合には、長い時間が掛かる処理を行なっているアプリとは
別のプログレスバーを表示するだけの別アプリを起動しし、
それを表示すれば良いかと思います。

詳細はサンプルをご参照ください。
これは、ボタンを押すと1~10000の間でとある計算を行ないます。
その間、プログレスバーを表示しています。

カスタムセルのTab遷移

【ご質問】
RecordGridにTextFieldを含むカスタムセルを設定したところ、
このセルにTab移動でフォーカスを当てることができません。
RecordGridに設定したカスタムセル間をTab移動するには、どうすれば良いでしょうか。

【回答】
本来RecordGridを含むコンテナでのTabキーでの移動はセル自身にフォーカスが移動します。
TextFieldを含むカスタムセルを設定すると、セル自身にフォーカスが移動した際
TextFieldが埋め込まれているため本来の動きができません。

回避策としては、セル自身にフォーカスが当たったときに
TextFieldでTabキーが押されたときの処理を追加することなどが考えられます。

詳細は以下のサンプルをご参照ください。

{curl 6.0,7.0,8.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}

{def grid =
    {RecordGrid
        record-source = {RecordSet
                            {RecordFields
                                {RecordField “First”, domain = String},
                                {RecordField “Last”, domain = String},
                                {RecordField “Age”, domain = int}
                            },
                            {RecordData First = “John”, Last = “Smith”, Age = 25},
                            {RecordData First = “Jane”, Last = “Smith”, Age = 29},
                            {RecordData First = “Jane”, Last = “Jones”, Age = 28}
                        },
        automatic-columns? = false,
        select-current-record? = true,
        editable? = true,
        display-record-selectors? = false,
        display-navigation-panel? = false,
        select-current-record? = true,
        display-filler-column? = true,
        column-resizable? = false,
        column-movable? = false,
        multiple-selection-enabled? = false,
        {on e:FocusIn at gird:RecordGrid do
            {InputCell.cell.become-active}
        },
       
        {RecordGridColumn “First”, cells-take-focus? = false,editable? = false},
        {RecordGridColumn “Last”, cells-take-focus? = false,editable? = false},
        {RecordGridColumn “Age”, halign = “right”, cell-spec = InputCell}

    }
}

{define-class public InputCell {inherits StandardRecordGridCell}

  field private _input:TextField =
      {TextField
        color = “black”,
        halign = “right”,
        max-chars = 10,
        takes-focus? = true,
        active-traversal-container = null,
        {validate-with {NumericValidator}}
      }

  let public cell:#InputCell

  {constructor public {default …}
    {self.add-internal self._input}

    {if InputCell.cell == null then
        set InputCell.cell = self
    }
   
    {self.add-event-handler
        {on e:FocusIn at cell:InputCell do
            {self._input.become-active}
        }
    }
    {self._input.add-event-handler
        {on e:KeyPress at tf:TextField do
            {if e.value == KeyPressValue.tab then
                {if (self.grid.current-index == 0  and e.shift?) or
                    (self.grid.current-index == self.grid.record-source.size – 1 and not e.shift? )
                 then
                    {self.grid.active-traversal-container.traverse forward? = (not e.shift?)}
                    {e.consume}
                    {return}
                }
                {self.active-traversal-container.traverse forward? = (not e.shift?)}
             else
                {super.on-key-press e}
            }
        }
    }
  }

  {method public {note-grid-focus-out}:void
    {self.attempt-update self._input.value}
    {super.note-grid-focus-out}
  }
 
  {method public {refresh-data}:void
    {super.refresh-data}
    let (val:any, valid?:bool) = {self.get-data}
    set self._input.value = {if val == null then “” else val & “”}
   
  }    
}

{View
    {StandardActiveTraversalContainer
        {VBox
            {TextField width = 100pt},
            grid,
            {CommandButton}
        }
    },
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}

キャッシュの制御に関して

【ご質問】
アプリケーションサーバ上のアプリケーションを更新した際に、
クライアントPC側のキャッシュがONになっていると、
Curlコントロールパネルより、キャッシュを空にしないと
アプリケーションが正常に起動出来ないことがあります。

アプリケーションに更新があった際に、自動的にキャッシュを空にする方法
または、キャッシュのON/OFFに依存しない回避策はありますか?

【回答】
“キャッシュ”には”ブラウザのキャッシュ”と”CurlRTEのキャッシュ”の2つが関係しています。
問題を解決するためには”ブラウザのキャッシュ”、”CurlRTEのキャッシュ”の両方を
適切にコントロールする必要があります。

例えば、CurlRTEにキャッシュが残っている場合、
サーバのアプリケーションが修正されたとしてもCurlRTEのキャッシュ自身を使用して、
新しいアプリケーションに更新されない可能性があります。
また、CurlRTEのキャッシュを使用しない設定等を行なっても
ブラウザキャッシュが残っている場合には、サーバに新しいアプリケーションを
取得しに行かず、正常にアプリケーションが更新されない可能性があります。

CurlRTEのキャッシュをコントロールするには
「resync-as-of」アクセサを使用します。
これを使用すると、指定された日時より前にCurl RTEのキャッシュに
保存されたものはサーバからコンポーネントを取得しようとします。
この機能を利用してresync-as-ofで指定する日時をデプロイの日時に更新していけば
古いアプリケーションのコンポーネントをキャッシュしている端末は
resync-as-ofで指定された日時より古いキャッシュとなっているはずであるため、
新しいアプリケーションのコンポーネントを取得しようとします。

ブラウザのキャッシュをコントロールするには、クライアント側のブラウザの設定を
変更してキャッシュを行わないような設定にすることも可能です。
また、サーバ側でキャッシュされたファイルの有効期限を短く設定することも出来ます。
上記のような方法でブラウザのキャッシュに古いアプリケーションのコンポーネントが
キャッシュされないように調整を行うことで問題回避を図ることが出来ると思います。

詳細は、Curl開発者ガイドの
[コンテンツの構成要素]-[キャッシュと同期]
の項をご参照ください。

RecordGridのコントロールの色変更について

【ご質問】
RecordGridの以下項目について、別々に色を指定することは可能でしょうか?

・レコードセレクタ
・列ヘッダ
・スクロールバー

【回答】
レコードセレクタ、スクロールバーなどRecordGridを構成するコントロールは
オープンコントロールを使用することで色の変更をすることが可能です。

詳細はサンプルをご参照ください。

オープンコントロール内のStandardRecordGridUIクラスでスクロールや
レコードセレクタ等の色を変更するセッターを追加してあります。
(controls/standard-record-grid-ui.scurlの111行目付近)

※オープンコントロールは標準コントロール部品全体を複製しているため、
  ソースのコンパイル等に時間を要し、
  全体の処理速度が遅くなる可能性がありますので、
  使用する際はお気をつけください。

網掛け状態で表示するには

【ご質問】
グラフィックを網掛け状態で表示することは可能でしょうか。

【回答】
グラフィックオブジェクトのdrawメソッドをオーバーライドすることにより、
網掛け状態を表現することが可能です。

詳細は以下のサンプルをご参照ください。
(サンプル内のdrawメソッドで縦、横の線を網目状にオブジェクトに対して引いています。)

{curl 6.0,7.0,8.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}

{define-class public AmikakeFrame {inherits Frame}

  {constructor public {default …}
    {construct-super …}
  }

  {method public {draw renderer2d:Renderer2d}:void
    ||縦
    {for i:Distance = 0pt below self.width step {any-to-Distance 2px} do
        {renderer2d.render-line
            i, 0pt,
            i, self.height,
            fill-pattern = “black”,
            stroke-thickness = {any-to-Distance 1px},
            line-style = “solid”
        }
    }
    ||横
    {for i:Distance = 0pt below self.height step {any-to-Distance 2px} do
        {renderer2d.render-line
            0pt, i,
            self.width, i,
            fill-pattern = “black”,
            stroke-thickness = {any-to-Distance 1px},
            line-style = “solid”
        }
    }
  }
}

{value
    let af:AmikakeFrame = {AmikakeFrame width = 200pt, height = 200pt, background = “red”}
    af
}

 

Curlコントロールパネルの設定

【ご質問】
WindowsXP、administrator権限でRTEをインストールし、
Curlコントロールパネルで設定したホスト追加・アプレットの同期設定を
各ユーザーで利用させたいです。

共有端末ですが各ユーザー毎にログインするので、
ユーザー毎にセッティングする必要があります。

何かいい方法はないでしょうか。

【回答】
RTEのコントロールパネルの設定は各ユーザ毎に
ファイルに保存され設定されております。
つまり、そのファイルを書き換えてしまえば
任意の設定が各ユーザ毎に設定されることになります。

詳細な内容・具体的方法に関しては技術サポートにお問い合わせ下さい。
http://www.curlap.com/support/

C++で作成したDLLについて

【ご質問】
CurlのDLLインターフェースは
C++で作成されたDLLもサポートしているのでしょうか。

【回答】
C++で作成されたDLLはサポートされていません。

どうしてもC++で書かれたDLLを使わなければならない状況であるなら、
対象のDLLをラップして、C言語で書かれたDLLなどを作成することが回避策になると思います。
つまり、以下のイメージになります。

C++のDLL → ラップしたDLL → Curl
 (ラップしたDLLはC言語で書かれている)
 

ActiveXによるExcelファイルの保存形式変更について

【ご質問】
CurlからActiveXを利用してExcelファイルを開いた際、
ファイル保存時にファイル保存形式を変更することは可能でしょうか。

具体的にいうとxlsファイル⇔csvファイルの保存形式を
Curlの処理上で行いたいというものです。

[参考]
以下のURLのVBのメソッドにおけるFileFormat選択です。
http://msdn.microsoft.com/ja-jp/library/cc329026.aspx

【回答】
ファイル保存時にファイル形式を変更するためには、
SaveAsメソッドの第2引数を指定する必要があります。

第2引数に1を指定するとxls形式に、
第2引数に6を指定するとcsv形式でファイルが保存できます。

コマンド・シェルからのCurlアンインストールについて

【ご質問】
Curlのアンインストールをコマンド・シェルから実行することは出来るのでしょうか。

【回答】
ドキュメントには記載されておりませんが、コマンドラインからアンインストールを行う方法は存在します。
以下 c:\Program Files 配下にCurlがインストールされている前提で説明します。

・インストールされているCurlを全てアンインストールする場合
コマンドプロンプトにて以下のコマンドを実行することでアンインストール出来ます。
“c:\Program Files\Curl Corporation\Surge\「X]\bin\config.exe” –silent –uninstall-completely
※1.[X]はインストールされているCurlの最上位バージョン+1の数字になります。
※2.c:\Program Files\Curl Corporation\Surge 配下のファイル削除などを行うため
   コマンド実行時のカレントフォルダは c:\Program Files\Curl Corporation\Surge
   以外のフォルダである必要があります。

・インストールされているCurlを全てアンインストールする場合
コマンドプロンプトにて以下のコマンドを実行することでアンインストール出来ます。
“c:\Program Files\Curl Corporation\Surge\[X]\bin\config.exe” –silent –uninstall-kernel [Y]
※1.[X]はインストールされているCurlの最上位バージョン+1の数字になります。
※2.[Y]はアンインストールするCurlのバージョン+1の数字になります。
※3.このコマンドを使用してインストールされているCurlの最上位バージョンのアンインストールは出来ません。

run-host-processについて

◆ご質問◆
 C言語のソースを変更しても良いのですが、例えばrun-host-processからexeファイルを
 実行する際に、exeファイル内ではexeファイルがあるフォルダを基準にした相対パスを使える
 ようにすることは可能でしょうか?

◆回答◆
Curlからexeファイル内の動きを規定する(今回は基準になるパスの変更)ことは不可能です。

exeファイルで読み込む設定ファイルの場所を
exeのプログラム内で持つのではなく引数として設定するというのは
いかがでしょうか。
run-host-processではexeファイルへの引数を渡すことが
できますのでその設定ファイルのパスをrun-host-process経由で
exeへ渡すようにするというのはいかがでしょうか。

Enterキー長押し時のイベント制御

【ご質問】
TextFieldのValueFinishedイベントやCommandButtonのActionイベントで
Enterキーの長押しやCommandButtonを連続ボタン押下された際に、
TextFieldやCommandButtonでイベントを一回のみ発生するようにしたいのですが、可能でしょうか。

【回答】
各コントロールでhandle-eventをオーバーライドして
各イベントを制御すれば宜しいのではないでしょうか。

詳細は以下のサンプルをご参照ください。 

{curl 6.0,7.0,8.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}

||連続押しができないボタン
{define-class public MyCommandButton {inherits CommandButton}

  {constructor public {default …}
    {construct-super …}
  }
 
  {method public {handle-event event:Event}:void
    {if event isa Action then
        set self.enabled? = false
       
        {dispatch-events true}
        {super.handle-event event}
        {dispatch-events true}
        set self.enabled? = true
     else
        {super.handle-event event}
    }
  }
}

{define-class public MyStandardTextFieldUI {inherits StandardTextFieldUI}

  field public fire?:bool = true
 
  {constructor public {default …}
    {construct-super …}
  }
 
  {method public {on-raw-key-release e:RawKeyRelease}:void
    set self.fire? = true
  }
 
  {method public {on-pointer-press e:PointerPress}:void
    set self.fire? = true
  }

}
||ValueFinishedイベント抑制TextField
{define-class public MyTextField {inherits TextField}

  {constructor public {default …}
    {construct-super …}
    set self.ui-object = {MyStandardTextFieldUI}
  }

  {method public {handle-event event:Event}:void
    {if event isa ValueFinished and (self.ui-object asa MyStandardTextFieldUI).fire? then
        {super.handle-event event}
        set (self.ui-object asa MyStandardTextFieldUI).fire? = false
     elseif not event isa ValueFinished then
        {super.handle-event event}
     elseif not (self.ui-object asa MyStandardTextFieldUI).fire? then
        ||
     else
        {super.handle-event event}
        set (self.ui-object asa MyStandardTextFieldUI).fire? = true
    }
  }
}

{value
    {VBox spacing = 10pt,
        {MyTextField width = 100pt,
            {on e:ValueFinished at tf:TextField do
                {dump e}
            }
        },
        {MyCommandButton label = “二度押し禁止”,
            {on e:Action do
                {dump e}
                ||時間の掛かる処理の代わり
                {sleep 3s}
            }
        }
    }
}

ListBoxで値とラベル名が別の内容の場合において、ラベル名(label)を取得する方法

【ご質問】
ListBoxで複数の行を定義しているとき、値とラベル名が別の内容で
設定されていた場合、選択された行の値(value)ではなく、
ラベル名(label)を取得する方法を教えてください。

例えば、valueが「aa」、captionが「AA」と設定しているとき、
AAを取得したい場合です。

【回答】
以下のサンプルをご参照ください。

{curl 6.0,7.0,8.0 applet}

{VBox
    {italic Select at most one of the following pets:},
    {ListBox
        selection-policy = “single”,
        height = 1.0in,
        “Aardvark”, “Cat”, “Dog”, “Elephant”, “Gnu”, “Zebra”,
        {ListValueItem
            “This is value.”,
            label = “This is label.”
        },
        {on ValueFinished at lb:ListBox do
            {for x:any in lb.selected-items do
                {dump x}
                {popup-message {x.label.get-text}}
            }
            {for y:any in lb.value do
                {dump y}
            }
        }
    }
}

また、以下のFAQをご参照ください。
http://developers.curlap.com/faq/48-faq-specification/323-listbox.html

アプレットのバージョンアップに関して

【ご質問】
最新メジャーバージョンのCurl RTEで動作できるように、Curlアプレットをアップグレードしたいのですが、どの様にすればよいのでしょうか。

【回答】
以下のサイトより Curl RTE 又はCurl CDE・IDEをダウンロードしてください。
 Curl RTE:        http://www.curlap.com/download/rte/
 Curl CDE・IDE:  http://www.curlap.com/download/ide/
まずCurl IDE の開発者ドキュメントを確認頂き、現行アプレットのRTEバージョンとアップグレード後のRTEバージョン間の差異を確認頂き、必要に応じて、APIの修正を行って頂き、バージョンアップ後のアプレットのテスト実施し、問題なければ、新しいRTEでのアプレットの稼働ができるようになります。

ソースコード修正時に、CDEのご利用をお勧めします。
CDEを使用することで、静的なエラーチェックが行え、
大部分の修正箇所を特定することが可能となります。
それぞれのインストール方法についてはインストールガイドをご参照ください。

その後、アプレット及びマニフェストのヘラルドを新しいバージョンに変更してください。
自動的に変更するツールはありませんが、Curl CDE・IDEを使用すれば
 Curl CDE: プロジェクトを選択して「リファクタリング」→「APIバージョンの変更」
  Curl IDE: プロジェクトを選択して「プロジェクト」→「APIバージョンの変更」
上記操作により簡単にヘラルド変更を行うことができます。

※メジャーバージョン間ではパッケージやクラス構成が変更される場合があります。
 バージョンアップを行う際には事前に十分な動作確認を行ってください。

尚、以下の方法で、インストールされたRTEバージョンで一つ前のRTEバージョンと見なしてアプレットをテスト実行することができます。 とりあえず新しいバージョンで稼働できるか、軽く確認する場合に、この方法をご活用いただければ幸いです。
例: PCに RTE 7.0と8.0両方インストールした環境で、次のリンクにある手順で、7.0で実行するアプレット(アプレットのヘラルドは{curl 7.0 applet})は、8.0のアプレットと見なしてそのアプレットをテスト実行することが可能です。

7.0アプリをRTE8.0でテスト実行する方法