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

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

グラフY軸の最小値設定に関して

【ご質問】
グラフY軸のプロパティを以下のように設定したところ、表示される最小値が0になってしまいます。
最小値に正の数値を設定するにはどのようにしたらよいのでしょうか。

 force-range? = true
 forced-min = 80
 forced-max = 200

【回答】
最小値に正の数値を設定するためには、上記設定に加えて
force-zero?をfalseに設定する必要があります。 

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

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

{import * from CURL.GUI.CHARTS}

{let records:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “Region”, domain = String},
            {RecordField “M1”, caption = “January”, domain = int},
            {RecordField “M2”, caption = “February”, domain = int},
            {RecordField “M3”, caption = “March”, domain = int}
        },
        {RecordData Region = “North”, M1 = 100, M2 = 140, M3 = 130 },
        {RecordData Region = “East”, M1 = 110, M2 = 140, M3 = 170},
        {RecordData Region = “South”, M1 = 140, M2 = 100, M3 = 130},
        {RecordData Region = “West”, M1 = 160, M2 = 190, M3 = 140}
    }
}
{let chart1:LayeredChart =
    {LayeredChart
        width = 10cm,
        height = 6cm,
        left-axis = {new {NumericDataSeriesAxis-of double},
                        force-range? = true,
                        forced-min = 80,
                        forced-max = 200,
                        {ChartDataSeries records, “M1”},
                        {ChartDataSeries records, “M2”},
                        {ChartDataSeries records, “M3”}
                    },
        {LineLayer
            {ChartDataSeries records, “M1”},
            {ChartDataSeries records, “M2”},
            {ChartDataSeries records, “M3”},
            x-axis-data = {ChartDataSeries records, “Region”}
        }
    }
}
{let chart2:LayeredChart =
    {LayeredChart
        width = 10cm,
        height = 6cm,
        left-axis = {new {NumericDataSeriesAxis-of double},
                        force-zero? = false,
                        force-range? = true,
                        forced-min = 80,
                        forced-max = 200,
                        {ChartDataSeries records, “M1”},
                        {ChartDataSeries records, “M2”},
                        {ChartDataSeries records, “M3”}
                    },
        {LineLayer
            {ChartDataSeries records, “M1”},
            {ChartDataSeries records, “M2”},
            {ChartDataSeries records, “M3”},
            x-axis-data = {ChartDataSeries records, “Region”}
        }
    }
}

{VBox
    {text “force-zero?”の設定が無い場合},
    chart1,
    {text “force-zero?=false”にした場合},
    chart2
}

y-min.png

詳細は、Curl開発者ガイドの
[グラフ]-[LayeredChart 軸]-[軸の範囲の制御]
の項と、APIリファレンスの
[CURL.GUI.CHARTS]-[NumericAxisMixin-of]
の項内のメソッド[set-forced-range]の項をご参照ください。

また以下のページもご参照ください。
http://developers.curlap.com/faq/48-faq-specification/863-y-max.html
http://developers.curlap.com/faq/48-faq-specification/418-y.html

グラフY軸の最大値設定に関して

【ご質問】
グラフY軸のプロパティを以下のように設定したところ、表示される最大値が1になってしまいます。
最小値のみ設定し、最大値はデータに依存して表示させることは可能でしょうか。

 force-range? = true
 forced-min = 0

【回答】
force-range?をtrueに指定した場合は必ずforced-minに加えて
forced-maxも指定する必要があります。

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

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

{import * from CURL.GUI.CHARTS}

