「FAQ」カテゴリーアーカイブ

Curlに関するFAQのページです

CDEで新規ファイル作成時の文字コード設定に関して

【ご質問】

CDEを使って新規Curlプロジェクト作成時や新規Curlソースファイルを作成した際に
{curl-file-attributes character-encoding = “shift-jis”}
と自動で文字コード設定が行われますが、変更出来ますか。

【回答】

これはCDEの設定ではなくEclipseの設定になります。

変更したい場合は
1.Eclipseメニューにて「Window」→「Preferences」をクリックしてPreferencesページを表示
2.ページ左の「General」-「Worspace」を選択
を行い表示される画面の下部「Text file encoding」にて設定出来ます。

RecordGridでのレコード選択状態について

【ご質問】

RecordGridに、select-recordメソッドを使用してレコードを選択したところ
選択状態の色には変わるが、セレクタが移動しません。

 

【回答】

RecordGridでは選択レコードと現在レコードの別々の概念があります。
セレクタは現在レコードを意味しています。

現在レコードを変更する場合はrequest-current-record-changeメソッドを
使用して下さい。

コード記述時のメモリ開放に関して

【ご質問】

コード記述の際に、メモリ開放やガベージコレクションなどの処理に関して
注意する必要はあるのでしょうか。

【回答】

コード記述の際に注意する必要は基本的にありません。

CurlではRTEがGC(ガベージコレクター)を利用してメモリ開放を行います、
GCの判断で、必要な場合、ガベージになったメモリ領域を回避します。
GCの仕組みとなっていることから、アプリケーションで明示的に
メモリ開放を行うことは出来ません。

早期にメモリ開放を行うようGCを呼び出すことは次のコマンドで実現可能です。
{garbage-collect}
ただし上記コマンドはGCを呼び出す為のコマンドです。
必ずしもメモリの開放を行うわけでは無いことに注意して下さい。
(メモリ開放を行うかどうかは、GCの判断に依存します)

またこちらのページ(メモリ管理について)も参考にして下さい。

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
    }
}

Pixmapのキャッシュについて

【ご質問】
Pixmap.from-streamにByteInputStreamを渡すと
ブラウザの一時フォルダにキャッシュが作成されません。

キャッシュを参照しないため常にWebサーバとの通信が発生してしまいレスポンス悪化の懸念が生じます。

【回答】
「Pixmap.from-streamにByteInputStreamを渡すと ブラウザの一時フォルダにキャッシュが作成されない」
動作は、Curlの仕様でございます。

回避策として、{stream.read}で読み込んだByteArrayデータから
ByteArrayInputStreamを作成することができますので、
このByteArrayInputStreamを{Pixmap.from-stream}に渡せば
streamを渡したときと同様にPixmapが作成することができます。

この形でPixmapを作成した場合には、ダウンロードされた画像ファイルをブラウザの一時フォルダにキャッシュされます。 

def png-path = {url http://www.curlap.com/shared/images/side_img_community.png}
{with-file-caching-style FileCachingStyle.resynchronize do
    {with-open-streams stream = {read-open-byte png-path} do

        || ByteArrayからByteArrayInputStreamを作成
        def byte-array = {stream.read} asa ByteArray
        def bais = {ByteArrayInputStream byte-array}
       
        || from-streamにはByteArrayInputStreamのオブジェクトを渡す
        def image-data = {Pixmap.from-stream
                             bais,
                             {non-null {file-extension-to-mime-type png-path.extension}}
                         }
       
        set frame-area.background = image-data
       
        {frame-area.add “”,replace?=true}
    }
}

連続したスペースの表示

【ご質問】
VBox、HBoxを使用して画面表示を行う際に
文字と文字の間に連続した空白を表示したいのですが可能ですか?

【回答】
 Curlでは基本的な規則として「空白を折りたたむ」という概念がありますので、
 空白スペースは折りたたまれて表示されます。
 
 「空白を埋める」目的を達成するために用意されている 
 「Fill」クラスをご利用頂くか、
 テキスト内の空白を保持するためのオプションである「text-preserve-whitespace? = true」
 をご利用頂くことで対応可能です。

 

タブの角を丸くする方法

【ご質問】
タブ(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,
                                                      現在選択中
                                                  }
                                              }
    }
}

再同期時刻を自動で設定する方法(キャッシュ制御)

【ご質問】
キャッシュ制御にて、再同期時刻を自動的に設定するような機能はありますでしょうか?

【回答】
 Curl 7.0にて追加された resync-file が有効です。

 resync-fileは、例えば以下の様に宣言することで
 ”manifest.mcurl”の最終更新時刻がアプレットの同期時刻として
 使用されるようになります。
    {applet
        resync-file = “manifest.mcurl”,
        manifest = “manifest.mcurl”
    }

 resync-fileに指定するファイルとして、
 アプリケーションリリース時などにおいて必ず変更されるファイルを指定する前提であれば、ご質問の動作を満たせるかと存じます。 

