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

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

新規ブラウザでのPDF表示

【ご質問】
新規ブラウザにPDFファイルを表示したいのですが、どのようにすればよいのでしょうか。

【回答】
pdfファイルを新しいブラウザで表示するには、{browse-url}メソッドを使用した
以下の手順が有効かと思います。

<手順>
 1.{get-the-applet}プロシージャによって、現在のアプレットを取得する。
  2.取得したアプレットの{browse-url}メソッドを使用し、target を “_blank”に設定する。
   (新規ブラウザを表示させるため)
  3.表示するpdfのurlを設定する。

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

{curl 6.0,7.0,8.0 applet}

{value
    {CommandButton
        label = “open”,
        {on Action do
            {{get-the-applet}.browse-url
                target=“_blank”,
                {url “file:///C:/test.pdf”}
            }
        }
    }
}

また、APIリファレンスの
[CURL.ENGINE.APPLET]-[Applet]
の項内のメソッド[browse-url]の項もご参照ください。

以下のページも参考になると思いますのでご参照ください。
http://developers.curlap.com/faq/48-faq-specification/422-pdf.html
 

RecordGridのフィルタで大文字・小文字を区別するには

【ご質問】
RecordGridのfilter機能について、
英語の大文字、小文字を区別することは可能でしょうか。

【回答】
RecordFieldの宣言時にdomainを下記のように設定する事により、
filterで英語の大文字小文字を区別する事ができます。

{RecordField
   “Last”,
   domain = {StandardStringDomain ignore-case? = false}
}

RecordFieldにおいて、domain = Stringと設定すると、
String の標準ドメインがStandardDateDomain クラスの既定の状態で作成されます。
StandardDateDomain クラスの既定では、ignore-case? = trueとなるため、
大文字と小文字が区別されません。

英語の大文字小文字を区別させる場合は、RecordFieldにおいて、
domain = {StandardStringDomain ignore-case? = false}
と明示的に設定する必要があります。

Curlからpdfファイルを起動させるには

【ご質問】
Curlでローカルのpdfファイルを開きたいのですが、どのようにしたらよいのでしょうか。

【回答】
ファイルを指定したい場合は、”run-host-shell”を使用するのはいかがでしょうか。

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

{curl 6.0,7.0,8.0 applet}

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

{value
    {CommandButton
        label = “open”,
        {on Action do
            let hostprocessrtn:int =
                {run-host-shell
                    “START “ & {url “file:///C:/test.pdf”}.local-filename asa String
                }
        }
    }
}

また、以下のページもご参照ください。
http://developers.curlap.com/faq/48-faq-specification/424-2010-10-28-06-16-02.html

グラフの表示目盛りの間隔について

【ご質問】
グラフを表示したところ右縦軸の目盛り表示が、
上から「2」「1.75」「1.5」「1.25」「1」「0.75」「0.5」「0.25」「0」となりました。

目盛りには整数値のみ表示することは可能でしょうか。
また、目盛り表示間隔を制御することは可能でしょうか。

【回答】
整数のみを表示するには、”tick-label-factory”で「1.75」などの少数値の場合は、
空文字を返すようにすることで実現可能です。。

また、目盛り間隔の表示は”tick-spacing-proc”で制御することが可能です。

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

{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 “Name”, domain = String},
            {RecordField “Age”, domain = double},
            {RecordField “Score”, domain = int}
        },
        {RecordData Name = “John”, Age = 1, Score = 1022},
        {RecordData Name = “Julie”,  Age = 1, Score = 1013},
        {RecordData Name = “Jethro”, Age = 1, Score = 1032},
        {RecordData Name = “Jeremy”, Age = 1, Score = 1065},
        {RecordData Name = “Jessica”, Age = 0, Score = 1093}
    }
}