{let records:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “Region”, domain = String},
            {RecordField “M1”, caption = “January”, domain = int},
            {RecordField “M2”, caption = “February”, domain = int},
            {RecordField “M3”, caption = “March”, domain = int}
        },
        {RecordData Region = “North”, M1 = 100, M2 = 140, M3 = 130 },
        {RecordData Region = “East”, M1 = 110, M2 = 140, M3 = 170},
        {RecordData Region = “South”, M1 = 140, M2 = 100, M3 = 130},
        {RecordData Region = “West”, M1 = 160, M2 = 190, M3 = 140}
    }
}
{let chart1:LayeredChart =
    {LayeredChart
        width = 10cm,
        height = 6cm,
        left-axis = {new {NumericDataSeriesAxis-of double},
                        force-range? = true,
                        forced-min = 0,
                        {ChartDataSeries records, “M1”},
                        {ChartDataSeries records, “M2”},
                        {ChartDataSeries records, “M3”}
                    },
        {LineLayer
            {ChartDataSeries records, “M1”},
            {ChartDataSeries records, “M2”},
            {ChartDataSeries records, “M3”},
            x-axis-data = {ChartDataSeries records, “Region”}
        }
    }
}
{let chart2:LayeredChart =
    {LayeredChart
        width = 10cm,
        height = 6cm,
        left-axis = {new {NumericDataSeriesAxis-of double},
                        force-range? = true,
                        forced-min = 0,
                        forced-max = 200,
                        {ChartDataSeries records, “M1”},
                        {ChartDataSeries records, “M2”},
                        {ChartDataSeries records, “M3”}
                    },
        {LineLayer
            {ChartDataSeries records, “M1”},
            {ChartDataSeries records, “M2”},
            {ChartDataSeries records, “M3”},
            x-axis-data = {ChartDataSeries records, “Region”}
        }
    }
}

{VBox
    {text “forced-max”が無い場合},
    chart1,
    {text “forced-max=200”にした場合},
    chart2
}

y-max.png

一定の値ではなくデータに依存して最大値を変えようとするのであれば、
チャートに使用するデータ(レコードセット)から最大値を取得して
設定してみてはいかがでしょうか。

詳細は、Curl開発者ガイドの
[グラフ]-[LayeredChart 軸]-[軸の範囲の制御]
の項と、APIリファレンスの
[CURL.GUI.CHARTS]-[NumericAxisMixin-of]
の項内のメソッド[set-forced-range]の項をご参照ください。

また以下のページもご参照ください。
http://developers.curlap.com/faq/48-faq-specification/864-y-min.html
http://developers.curlap.com/faq/48-faq-specification/418-y.html

円グラフで凡例を円の内側に表示したい

【ご質問】
PieChart・PieSetを使用しているのですが、凡例を見やすくするために
大きくしたところグラフ自体のサイズが小さくなってしまいました。
グラフ自体のサイズを小さくすることなく凡例を大きくするために
凡例を円グラフの内側に表示したいと考えていますが可能でしょうか。

【回答】
今回の要望を満たす一つの例として下記サンプルコードを参考にして下さい。

下記サンプルではPieChart 起動後、レイアウト処理の完了時に発生する
ChartLayoutChangedイベント時に
{PieChart.create-legend}を使用して凡例Graphicを作成して
PieSet内部に配置しています。

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

{import * from CURL.GUI.CHARTS}

{let records:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “Region”, domain = String},
            {RecordField “M1”, caption = “January”, domain = int}
        },
        {RecordData Region = “North”, M1 = 100},
        {RecordData Region = “East”, M1 = 110},
        {RecordData Region = “South”, M1 = 140},
        {RecordData Region = “West”, M1 = 160}
    }
}

{let chart:PieChart =
    {PieChart
        width = 10cm,
        height = 10cm,
        pie-label-radius = 0.5,
        legend-enabled? = false,
        inner-radius = 2cm,
        {PieSet
            legend-enabled? = true,
            wedge-labels? = false,
            {ChartDataSeries records, “M1”},
            label-data = {ChartDataSeries records, “Region”},
            {on ChartLayoutChanged at pie-set:PieSet do
                let gl:Graphic = {chart.create-legend}
                let vb:HBox = {HBox
                                        background = “white”,
                                        vorigin = “center”,
                                        valign =  “center”,
                                        {VBox
                                            horigin = “center”,
                                            gl
                                        }
                                    }
                {pie-set.add
                    vb
                }
            }
        }
    }
}