異なるバージョンの共存について(IDEとRTE)

◆ご質問◆
一つの端末にて、異なるバージョンのIDEおよびRTEを共存することは可能でしょうか。

◆回答◆
同じクライアントPC上で異なるメジャーバージョン
を持った複数のCurlアプリケーションを稼動させることができます。
(例:Curl RTE 8.0.2とCurl RTE 7.0.5が共存可能)

ただし、以下のような共存はできません。
 ・マイナーバージョンのみが異なるバージョンは共存できません。
  (例:Curl RTE 8.0.2とCurl RTE 8.0.1は共存できません。)

 ・開発ツール(CDE/IDE)とランタイムのマイナーバージョンを異なる
  状態で共存させることはサポートしません。
  (例:Curl IDE 8.0.1002とCurl RTE 8.0.1の共存はサポート
   できません。)

 

[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を用いることでプロセス終了時のイベントをハンドリング可能です。

 

うるう秒について

【ご質問】
 うるう秒の調整に対して、Curlは影響を受けますでしょうか?

【回答】
Curlに限った話ではなく、うるう秒の調整は全世界で一斉に各国の時刻サービス
機関によって調整する作業であり、全世界のOS、プログラムもすべて影響される
ことになると思います。
うるう秒の調整は、必要な時にIERS(International Earth Rotation and
Reference Systems Service)と呼ばれる国際機関によって決定されるもので、
OSやプログラム側で事前に予測不可であることを予めお含みくださいませ。

CurlではRTEが起動したタイミングでOS側の日時を利用しますのでOS側で
NTPサーバなどの時刻同期サービスを利用している場合は、
うるう秒調整後に起動したCurlのアプリケーションに対して反映されます。
但し、うるう秒調整前に起動したCurlのアプリケーションに対しては直ちに
同期するわけではありませんので、アプリケーションがクライアント時刻に依存
しているサービスがある場合、うるう秒の調整前後で一秒の誤差が発生します。
(一定のタイミングでOS側と同期しますので誤差発生期間は数十秒です。)

またうるう秒調整前に生成したCurlのDateTimeで時刻の計算や計測においても
うるう秒の要素が考慮されてません
(人間の操作よって起きた時刻変更の為、対応できません)。

このような誤差の回避はできませんので、必要に応じてCurlのRTE再起動で対応を
お願いします。

 

独立型アプレット起動時の警告メッセージ

【ご質問】
HTMLページに埋め込んでいる Curl(独立型アプレット)を起動するためのURLをクリックすると警告が表示されます。
——————————————————————————————————–
このWebサイトがこのコンピューターのプログラムを開くことを許可しますか?
□この種類のアドレスを開く前に常に警告する
——————————————————————————————————–

原因と対策を教えてください。

【回答】
このメッセージはブラウザから表示されるセキュリティ警告で、
Webブラウザからプログラムを起動する処理に対してブラウザが警告します。
(独立型アプレット起動時はcurl://カスタムスキームを使用してPC上のCurl RTEを起動します)

上記メッセージは、IEのものですが、Mozilla FirefoxやGoogle Chrome でも同様の警告が表示されます。

警告を表示させたくない場合の対処は2つございます。

 1.「□この種類のアドレスを開く前に常に警告する」にチェックする
 2.ブラウザから経由せずにショートカット「curl://launch/http://xxxx/aa.dcurl」を作ってアクセスする

対処1を許容できない場合は、2にて回避して頂く様お願い致します。

マルチタッチ端末での拡大縮小

【ご質問】
マルチタッチ端末で Curlのグラフィックを指操作にて 拡大 縮小を可能とすることはできませんでしょうか?
(ブラウザやイメージビューア上での拡大縮小の動き)  

【回答】
二本の指操作で拡大/縮小するジェスチャーは、Curlでは
GestureMagnifyイベントとして捕捉することができますが、
アプレット内容全体を拡大/縮小するAPIのようなものは
用意されておりません。

従いまして、指操作でアプレットが拡大/縮小しているように
見せるためには、このGestureMagnifyのイベントハンドラにおいて
アプレット内部のすべてのコントロール一つ一つのサイズを
レイアウトを維持したまま拡大/縮小するような処理を
記述する必要がありますが、あまり現実的ではありません。

マルチタッチによってIE等のように内容を拡大/縮小することは、
Curlアプレットでは可能でないものとお考えいただけますと幸いです。

【参考】マルチタッチとジェスチャーAPI :http://developers.curlap.com/re-reference/31-event/747-multitouchapi.html