{let chart:LayeredChart =
    {LayeredChart
        width = 10cm,
        height = 7cm,
        left-axis = {{NumericDataSeriesAxis-of float}
                        force-zero? = false,
                        {ChartDataSeries records, “Score”}
                    },
       
        right-axis-parent =
            {ShapeGroup
                tick-spacing-proc =
                    {proc {axis-in:ChartAxis}:(min:any, max:any, ticks:int)
                        let constant axis:{NumericAxis-of double} = axis-in asa {NumericAxis-of double}
                        let (minimum:double, maximum:double, ticks:int) =
                            {axis.calculate-tick-spacing
                                axis.minimum asa double,
                                axis.maximum asa double
                            }
                        ||=====分割数=====================
                        let space:int = 7
                        ||==============================
                       
                        {return minimum, maximum, space}
                    },
                tick-label-factory =
                    {proc {axis:ChartAxis, tick:ChartTick, tick-rotation:Angle}:any

                        ||====1.1、2.3などキリの悪い数字の場合は表示しない======
                        let ret:int =  {floor tick.value}
                        {if tick.value != ret then
                            {return “”}
                        }
                        ||=====================================
                        
                        let (halign:String, valign:String) =
                            {axis.get-tick-label-alignment tick-rotation}
                        let shape:TextShape =
                            {TextShape
                                halign = halign,
                                valign = valign,
                                color = “black”,
                                ||formatマクロを使用することにより、
                                ||目盛りの表示形式を設定できます。
                                {format “%.0f”, tick.value}
                            }
                        let bounds:GRect = {shape.get-own-bounds}
                        {return
                            {RectangleShape
                                bounds,
                                color = “white”,
                                shape
                            }
                        }
                    }
            },
       
        right-axis = {new {NumericAxis-of double}, 0, 2},
        top-axis = {ChartAxis {ChartDataSeries records, “Name”}},
        {LineLayer
            records,
            {ChartDataSeries records, “Score”},
            {ChartDataSeries records, “Age”}
        }
    }
}

{VBox
    {RecordGrid height = 4cm, width = 13cm, record-source = records},
    {spaced-hbox
        {CommandButton
            label = “commit”,
            {on Action do {records.commit}}
        },
        {CommandButton
            label = “revert”,
            {on Action do {records.revert}}
        }
    },
    chart
}

SpinControl使用時の表示について

【ご質問】
SpinControlクラスを使用し、初期値1から0.001ずつインクリメントする場合、
「1.0009999999999999」と表示されてしまいます。

少数桁4桁以降の数値を四捨五入するロジックを入れる以外に、
自動で「1.001」と表現する方法はあるのでしょうか。

【回答】
SpinControlクラスにformat-specがございます。
これを使用すれば宜しいかと思います。

(実装例)

 

{SpinControl
    domain =
        {StandardDoubleDomain
            default-value = 1.000,
            min-allowable = 0.009,
            max-allowable = 10.5
        },
    step = 0.001,
    width = 6cm,
    format-spec = “%0.3f”
}

DateTimeのミリ秒の設定

【ご質問】
DateTime型の変数に、特定の年月日時分秒ミリ秒を設定したいのですが、
DateTimeのコンストラクタにはミリ秒がないため設定できません。
DateTime のミリ秒はどのように設定すればよいのでしょうか。

【回答】
ミリ秒まで設定する場合は、以下のようにDateTimeを定義することで設定することができます。

<例>2008/11/17 12:15:54.123 を設定する

{let date-time:DateTime = {DateTime
                                      year = 2008,
                                      month = 11,
                                      day = 17,
                                      hour = 12,
                                      minute = 15,
                                      second = 54
                                 } + 123ms
}

RecordGridにハイパーリンクを表示させるには

【ご質問】
グリッド内のデータをリンクテキスト(ハイパーリンク)状態で表示することは可能でしょうか。

【回答】
グリッド内のデータをハイパーリンク表示にする方法として、
StandardRecordGridCellを使用してRecordGridのセルをカスタマイズする方法が考えられます。

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

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

{define-class public NewCell {inherits StandardRecordGridCell}

  field private frame:Frame =
      {Frame
        width = {make-elastic},
        height = {make-elastic},
        ||リンクを含むセルの為、active-traversal-containerをnullにします。
        active-traversal-container = null
      }
 
  {constructor public {default}
    {construct-super}
    {self.add-internal self.frame}
  }

  {method public open {refresh-data}:void
    ||このセルの現在のデータを取得します。
    let (data:String, valid?:bool) = {self.get-formatted-data}
   
    ||Frameにハイパーリンクとして設定したデータをaddします。
    {self.frame.add {link href = {url data}, {value data}}, replace? = true}
  }
}