{VBox
    {RecordGrid
        height = 4cm,
        width = 10cm,
        record-source = records
    },
    {VBox
        border-color = “black”,
        border-width = 3pt,
        chart
    }
}

 

アプレット内に別アプレットを表示することは出来るか

【ご質問】
あるアプレット内に別のアプレットを表示することは出来ますか。

【回答】
AppletData・AppletGraphicを使用することで実現可能です。

呼び出す側のアプレット(以下「親アプレット」と呼びます)に
呼び出される側のアプレット(以下「子アプレット」と呼びます)を表示するための
グラフィックとしてAppletGraphicを定義したうえで、
AppletDataをAppletGraphicと組み合わせて定義することで
親アプレット内に子アプレットを表示することが出来ます。

またバージョン6以降であれば、以下のような親アプレットと子アプレット間の
交信を行うことが出来ます。
・子アプレットに定義したメソッドを親アプレットから実行(applet-invoke-async)
・親アプレットに定義されたプロシージャを子アプレットから呼び出す(parent-invoke-async)

詳細は、Curl開発者ガイドの
[外部リソースとの対話]-[子アプレットとJavaScriptサポート]の項と
APIリファレンス内の各APIの項をご参照ください。 

AppletDataに関するサンプルを用意しました。
また、Curl開発者ガイドにもサンプルが用意されていますのでご参照下さい。

タッチデバイス上でタッチ操作を行った際にイベントを発生させることは出来るか

【ご質問】
タッチデバイス上でCurl8を使用しています。
タッチ操作を行った際に、イベントを発生させることは可能でしょうか。
例.Frame上をタッチするとポップアップメッセージを表示させる。

【回答】
GestureTouch発生時のイベント制御を行うことで実現するのはいかがでしょうか。
GestureTouchを発生させるためにはTouchInputModeを”bundled”に
設定する必要があることに注意して下さい。

下記サンプルコードを参考にして下さい。

{curl 8.0 applet}

{Frame
    background = “yellow”,
    border-width = 18pt,
    {Frame
        width = 4in,
        height = 72pt,
        border-width = 1pt,
        border-color = “black”,
        opaque-to-events? = true,
        {on e:AttachEvent at f:Frame do
            {{f.get-view}.set-touch-input-mode “bundled”}
        },
        {on GestureTouch at f:Frame do
            {popup-message “GestureTouch Fired!!”}
        }
    }
}

またTouchInputModeを”bundled”に設定するとPointerPress・PointerReleaseも
タッチ操作を行った際に発生するようになります。
これらPointer系イベントで制御を行う方法もあります。

詳細は、APIリファレンスの
[CURL.GUI.BASE]-[GestureTouch]の項と
[CURL.GUI.BASE]-[TouchInputMode]の項をご参照ください。

Curl標準の右クリックメニューの表示方法

【ご質問】
コンテナ上で特定操作を行った際に、TextFieldで右クリックした際に
表示される右クリックメニューを表示することは可能でしょうか。
例.Frame上をクリックしたらTextField用の右クリックメニューが表示されるような実装

【回答】
Curl標準の右クリックメニューの表示は以下の標準APIを使用することで実現可能です。
 default-context-menu-for-text-field-proc
 default-context-menu-for-view-proc

使用方法に関しては以下のサンプルを参考にして下さい。

{curl 8.0 applet}

