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

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

Tableの罫線幅の設定について

◆ご質問◆
Tableの罫線の幅を設定したいのですが、どのようにすればよいのでしょうか。
また、罫線の色を変更することはできるのでしょうか。

◆回答◆
罫線の幅および罫線の色の設定は、
Tableクラスにある以下オプションを設定することで可能です。

  ・horizontal-line-color
  ・horizontal-line-width
  ・vertical-line-color
  ・vertical-line-width

詳細はCurl開発者ガイドの
[グラフィカルユーザインターフェイス]→[グラフィカルコンテナ]
→[表]→[表のオプション]→[水平線および垂直線の使用]

Curlで表示した画像をExcelにコピーする

【ご質問】
Curlで表示した画像(.gif など)をExcelに貼り付けるには、どのようにしたらよいのでしょうか。

【回答】
Clipboard.set-objectを使用することで実現可能です。

{{Clipboard.get-system-clipboard}.set-object
    {Pixmap.from-url
        {url [画像ファイルのURL]}
    }
}

詳細は、Curl開発者ガイドの
[CURL.DESKTOP.CLIPBOARD]-[Clipboard]
の項内のメソッド[set-object]の項をご参照ください。 

RecordGridの横スクロールについて

【ご質問】
RecordGridにて、プログラムから特定のセルが表示されるように
スクロールさせるにはどのようにすればよいのでしょうか。
Cellにフォーカスを設定せずに、カラムをスクロールさせる手段が見つかりませんでした。
フォーカス設定をせずに横スクロールをすることはできるのでしょうか。

【回答】
SkinnableRecordGridUIを継承したクラスを自身のui-objectに設定し、
“reveal-index(メソッド)”をオーバーライドすることで実現可能です。

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

{curl 7.0,8.0 applet}

{define-class public MySkinnableRecordGridUI {inherits SkinnableRecordGridUI}
  {constructor public {default …}
    {construct-super …}
  }

  {method public {my-reveal-index row-index:int = -1, column-index:int = -1}:void
    {super.reveal-index row-index = row-index, column-index = column-index}
  }
}

{value
    let rs:RecordSet = {RecordSet
                           {RecordFields
                               {RecordField “a”, nullable?=true},
                               {RecordField “b”, nullable?=true},
                               {RecordField “c”, nullable?=true},
                               {RecordField “d”, nullable?=true},
                               {RecordField “e”, nullable?=true},
                               {RecordField “F”, nullable?=true}
                           },
                           {RecordData},{RecordData},{RecordData},{RecordData e = “target”},
                           {RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData},
                           {RecordData},{RecordData},{RecordData},{RecordData},{RecordData}
                       }
    let rg:RecordGrid = {RecordGrid ui-object = {MySkinnableRecordGridUI},
                            record-source = rs}
   
    {VBox
        {CommandButton label = “test”,
            {on Action do
                let ui:MySkinnableRecordGridUI = rg.ui-object asa MySkinnableRecordGridUI
                {dump ui}
                {ui.my-reveal-index row-index = 3, column-index = 4}
            }
        },
        rg
    }
}

IME(変換モード)の制御について

◆ご質問◆
IMEの制御について、入力モードは”input-method-keyboard-mode”で制御可能という認識ですが、
変換モードを制御することは可能でしょうか。

◆回答◆
入力モードについては、”input-method-keyboard-mode”にて制御することが可能ですが、
変換モードについては、生憎、Curlからは制御することができません。

マウスの操作について

◆ご質問◆
マウスの操作について、以下の操作をCurlで対応することは可能でしょうか。

 1.チルトホイールなどを使った横スクロールをする。
 2.マウスのプロパティにある「ポインタを自動的に既定のボタン上に移動する」を有効にする。

◆回答◆
これらはマウスおよびOSの機能により制御されているため、Curlによってその動作を制御することはできません。

TextDisplayで複数行を表示させるには

【ご質問】
TextDisplayにおいて幅が狭く入力文章が途中で切れてしまいます。
複数行で全て表示するにはどのようにしたらよいのでしょうか。

【回答】
TextDisplayは一行で文字列を表示する想定で作られているため、
複数行を表示することはできません。

TextDisplayで複数行を表示させたい場合は、ロジックを改変した
TextDisplayに似せた新しいコントロールを作成する必要があります。
一例としては、TextAreaの背景色を調整し、文字編集を不可にすることで
TextDisplayに似たものになります。
以下のサンプルをご参照ください。

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