{let people:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “First”, domain = String},
            {RecordField “Last”, domain = String},
            {RecordField “Age”, domain = int}
        },
        {RecordData First = “http://www.curl.com”, Last = “Smith”, Age = 25},
        {RecordData First = “http://www.curlap.com”, Last = “Mary”, Age = 25}
    }
}

{value
    {RecordGrid
        record-source = people,
        height = 3cm,
        ||フィールド名:Firstの列のセルをNewCellに設定します。
        {RecordGridColumn “First”, width = 3.7cm, cell-spec = NewCell}
    }
}

RecordGridCell内にリンクを置く場合、独立したActiveTraversalContainerを使用します。
そのため、active-traversal-containerプロパティを
StandardActiveTraversalContainerのインスタンス、もしくはnullに設定する必要があります。
(サンプルではFrameにlinkテキストプロシージャが含まれているため、
Frameの引数に「active-traversal-container = null」を渡しています。)

独立型アプレットのタイトルバーを非表示にするには

【ご質問】
独立型アプレットの画面位置を移動不可にする為、ウインドウのタイトルバーを
非表示にしたいのですが、そのようなことは可能でしょうか。

【回答】
独立型アプレット内で使用されるViewクラス内で、
decorations?プロパティをfalseに設定することによって、
ウインドウのタイトルバーを非表示にすることが可能です。

ただし、非特権アプレットの場合、
decorations?プロパティをfalseに設定するとエラーとなり、
ウインドウのタイトルバーを非表示にすることはできません。

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

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

{View
    visibility = “normal”,
    ||decorations?をfalseにすると、
    ||タイトル バーとウィンドウの縁を囲む枠が非表示になります。
    decorations? = false,
    center? = true,
    {Frame
        width = 8cm,
        height = 8cm,
        border-width = 2pt,
        border-color = “red”,
        {CommandButton
            label = “close”,
            {on Action do {exit}}
        }
    }
}

また、APIリファレンスの
[CURL.GUI.BASE]-[View]
の項内のコンストラクタ[default]の項をご参照ください。 

Tab遷移順の取得

◆ご質問◆
tab-indexを明示的に設定せずに画面を作成しています。
画面上に配置したコントロールのTab遷移順はどのようにして取得することができるのでしょうか。

◆回答◆
StandardActiveTraversalContainerクラスの”get-sorted-traversors(メソッド)”を使用することにより、
タブ遷移の順序を知ることができます。

“get-sorted-traversors(メソッド)”はタブ遷移順にソートされたActiveTraversor配列を返します。

このメソッドを使用するには、コントロールを含むメイン画面のクラスが
StandardActiveTraversalContainerクラスである必要があります。
メイン画面がStandardActiveTraversalContainerクラスではない場合は、
メイン画面のクラスをStandardActiveTraversalContainerクラスで包む必要があります。

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

RecordGridのソート解除

【ご質問】
RecordGridの列見出しをクリックすると、その列の定義に応じてソートされる機能が
標準で搭載されていますが、このソートを解除する機能はあるのでしょうか。

【回答】
一度設定されたRecordGridのソートを解除するには、
RecordGrid.sortの設定をnullに設定した後リロードすることで実現可能です。

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

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

{let people:RecordSet =
    {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 = 1},
        {RecordData First = “John”, Last = “Smith”, Age = 2},
        {RecordData First = “Jane”, Last = “Smith”, Age = 3},
        {RecordData First = “John”, Last = “Smith”, Age = 4},
        {RecordData First = “Jane”, Last = “Smith”, Age = 5},
        {RecordData First = “John”, Last = “Smith”, Age = 6},
        {RecordData First = “Jane”, Last = “Smith”, Age = 7},
        {RecordData First = “John”, Last = “Smith”, Age = 8},
        {RecordData First = “Jane”, Last = “Smith”, Age = 29},
        {RecordData First = “John”, Last = “Smith”, Age = 225},
        {RecordData First = “Jane”, Last = “Smith”, Age = 293},
        {RecordData First = “John”, Last = “Smith”, Age = 2},
        {RecordData First = “Jane”, Last = “Smith”, Age = 39},
        {RecordData First = “John”, Last = “Smith”, Age = 55},
        {RecordData First = “Jane”, Last = “Smith”, Age = 21},
        {RecordData First = “John”, Last = “Smith”, Age = 6},
        {RecordData First = “Jane”, Last = “Smith”, Age = 229},
        {RecordData First = “John”, Last = “Smith”, Age = 45},
        {RecordData First = “Jane”, Last = “Smith”, Age = 222},
        {RecordData First = “Jane”, Last = “Jones”, Age = 288}
    }
}