{let v1:#View}
{let v2:#View}
{let fr1:Frame = {Frame
                   height = 5cm,
                   width = 5cm,
                   background = “yellow”,
                    {on e:AttachEvent at fr:Frame do
                        set v1 = {fr.get-view}
                    },
                    {on e:PointerRelease at fr:Frame do
                        let bmp:BaseMenuPane =
                            {View.default-context-menu-for-text-field-proc v1 asa View}
                        {bmp.popup fr, e.x, e.y}
                    }
                }
}
{let fr2:Frame = {Frame
                   height = 5cm,
                   width = 5cm,
                   background = “green”,
                    {on e:AttachEvent at fr:Frame do
                        set v2 = {fr.get-view}
                    },
                    {on e:PointerRelease at fr:Frame do
                        let bmp:BaseMenuPane =
                            {View.default-context-menu-for-view-proc v2 asa View}
                        {bmp.popup fr, e.x, e.y}
                    }
                }
}
{VBox
    fr1,
    fr2

Curlのインストール先に関して

【ご質問】
Curlのインストールを行う際、インストール先は通常
C:\Program Files\Curl Corporation
になると思いますが、インストール先を別の場所に変更することは出来ますか。
また別のドライブにインストールを行うことは出来ますか。

【回答】
インストールを行う際にインストール先の変更を行うことで
インストール先の変更は可能です。
(Cドライブ以外へのインストールも可能です。)

ただしインストール先の変更を行うことが出来るのは、
Curlの初回インストール時のみであることにご注意下さい。

Curlが既にインストールされている環境にインストールをする場合は
インストール先の変更は出来ません。
インストール済みのCurlを全てアンインストールした後、
再度インストールを行うことでインストール先の変更を行うことが出来ます。

CurlでOS・IEバージョンを取得する方法

【ご質問】
Curlを実行しているクライアント端末のOSとIEのバージョンを取得する方法はありますか?

【回答】
Curlの標準APIではOS・IEのバージョンを取得する方法はございません。
Curlアプレットからシェルコマンド、WindowsAPI、ActiveXなどを呼び出して
取得する事は可能です。

一例としてspawn-host-shellプロシージャを利用してOS・IEバージョンを取得する
サンプルを以下に紹介します。
 

{curl 8.0 applet}

{import * from CURL.RUNTIME.HOST-PROCESS}

{CommandButton
    label = “OS Version”,
    {on Action do
        let hp:HostProcess =
            {spawn-host-shell
                read-stdout? = true,
                “ver”
            }
        let tis:TextInputStream = {hp.read-open-stdout}
        let str:StringBuf = {tis.read-one-string}
        {tis.close}
        {if {str.find-string “Windows XP”} != -1 then
            {popup-message “Windows XP”}
         elseif {str.find-string “6.0”} != -1 then
            {popup-message “Windows Vista”}
         elseif {str.find-string “6.1”} != -1 then
            {popup-message “Windows 7”}
         elseif {str.find-string “6.2”} != -1 then
            {popup-message “Windows 8”}
        }
    }
}

{CommandButton
    label = “IE Version”,
    {on Action do
        let hp:HostProcess =
            {spawn-host-shell
                read-stdout? = true,
                “reg query \”HKLM\\SOFTWARE\\Microsoft\\Internet Explorer\” /v Version”
            }
        let tis:TextInputStream = {hp.read-open-stdout}
        let str:StringBuf = {tis.read-one-string}
        {tis.close}
        {popup-message str}
    }
}
 

また以下のページも参考にしてください。
http://developers.curlap.com/faq/48-faq-specification/391-os.html

intの値を文字列に変換するには

◆ご質問◆
 int型の値をString型に変換するにはどうすればいいですか。

◆回答◆
formatを使用する方法とStringを使用する方法があります。
具体的には
{format “%d”, intValue}
{String intValue}
で実現可能です。

また
“” & intValue
でも同じ様に変換可能です。
この表現に関してはAPIリファレンス内の
「CURL.LANGUAGE.STRINGS」→「& プリミティブ」
の項を参照下さい。
(いずれかのオペランドが文字列でない場合、連結する前に
{format “%s”, operand} が呼び出され、出力式が取得されます。)

プログラムでRadioFrameに値を設定してValueChangedイベントを発生させたい

【ご質問】
RadioFrameにValueChangedイベントを追加しました。
しかしプログラムでRadioFrame.valueを設定した場合にイベントが発生しません。
ユーザ操作の場合と同様にイベントを発生させるにはどのようにすればよいでしょうか。

【回答】
RadioFrameのset-value-with-eventsメソッドを使用することで実現可能です。

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

{value
    let rb1:RadioButton = {RadioButton label = “one”, radio-value = 1}
    let rb2:RadioButton = {RadioButton label = “two”, radio-value = 2}
    let rb3:RadioButton = {RadioButton label = “three”, radio-value = 3}
    let rf:RadioFrame =
        {RadioFrame
            {spaced-vbox rb1, rb2, rb3},
            {on ValueChanged at rf:RadioFrame do
                {output “ValueChanged : “& rf.value}
            }           
        }
   
    let b1:CommandButton =
        {CommandButton
            label = “value使用”,
            {on Action do
                set rf.value = 1
            }
        }
    let b2:CommandButton =
        {CommandButton
            label = “set-value-with-events使用”,
            {on Action do
                {rf.set-value-with-events 3}
            }
        }
    {spaced-vbox
        rf,
        b1,
        b2
    }
}

Cookieを引き継ぐ方法

【ご質問】
Cookieを引き継ぐ方法を教えてください。

【回答】

起動用のCurlアプレットをサーバ側JSPなどで動的に生成し、その動的に生成するコード内で
“set-insecure-http-cookie”プロシージャ等を利用してブラウザに付与したCookie情報を
書き出し、アプレット内で設定する方法等があります。

JSPでのコードサンプル(下記サンプル内の curlcode-dynamic-generate.jsp)

<%@ page import=”java.net.*” contentType=”text/vnd.curl.dcurl” %>
<%
// ログイン時に発行したJSESSIONIDがクライアントから送られてきています。
// その値を取得して変数に確保します。

Cookie[] cookies = request.getCookies();
Cookie cookie = new Cookie(“a”, “b”);
if (cookies != null){
  for (int i = 0; i < cookies.length; i++){
    cookie = cookies[i];
    if (cookie.getName().equals(“JSESSIONID”)){
      break;
    }
  }
}

%>

{curl 8.0 applet}
{curl-file-attributes character-encoding = "utf8"}
{applet COM.YOUR-COMPANY.YOUR-PRODUCT.YOUR-APPLET,
  version = “1.2.3”,
  manifest = “manifest.mcurl”,
  resync-file = “”,
  {compiler-directives
    stringent? = true
  }
}

|| {applet xxx} 宣言の直後に、以後のセッションで使用できるように
|| 取得したJSESSIONIDの値をCookieに設定するCurlコード
{def cookie = {HttpCookie "JSESSIONID", "<%=cookie.getValue() %>", path = "/mycook"}}
{set-insecure-http-cookie {url "http://localhost:8080/mycook"}, cookie}

|| インポート文とインクルード文は必ず上記
|| set-secure/insecure-http-cookie 呼び出しの後に置いてください。
{import * from CURL.GUI.SHAPES}
||{include "curlcode.scurl"}

{View
  title=”My test Window2″,
  || Replace {Frame} with your code.
  {Frame},
  visibility = “normal”,
  {on WindowClose do
    {exit}
  }
}

上記デタッチトアプレットを生成するjspサンプルの場合、起動時のURLは次のようなものになります:
"curl://launch/https://your.server.com/your/applet/dir/curlcode-dynamic-generate.jsp"

Curlのコントロール内部の構成を確認する方法

【ご質問】
Curlのコントロール内部の構成を確認する方法はありますか?

Curlアプリケーションにて、Curlをバージョンアップした際に
一部コントロールにて 旧バージョンと見た目が異なるため、原因や対策を
確認する手段の1つとして利用したいです。

【回答】
Curlは各メジャーバージョン間の互換性を保証していません。

該当のアプレットにてCtrl+右クリックし、
グラフィック階層とすることで確認することが可能です。
(ただしCurlIDEのインストールが必要です。)

使い方の詳細は以下をご参照ください。
[グラフィック階層の使い方 ]
http://developers.curlap.com/re-reference/21-debug/39-gui-layer.html

Curlのバージョンアップに至った起因が新しいOSへの対応によるものである場合は、
以下のFAQも参考になりますのでご参照ください。
【関連FAQ】
OS間により見た目が異なる
http://developers.curlap.com/faq/49-faq-operation/361-os.html

 

DateFieldのカレンダーボタンを非表示にする方法

【ご質問】
DateFieldのカレンダーボタンを非表示にする方法はありますか?

【回答】
DateFieldのui-objectを操作することにより可能です。

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

{let df:DateField = {DateField
                               value = {DateTime.date}
                           }
}

{value
    def df-ui = df.ui-object asa SkinnableDateFieldUI
    def frame = df-ui.child.graphic asa Frame
    def grid = frame.child.graphic asa Grid
    def dfsc = grid.child-array[0].graphic asa DateFieldSpinControl
    def btn = grid.child-array[1].graphic
   
    set btn.visible? = false
    set btn.width = 0px
   
    df
}

ListViewerの任意行を押下した際の値を取得したい

【ご質問】
Caedeにて ボタン押下時にListViewerにListViewItemDataを追加するようなロジックを作成したのですが、
実際に実行してみると、2行目のリストを押下すると 「10行目がクリックされました!」
と出力されてしまいます。

2行目のリストを押下した際に「2行目がクリックされました!」とするには
どうしたらよいでしょうか?
——————
{self.kensakucb.add-event-handler
    {on Action do
        {for i:int = 0 to 9 do
            {self.b-list-view.append
                {ListViewItemData
                    label = i & “行目” ,
                    {on Action do
                        {popup-message i & “行目がクリックされました!” }
                    }
                }
            }
        }
    }
}
——————

【回答】
以下のように繰り返し処理内で def宣言で iの値を取得しておき、
これを利用することで解決できます。

{self.kensakucb.add-event-handler
    {on Action do
        {for i:int = 0 to 10 – 1 do
            def j = i
            {self.b-list-view.append
                {ListViewItemData
                    label = j & “行目” ,
                    {on Action do
                        {popup-message j+1 & “行目がクリックされました!” }
                    }
                }
            }
        }
    }
}

指定の文字コードで文字を比較したい。

【ご質問】
 入力された文字をShift-JISで比較する方法はありますか?
 

【回答】
 {encode-characters}プロシージャを用いることで可能です。
 第一水準、第二水準の文字チェックも同プロシージャを用いることで可能です。 


|| Shift-JISの文字コードをバイト配列で返す
{define-proc {get-sjis-code tf:TextField}:ByteVec
    let encoding:CharEncoding = {get-character-encoding-by-name “shift-jis”}
    let code-out:ByteVec = {ByteVec max-size = tf.value.size * encoding.transcode-max-expansion-factor}
    let (in-used:int, out-made:int) = {encode-characters tf.value, code-out, encoding}
    {return code-out}
}

|| 第一引数が大なら1、第二引数が大なら-1、等しければ0を返す
{define-proc {compare byte1:ByteVec, byte2:ByteVec}:int
    let result:int = 0
    {output byte1.size & ” “ &  byte2.size}
    {if byte1.size > byte2.size then
        set result = 1
     elseif byte1.size < byte2.size then
        set result = -1
     else
        {for i:int = 0 below byte1.size do
            {if byte1[i] > byte2[i] then
                set result = 1
                {break}
             elseif byte1[i] < byte2[i] then
                set result = -1
                {break}
            }
        }
    }
    {return result}
}

{value
    def tf1 = {TextField width = 2cm, max-chars = 1, value = “あ”}
    def tf2 = {TextField width = 2cm, max-chars = 1, value = “A”}
    def cm = {CommandButton
                 label = “compare width Shift-jis”,
                 {on Action do                 
                     || Shift-JISでの比較を行います
                     def byte1 = {get-sjis-code tf1}
                     def byte2 = {get-sjis-code tf2}
                     def result = {compare byte1, byte2}
                     {popup-message
                         {if result > 0 then
                             “left is greater”
                          elseif result < 0 then
                             “right is greater”
                          else
                             “equal”
                         }
                     }
                 }
             }     
    {HBox
        tf1, tf2, cm
    }
}

タブの角を丸くする方法

【ご質問】
タブ(TabContainer)の角を丸くすることはできますでしょうか。

【回答】
TabContainer.panes-skinやskinに独自に作成したスキンオブジェクトを指定することで
例えば以下の様な概観(右)を作成することができます。

faq-tab-maru.jpg

 

 

 

 

 

詳細は、Curl開発者ガイドの
[グラフィカル ユーザー インターフェイス]-[スタイルコントロール]-[スキンが適用されたタブコントロール]
の項をご参照ください。 

DeveloperCenter内で公開しているヘルプドキュメントにも同様の内容がございます。

選択されたタブの文字を変更する方法

【ご質問】
選択されたタブの文字を変更する方法を教えてください。

【回答】
TabContainer.tab-panesにて従属するTabPaneを取得可能です.
下記サンプルコードを参考にして下さい。

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

{TabContainer
    {TabPane
        label = {text
                        font-size = 30px,
                        font-style = “italic”,
                        text-underline? = true,
                        現在選択中
                   },
        {text font-size = 28pt, 1}
    },
    {TabPane
        label = “L2”,
        {text font-size = 28pt, 2}
    },
    {TabPane
        label = “L2”,
        {text font-size = 28pt, 3}
    }
    ,
    {on CurrentPaneChanged at tc:TabContainer do
        set tc.tab-panes[0].label = “L1”
        set tc.tab-panes[1].label = “L2”
        set tc.tab-panes[2].label = “L3”
        set tc.current-pane.label = {VBox
                                                  background = “blue”,
                                                  {text
                                                      color = “pink”,
                                                      font-size = 30px,
                                                      font-style = “italic”,
                                                      text-underline? = true,
                                                      現在選択中
                                                  }
                                              }
    }
}

[Windows8]Curlアプレットをスタート画面にピン留めする手順

Windows8のスタート画面にCurlアプレット(*.curl、*.dcurl)の起動メニューを作成する方法です。

image019.png

 

 

 

 

 

 

 

 

●Curlアプレット(xxx.curl)をスタート画面にピン留めする手順

1.ブラウザ(IE)にて該当のアプレットを開き、ツールメニュー -> “サイトをスタート画面に追加”を選択します。

image001.png

 

 

 

 

 

 

 

 

 

2.表示されるポップアップにて “追加”ボタンを押下します

image003.png

 

 

 

 

 

 

 

 

 

 

3.スタート画面に 表示されます

image005.png

 

 

 

 

 

 

 

 

 

 

●Curl独立型アプレット(xxx.dcurl)をスタート画面にピン留めする手順

 

1.ショートカットを作成します。

作成場所:「%APPDATA%\Microsoft\Windows\Start Menu」

例:C:\Users\your_account_name\AppData\Roaming\Microsoft\Windows\Start Menu

 

image007.png

 

 

 

 

 

 

 

 

 

2.表示されるダイアログにて “curl://launch/”から始まるURLを入力して “次へ”を押下します。

image009.png

 

 

 

 

 

 

 

 

 

 

3.表示されるダイアログにて 名前を入力し “完了”ボタンを押下します。

image011.png

 

 

 

 

 

 

 

 

 

 

4.ショートカットが作成されます。

image013.png

 

 

 

 

 

 

 

 

 

 

5.スタート画面にて 右クリックし、 “すべてのアプリ”をクリックします。

image015.png

 

 

 

 

 

 

 

 

 

 

6.作成したショートカットを右クリックし、 ”スタート画面にピン留めする”をクリックする。

image017.png

 

 

 

 

 

 

 

 

 

 

7.スタート画面に 表示されます

image019.png

 

 

 

 

 

 

 

 

 

 

RecordGridでソートされた時に最終行だけ固定にしたい

【ご質問】
RecordGridではヘッダ行のセルをクリックするとレコードがソートされますが、
最下行は合計値を表示する行としたいので、
そこだけはソート時でも固定させたいと考えています。
これはどのようにすれば実現できるでしょうか。

【回答】
隠しフィールドを用意して、最下行に固定したいデータのみ1,
その他の全てのデータでは0という値を格納するといった方法があります。
ソート時にはこのカラムを常に第一キーとしてソートさせるようにします。

それだけですと昇順降順を切り替えたときに先頭行に来てしまいますので、
昇順降順が切り替えられたときでも、このカラムだけは
同じ方向でソートされるような作りこみが必要です。
以下のサンプルをご参照ください。

{curl 7.0,8.0 applet}

{let people:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “First”, domain = String},
            {RecordField “Last”, domain = String},
            {RecordField “Age”, domain = int},
            || 合計行を最下行表示するための隠しフィールド
            {RecordField “hidden”, domain = int}
        },
        || hidden = 0
        {RecordData First = “Gene”, Last = “Smith”, Age = 25, hidden = 0},
        {RecordData First = “Fred”, Last = “Smith”, Age = 29, hidden = 0},
        {RecordData First = “Mike”, Last = “Jones”, Age = 28, hidden = 0},
        {RecordData First = “Ben”, Last = “Abrams”, Age = 25, hidden = 0},
        {RecordData First = “Ben”, Last = “Smith”, Age = 21, hidden = 0},
        {RecordData First = “Sam”, Last = “Jones”, Age = 22, hidden = 0},
        {RecordData First = “Nigel”, Last = “Stevens”, Age = 24, hidden = 0},
        {RecordData First = “Bert”, Last = “Stevens”, Age = 22, hidden = 0},
        {RecordData First = “Pat”, Last = “Linden”, Age = 27, hidden = 0},
        || 合計行のみ hidden = 1 とする
        {RecordData First = “TOTAL”, Last = “”, Age = 25+29+28, hidden = 1}
    }
}       
|| 昇順ならtrue
{let asc?:bool = true}       
|| 最後にソートした列名
{let last-sort-column:String = “”}