|| SkinnableTextAreaUIのサブクラス
{define-class public CustomTextAreaUI {inherits SkinnableTextAreaUI}
  {constructor public {default …}
    {construct-super {splice …}}
    def v-bar = {self.scrollbox.get-vscroll}
    || スクロールバーは表示しない
    set v-bar.thickness = 0px
  }
}

{def text-area ={TextArea
                           width = 5cm,
                           height= 3cm,
                           ui-object = {CustomTextAreaUI},
                           value = {String.repeat-char ‘a’,100},
                           control-content-background = “#E0E0E0”,
                           editable? = false
                       }
}

{value
    text-area
}

 

バージョンにより印刷結果が異なる

【ご質問】
Curl RTE 4.0.6と、Curl RTE 7.0.3を使用して、
それぞれ印刷を行うと印刷結果が異なります。
バージョンによって印刷結果が異なるのは仕様なのでしょうか。
また、Curl RTE 7.0.3使用時に、Curl RTE 4.0.6と
同様の印刷結果にするにはどうしたらよいのでしょうか。

【回答】
この現象はRenderingModeに起因しています。
このRenderingModeはVer 6より導入した機能で、
Viewをレンダリングするモードを定義することができます。
Ver 7のdeafultでは”high-quality”が設定されております。

Ver 4と同一のレンダリングにするには
RenderingMode.normalを設定することで可能です。

下記のコードを用いることでRenderingModeを変更することができます。
{set-rendering-mode RenderingMode.normal}

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

また以下のFAQもご参照ください。
http://developers.curlap.com/faq/49-faq-operation/317-2010-10-07-03-51-17.html
http://developers.curlap.com/faq/49-faq-operation/308-ver7.html

シングルクリックとダブルクリックを排他的に制御したい

【ご質問】
画面部品をシングルクリックまたはダブルクリックしてそれぞれ排他的に別々の処理をしたいと考えています。
しかし、ダブルクリックした場合、シングルクリック分のPointerPressイベントが発生してしまいまいた。
つまりダブルクリックの場合は、2回イベントが発生します。

これを制御し、ダブルクリックした時はシングルクリック分のPointerPressイベントが
発生しないようにすることは可能でしょうか。

【回答】
ダブルクリックをするとclick-countが1のときの処理が起動し、
その後click-countが2のときの処理が起動します。
この動作はCurlの仕様です。

以下は解決案の1つとして作成したサンプルです。

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