{let rg:RecordGrid =
    {RecordGrid
        record-source = people,
        width = 10.5cm,
        height = 10cm,
        column-selection-enabled? = true,
        multiple-selection-enabled? = false,
        display-filler-column? = true,
        record-selection-enabled? = false
    }
}

{value
    {VBox
        {CommandButton label = “並びを戻す”,
            {on Action do
                set rg.sort = null
                {rg.reload}
            }
        },
        rg
    }
}

DateTime型の表示形式の変更

【ご質問】
DateTime型を「09/Mar/2009」のような形式に変換することは可能でしょうか。
DateTimeFormatter.short-month-namesを使えばできそうなのですが、
上記形式に変換することができませんでした。

【回答】
formatマクロにある”%m”引数を使用すれば、
DateTimeFormatterオブジェクトを使って、DateTimeオブジェクトをフォーマットすることができます。

しかし、その場合どのような形式でフォーマットするかはDateTimeFormatterで可能な範囲となってしまうため、
要求の「09/Mar/2009」という形式にはフォーマットできません。

そのため、上記形式で表示させるには、文字列解析のような処理をする必要になるかと思います。

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

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

{import * from CURL.LANGUAGE.FORMAT}

{value
    let date-time:DateTime = {DateTime}
    let formatter:DateTimeFormatter =
        {DateTimeFormatter
            style = “long”,
            include-time? = false,
            locale = {Locale “en-US”}
        }

    {Table columns = 2,

        “format マクロ使用”, {format “%m”, formatter, date-time},

        “format マクロ使用だが事実上文字列解析”,
        {format “%s/%s/%s”,
            date-time.info.day,
            formatter.short-month-names[date-time.info.month – 1],
            date-time.info.year
        }
    }
}

グラフのY軸の順序を変更

【ご質問】
LayeredChartで表示されるY軸はデフォルトでは左下が起点となっていますが、
左上に変更することは可能でしょうか。
Y軸の値の順序を上から下に並べ替えたいと思っています。

【回答】
LayeredChartで軸に表示されている目盛りの値の順番を変える方法として、
表を回転させる方法が考えられます。

まず、”right-axis-parent”および”bottom-axis-parent”の表示ラベルを180度回転させます。
さらに、LayeredChartクラスに対して180度回転させることで実現可能です。

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

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

{import * from CURL.GUI.CHARTS}

{let record-set:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “Name”, domain = String},
            {RecordField “Age”, domain = int}
        },
        {RecordData Name = “AAA”, Age = 12},
        {RecordData Name = “BBB”, Age = 21},
        {RecordData Name = “CCC”, Age = 43},
        {RecordData Name = “DDD”, Age = 22}                             
    }
}

||レコードを降順にソートする。
{let record-view:RecordView = {RecordView
                                                record-set,
                                                sort = “Name DESC”
                                            }
}

{let bar-layer:BarLayer =
    {BarLayer
        record-set,
        “Age”,
        x-axis-data = {ChartDataSeries record-view, “Name”}
    }
}

{let chart:LayeredChart =
    {LayeredChart
        ||回転させる
        translation = {Distance2d 4in, 3.8in},
        width = 10cm,
        height = 10cm,
        right-axis = {{NumericDataSeriesAxis-of double}
                           {ChartDataSeries record-set, “Age”}
                         },
        ||右軸のラベルを180度回転させる
        right-axis-parent =
            {ShapeGroup
                tick-label-rotation = 180deg
            },
        ||下軸のラベルを180度回転させる
        bottom-axis-parent =
            {ShapeGroup
                tick-label-rotation = 180deg
            },
        bar-layer
    }
}