{def rg = {RecordGrid
                    record-source = people,
                    height = 10cm,
                    automatic-columns? = false,
                    {RecordGridColumn “First”},
                    {RecordGridColumn “Last”},
                    {RecordGridColumn “Age”},
                    || ソート方法を指定
                    sort = {RecordSort.from-string “hidden, Age”},
                    sort-spec = {proc {rgc:RecordGridColumn}:RecordSort
                                        || 異なる列をクリックしたら昇順に戻す
                                        {if last-sort-column != rgc.field-name then
                                            set asc? = true
                                        }
                                        || 第一ソートキー<hidden>, 第二ソートキー<クリックした列>
                                        || ただし降順時でも<hidden>は昇順ソート
                                        let rs:RecordSort =
                                            {RecordSort.from-string
                                                “hidden “ &
                                                {if asc? then
                                                    “asc”
                                                 else
                                                    “desc”
                                                }
                                                & “, “ & rgc.field-name
                                            }
                                        || ソートした列名とソート順を保存
                                        set last-sort-column = rgc.field-name
                                        set asc? = not asc?
                                        {return rs}
                                    }
            }
}
{value rg}

外部プログラム非同期実行

【ご質問】

Curlから処理時間の掛かる外部プログラム実行時、Curlで他の画面操作をしたい。

 

【回答】

run-host-processプロシージャは、プロセスの完了まで待つ仕様になっておりますが、
Curl Ver.8よりホストプロセスを非同期で呼び出せるAPIが追加されました。
http://developers.curlap.com/re-reference/19-others/756-async-host-process.html

こちらをご利用になれば非同期操作が可能でございます。尚、HostProcessExitedEventを用いることでプロセス終了時のイベントをハンドリング可能です。