{let my-alarm:#Alarm}

{View
    {Frame width = 8cm, height = 8cm, background = “yellow”,
        {on e:PointerPress do
            {if e.button == left-button then
                {if e.click-count == 1 then
                    {set my-alarm = {Alarm
                                                delay = 0.4s,
                                                {proc {}:void
                                                     {output “シングルクリック”}
                                                }
                                            }
                    }
                elseif e.click-count == 2 then
                    {output “ダブルクリック”}
                    {my-alarm.cancel}
                }
            }
        }
    },
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}
 

クリック後、任意の時間内にもう一度クリックされるかどうかを判断し、実行する処理を変えています。
任意の時間は「”複数クリック実行時のクリック間の最大遅延秒数(0.3s)” + 0.1s」で設定しています。
ただしこの方法ですと、シングルクリック実行時の処理が遅く感じられます。

この処理の遅さが許容されるかどうかは分かりませんが、
PointerPressの回数に応じて処理を分岐させるような構造は、
見直して頂く必要があるように思われます。

バージョン間でのTabContainer の仕様について

【ご質問】
TabContainerに関して、Ver 5とVer 7ではタブが幅に収まらない場合の
レイアウト・操作が異なります。

 Ver 5の場合:
 左右(上下)のボタンで表示位置を調整することで、タブの選択を行う。

 Ver 7の場合:
 ボタンを押下するとタブの一覧がコンテキストで表示され、その中から選択を行う。

Ver 7のTabContainerでVer 5相当の動作を行うようにすることは可能でしょうか。

【回答】
Ver 7より TabContainer の仕様が変更されたため、レイアウトが変更されています。

“install-standard-look-and-feel”プロシージャを用いることで
Ver 5と同様のレイアウトで表示することが出来ます。

詳細は、APIリファレンスの
[CURL.GUI.STYLED-CONTROLS]-[install-standard-look-and-feel]
の項をご参照ください。

ただし、このプロシージャを用いるとスキンが適用されず、丸みのないTabContainerでの
表示となります。(操作性だけでなく外見もVer 5と同様のものになります。)

外見が Ver 7 のままで、ボタンの配置や操作性を Ver 5同様にされたいのであれば、
オープンコントロールを使用する必要があります。
ただし、オープンソースを大幅に修正する必要があるため、作業に時間を要します。
※オープンコントロールは標準コントロール部品全体を複製しているため、
  ソースのコンパイル等に時間を要し、
  全体の処理速度が遅くなる可能性がありますので、
  使用する際はお気をつけください。

詳細は、Curl開発者ガイドの
[グラフィカル ユーザー インターフェイス]-[ダイアログ と コントロール]-[オープン コントロール]
の項をご参照ください。

グラフの軸の値をカンマ区切りで表示したい

【ご質問】
グラフの軸の数値をカンマ区切り形式にする場合、どのようにすればよいのでしょうか。

【回答】
Y軸のカスタマイズはLayeredChart.left-axis-parentを使用することで可能となります。
数値のカンマ区切りはNumberFormatterを使用することで可能となります。

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

詳細は、APIリファレンスの
[CURL.LANGUAGE.FORMAT]-[NumberFormatter]
の項をご参照ください。 

バージョン7以前のデザインへ変更するには

【ご質問】
Curl7.0からスキンコントロールが標準導入され、スキンが適用されたデザインになっていますが、
Curl6.0のようなクラシックなデザインに変更するには、どうしたらよいのでしょうか。

【回答】
“install-standard-look-and-feel”プロシージャを使用することで実現可能です。

詳細は、APIリファレンスの
[CURL.GUI.STYLED-CONTROLS]-[install-standard-look-and-feel]
の項をご参照ください。 

RecordGridの列の表示・非表示

【ご質問】
RecordGridにおいて、特定の列の表示・非表示を切り替えるにはどのようにすればいいのでしょうか。

【回答】
RecordGridクラスのbase-columnsアクセサに、
表示したいRecordGridColumnの配列を設定することで
任意の列を表示することができます。

詳細は、Curl開発者ガイドの
[データの管理と表示]-[データ レコードとグリッド]-[RecordGrid の外観の変更]-[カスタム列の作成]
の項とAPIリファレンスの
[CURL.GUI.CONTROL-LOGICAL]-[RecordGrid]
の項内のプロパティ[base-columns]の項をご参照ください。 

カレンダーコントロールで表示する順序を任意に設定するには

【ご質問】
Curl標準のカレンダーコントロールにて、スピンコントロールが月→年の順に表示されていますが、
年→月の順とすることは可能でしょうか。

【回答】
CalendarControlに用意されているオプション等を設定するだけで、
スピンコントロールの並びを任意に変えることは出来ません。

しかし、CalendarControlのグラフィック階層をたどる方法で変更することは可能です。
この方法は、CalendarControlのグラフィック階層は固定であるということを前提としています。
バージョンが代わった際にCalendarControlのグラフィック階層が変更されていると、
この方法は使えなくなりますので御注意下さい。

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

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

{value
    let calendar:CalendarControl = {CalendarControl}
    let cal-ui:SkinnableCalendarControlUI = calendar.ui-object asa SkinnableCalendarControlUI
    let internal-frame:Frame = {cal-ui.graphical-children.read-one} asa Frame
    let internal-grid:Grid = {internal-frame.graphical-children.read-one} asa Grid
    let calendar-objects:{Array-of Graphic} = {{Array-of Graphic}}
    {for g:Graphic in internal-grid.graphical-children do
        {calendar-objects.append g}
    }

    def v-fid = {GridFiducial internal-grid, horizontal? = false}
    def h-fid = {GridFiducial internal-grid, horizontal? = true}

    {internal-grid.add
        calendar-objects[1],
        left = {internal-grid.left}, top = {internal-grid.top},
        right = v-fid, bottom = h-fid
    }   
    {internal-grid.add
        calendar-objects[0],
        left = v-fid, top = {internal-grid.top},
        right = {internal-grid.right}, bottom = h-fid,
        vorigin = {internal-grid.vorigin-fiducial}
    }
    {internal-grid.add
        calendar-objects[2],
        left = {internal-grid.left}, top = h-fid,
        right = {internal-grid.right}, bottom = {internal-grid.bottom}
    }

    {Table columns = 2,
        {text 通常のCalendar}, {text カスタマイズしたCalendar},
        {CalendarControl}, calendar
    }
}

予期しない例外発生時のハンドリング

【ご質問】
Curlアプリケーションにおいて、予期されない例外(プログラムの不具合など)が発生した場合に、
ハンドリングすることは可能でしょうか。

【回答】
予期されない例外(catchされなかった)等が発生した場合は、
通常であれば、そのまま”アプリケーションが落ちる”(exitが呼ばれる)ということになります。
しかし、install-unexpected-exception-handlerを使ってプロシージャを登録しておくと、
そのプロシージャをexitが呼ばれる前に実行させる事が出来ます。

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

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

{install-unexpected-exception-handler
    {proc {exception:Exception, backtrace:String}:void
        {popup-message “システムエラーが発生しました”}
        {dump exception.value}
        {dump backtrace}
    }
}

{View
    {Frame width = 8cm, height = 8cm,
        {CommandButton label = “システムエラーを発生させる(ダミー)“,
            {on Action do
                {throw {Exception “○○エラーです”}}
            }
        }
    },
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}

振り仮名を取得したい

【ご質問】
漢字入力した文字列の振り仮名を「半角カナ文字」で表示を行いたいのですが、
どのようにしたらよいのでしょうか。

【回答】
CompositionResultEvent.reading-stringを用いることで実現可能です。

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

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

{let input:String = “”}
{let tf:TextField = {TextField}}
{let td:TextDisplay = {TextDisplay}}

{tf.ui-object.add-event-handler
    {on e:CompositionResultEvent do
        set input = e.reading-string
    }
}

{tf.add-event-handler
    {on e:ValueChanged do
        set td.value = input
    }
}

{value
    {VBox
        spacing = 10pt,
        tf,
        td
    }
}

基点をずらしてグラフを表示させるには

【ご質問】
BarLayer等でデータ毎に起点を指定して表示させることは可能でしょうか。

【回答】
基点の位置をずらすようなAPIは標準で用意されていませんが、
透明なレイヤを表示させることで実現可能かと思います。

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

{curl 6.0,7.0,8.0 applet}

{import * from CURL.GUI.CHARTS}

{define-proc package {v-gradient
                                   start-color:FillPattern,
                                   highlight-color:FillPattern,
                                   end-color:FillPattern,
                                   highlight-pos:double = 0.5
                               }:FillPattern
    {return
        {LinearGradientFillPattern
            {Fraction2d 0, 0},
            {Fraction2d 0, 1},
            {Spectrum.from-envelope
                start-color,
                0.0,
                highlight-color,
                highlight-pos,
                end-color,
                1.0
            }
        }
    }
}

{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 chart:LayeredChart =
    {LayeredChart
        width = 10cm,
        height = 6cm,
        flipped? = true,
        legend-enabled? = false,
        color-palette =
            {new {Array-of FillPattern},
                {v-gradient “transparent”, “transparent”, “transparent”},
                {v-gradient “blue”, “lavender”, “steelblue”},
                {v-gradient “red”, “mistyrose”, “crimson”}
            },
        bar-border-width = 0px,
        {BarLayer
            stacking-mode = ChartStackingMode.stacked,
            {ChartDataSeries records, “M1”},
            {ChartDataSeries records, “M2”},
            {ChartDataSeries records, “M3”},
            x-axis-data = {ChartDataSeries records, “Region”}
        }
    }
}

{value
    chart
}

WinInetのエラーを取得するには

【ご質問】
Microsoft Win32 Internet (WinInet)のエラーを
Curlにてキャッチすることは可能でしょうか。

【回答】
WinInetでのエラーはCurl内ではHttpException等によってラップされ
アプリケーションに伝えられます。
しかし、WinInetのエラーが返ってきた場合に直接Curlアプリケーションから
キャッチすることは標準APIではできません。

ただし、HttpException.message内にWinInetのエラーコードが
含まれることがありますので、それを文字列解析して取得することは可能です。

プリンタの両面・片面印刷の制御について

【ご質問】
Curl Ver.7では印刷機能にて、両面・片面印刷の制御は可能でしょうか。

【回答】
Curlから印刷ダイアログを呼び出し、そこからプリンタのダイアログを呼び出して、
片面/両面印刷を指定することは可能です。
Curlのプログラムの中で片面/両面印刷を明示的に指定することは
残念ながらVer7.0及びにそれ以前のバージョンにおいては不可能です。

※Curlバージョン8では片面/両面印刷の指定が可能になっています。
印刷機能の強化によってprint-graphicプロシージャにて片面/両面印刷指定が可能になっています。
以下のページをご参照ください。
http://developers.curlap.com/re-reference/56-print/744-print-graphic.html