||表全体を180度回転させる
{chart.apply-rotation 180deg}

{View
    chart,
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}

グラフの凡例のcaption変更

【ご質問】
グラフについて、凡例のcaptionのみを変更する方法はありますか。

【回答】
legend-entry-factoryを使用する事で、凡例のcaptionの変更が行えます。

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

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

{import * from CURL.GUI.CHARTS}

{let record-set:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “Name”, domain = String},
            {RecordField “Age”, domain = int},
            {RecordField “Win”, domain = int}
        },
        {RecordData Name = “AAA”, Age = 12},
        {RecordData Name = “BBB”, Age = 21},
        {RecordData Name = “CCC”, Age = 43},
        {RecordData Name = “DDD”, Age = 22}                             
    }
}

{let chart:LayeredChart =
    {LayeredChart
        width = 10cm,
        {BarLayer
            record-set,
            “Age”,
            x-axis-data = {ChartDataSeries record-set, “Name”}
        },
        ||legend-entry-factoryを使用して、凡例の作成を行います。
        legend-entry-factory =
            {proc {chart:Chart,
                      data-series:ChartDataSeries,
                      record:#Record,
                      color:FillPattern,
                      legend-index:int
                    }:Graphic
                {return
                    {HBox
                        valign = “center”,
                        {Fill
                            width = 8pt,
                            height = 8pt,
                            background = color,
                            border-width = 1px
                        },
                        {Fill width = {make-elastic minimum-size = 20pt}},
                        ||captionが”Age”だった場合、”年齢”と凡例に表示させる
                        {if data-series.field.caption == “Age”
                         then
                            “年齢”
                         else
                            data-series.field.caption
                        }
                    }
                }
            }
    }
}

{View
    chart,
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}

PC起動時にCurlを起動させるには

【ご質問】
PC起動時にCurlを起動させることは可能でしょうか。

【回答】
PC起動時にCurl RTEを同時に起動させるためにはWindowsであれば
スタートアップに追加する事で可能です。

ただしCurl RTEのみを起動させた場合、アプレットが実行されていないと
60秒後にCurl RTEは自動終了します。
※この時間を任意の時間に変更することはできません。

Curl IDEを同時に起動させておくとCurl RTEが自動的に終了する事はありません。

もし、Curl IDEを起動させずにCurl RTEのみを起動した状態にしたい場合は、
PC起動時にGUIを持たない空の独立型アプレットを起動させるようにしてください。
→例えば以下の様にヘラルドだけ記述された独立型アプレット(.dcurlファイル)でかまいません。

{curl 5.0,6.0,7.0 applet}

※上記記載内容はCurlバージョン7までにおけるものです。
バージョン8からCurlコントロールパネル内に追加された
「RTEがシステムスタートアップ時に起動され、主導でシャットダウンされるまで実行される。」
を有効にすることでCurlを自動起動することが出来ます。
以下のページをご参照ください。
http://developers.curlap.com/re-reference/19-others/743-startup.html

RecordGridの特定行に対する制御

【ご質問】
RecordGridのある行のテキスト色・背景色を変更した場合に、
スクロールバーを上下させると、異なる行の色が変わってしまいます。
どのようにすれば特定行のみ変更されるのでしょうか。

【回答】
APIリファレンスの[CURL.GUI.CONTROL-LOGICAL]-[RecordGridUI]
の項内のメソッド[get-cell-at-index]の項にも記述されていますように、
セルは使い回しが行われます。

そのため、特定行のセルを変化させたつもりでも、セルが使い回されるため
何か操作した際(スクロールバーの移動等)に別のデータを表示することとなり、
別のデータの色が変化してしまうことがあります。

カスタムセルを使用することで、今回の現象を解決することができます。
詳細は以下のサンプルをご参照ください。

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

{define-class public ControlCell {inherits StandardStringCell}

  {constructor public {default}
    {construct-super}
  }
  {method public open {refresh-data}:void
    {unset self.background}
    {unset self.color}

    {if rec == self.record then
        set self.background = “red”
        set self.color = “blue”
     else
    }
   
    {super.refresh-data}
  }
}

{let data:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “DATA01”, domain = String},
            {RecordField “DATA02”, domain =String},
            {RecordField “DATA03”, domain = String}
        },
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”},
        {RecordData DATA01 = “1”, DATA02 = “2”,DATA03 = “3”}
    }
}

{let grid:RecordGrid =
    {RecordGrid
        width = 286pt,
        height = 80pt,
        record-source =data,
        {RecordGridColumn “DATA01”, cell-spec = ControlCell, edit-on-focus? = false},
        {RecordGridColumn “DATA02”, cell-spec = ControlCell, edit-on-focus? = false},
        {RecordGridColumn “DATA03”, cell-spec = ControlCell, edit-on-focus? = false}
    }
}

{let no:int = 1}
{let rec:#Record}

|| 色変更ボタン
{let btn:CommandButton =
    {CommandButton
        width = 100pt,
        height = 50pt,
        label = “2行目の色を変更する”,
        {on e:Action do
            {set rec = grid.records[no]}
            {grid.records.load}
        }
    }
}

{View
    {VBox
        grid,
        btn
    },
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}

また、Curl開発者ガイドの
[データの管理と表示]-[データ レコードとグリッド]-[カスタム セルの作成]
の項をご参照ください。 

RecordGridのフォーカス設定について

【ご質問】
“note-grid-focus-out”メソッドを用いて、セルに入力された値をチェックした際にエラーだった場合、
フォーカスを「エラーのあったセル」に設定したいのですが、どうすればよいのでしょうか。

【回答】
チェック後にafterマクロを使用してbecome-activeメソッドを呼び出すことで実現可能です。

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

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

{def grid =
    {RecordGrid
        record-source = {RecordSet
                            {RecordFields
                                {RecordField “id”},
                                {RecordField “value”, domain = String, nullable? = true}
                            },
                            {RecordData id = “001”},
                            {RecordData id = “002”},
                            {RecordData id = “003”},
                            {RecordData id = “004”},
                            {RecordData id = “005”}
                        },
        automatic-columns? = false,
        editable? = true,
        {RecordGridColumn “id”, editable? = false},
        {RecordGridColumn “value”, cell-spec = MaxCharChangeableCell}
    }
}

{define-class public MaxCharChangeableCell {inherits StandardStringCell}

  {constructor public {default …}
    {construct-super}
    set self.background = “white”
    set self.border-color = “gray”
    set self.editable? = true
  }
  {method public {note-grid-focus-out}:void
    ||入力値が1であった場合はcorrect?をfalseにする
    {super.note-grid-focus-out}
    let correct?:bool = {if {self.record.get “value”} == “1” then
                                  false
                              else
                                 true
                              }
    {if not correct? then
        {popup-message “1は入力出来ません”}
        ||フォーカスを元に戻して再入力を促す処理
        {after 0s do {self.become-active}}
     else
        {super.note-grid-focus-out}
    }
  }  
}

{View
    {VBox
        grid
    },
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}

セルの最大入力桁数を可変にするには

【ご質問】
Recordのあるフィールドの値をもとに、別フィールドの最大入力桁数を制御したいのですが可能でしょうか。

【回答】
カスタムセルを使用し、「refresh-data (メソッド)」内で制御処理を行うことで実現可能です。

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

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

{def grid =
    {RecordGrid
        record-source = {RecordSet
                                   {RecordFields
                                       {RecordField “id”},
                                       {RecordField “halign”},
                                       {RecordField “length”},
                                       {RecordField “value”, domain = String, nullable? = true}
                                   },
                                   {RecordData id = “A001”, halign = 0.0, length = 4},
                                   {RecordData id = “A002”, halign = 1.0, length = 7},
                                   {RecordData id = “A003”, halign = 0.3, length = 3},
                                   {RecordData id = “A004”, halign = 0.7, length = 1},
                                   {RecordData id = “A005”, halign = 0.5, length = 5}
                               },
        automatic-columns? = false,
        editable? = true,
        {RecordGridColumn “id”, editable? = false},
        {RecordGridColumn “length”, editable? = false},
        {RecordGridColumn “value”, cell-spec = MaxCharChangeableCell}
    }
}

{define-class public MaxCharChangeableCell {inherits StandardStringCell}

  {method public {refresh-data}:void
    {if-non-null editor = self.current-editor, rec = self.record then
        {try
            set editor.halign = rec[“halign”] asa double
            set editor.max-chars = rec[“length”] asa int
         catch e:Exception do
            {dump e}
        }
    }
    {super.refresh-data}

  }
}

{View
    grid,
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}

フォーマット付きのRecordGrid入力について

【ご質問】
カンマ区切りで表示しているセルに対して、値を変更させても初期値に戻ってしまいます。
カンマが付加された状態で、値の変更を行うことは可能でしょうか。

【回答】
RecordGridのローカルオプション”parse-spec”を使用し、値の設定を行うことで実現可能です。

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

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

{import * from CURL.LANGUAGE.FORMAT}

{let sample:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “Month”, domain = String},
            {RecordField “Sum”, domain = double}
        },
        {RecordData Month = “April”, Sum = 100},
        {RecordData Month = “May”, Sum = 101212},
        {RecordData Month = “June”, Sum = 1522}
    }
}

{let rg:RecordGrid =
    {RecordGrid
        record-source = sample,
        height = 5cm,
        automatic-columns? = false,
        {RecordGridColumn “Month”},
        {RecordGridColumn
            “Sum”,
            format-spec =
                {proc {data:any, r:Record}:String
                    let number-format:NumberFormatter = {NumberFormatter}
                    set number-format.use-grouping? = true
                    set number-format.grouping-size  = 3
                    set number-format.grouping-separator = “,”
                    {return {number-format.format data}}
                },
            parse-spec  = {proc {data:String}:any
                                   {if data != “” then
                                     {try
                                         let number-parser:NumberParser =
                                             {NumberParser allow-grouping? = true}
                                     
                                         set data = {String {number-parser.parse-int64 data}}
                                     
                                      catch e:Exception do
                                         set data = “”
                                     }
                                  }
                                 {return data}
                               }
        }
    }
}

{value rg}

また、APIリファレンスの
[CURL.GUI.CONTROL-LOGICAL]-[RecordGridOptions]
の項内のプロパティ[parse-spec]の項をご参照ください。 

double型の値が正しく表示されない

【ご質問】
RecordGridでdouble型の値が正しく表示されません。
正しく表示させるには、どのようにしたらよいでしょうか。

【回答】
これは2進数で表現しようとした際に丸めを必要とする値に関して発生する一般的な問題です。
例えば、0.1を2進数で表現しようとすると、「0.000110011001100…」という無限小数になります。
コンピュータでは有限の桁数分しか扱えませんので、このような値を扱う場合には必ず丸め処理が発生します。
その結果、表示上元の値とは異なる近似値になってしまいます。

以下のような回避策があります。
 RecordGridColumnに”format-spec”を設定する
 ※”format-spec”を使用することで、表示する値を適当な表示にフォーマットする事が可能です。

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

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

{let num:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField “Num”, domain = double}
        },
        {RecordData Num = 123456},
        {RecordData Num = 1234567},
        {RecordData Num = 12345678},
        {RecordData Num = 123456789},
        {RecordData Num = 1234567890},
        {RecordData Num = 1234567890.1}
    }
}

{let rg:RecordGrid =
    {RecordGrid
        record-source = num,
        height = 250pt,
        automatic-columns? = false,
        {RecordGridColumn “Num”}
    }
}

{value rg}

TabPaneの表示/非表示の制御をするには

◆ご質問◆
RadioButtonを変更することでタブの表示/非表示を制御することは可能でしょうか。

 

◆回答◆
TabContainer内の各タブはTabPaneというクラスで実装されており、簡単なプロパティの変更などで表示/非表示の制御を行うことは出来ません。
また、TabContainerはTab+Ctrlキーによりタブ遷移を行う事も可能ですので、この動作も制御する事が必要です。

詳細はSampleをご参照ください。

尚、TabContainer内でショートカットキーを使用するような場合は
上記のキー制御により意図しない動作をする可能性がある事をご留意下さい。