「Curlの動作・振る舞いについて」カテゴリーアーカイブ

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

become-activeとrequest-key-focusの違いについて

【ご質問】
特定処理後に、あるコントロール(CommandButtonやTextFieldなど)にフォーカスを
割り当てたいと考えています。
メソッド become-active と request-key-focus いずれを使用しても
正常にフォーカス割り当ては出来たのですが、この2つのメソッドにはどのような違いがあるのでしょうか。

【回答】
request-key-focusはVisualクラスとそのサブクラスで使用出来るメソッドです。
become-activeはVisualのサブクラスであるActiveTraversorで使用出来るメソッドになります。
したがいまして request-key-focus のみ使用可能なオブジェクトが存在します。
(例.Shapeではrequest-key-focusは使用出来ますが、become-activeは使用出来ません。)

ActiveTraversorのサブクラスであるControlは一般的に複数のオブジェクトを組み合わせて
構成されており、become-active はどのオブジェクトにキーボードフォーカスを持たせれば
良いかの制御を行いますが、request-key-focusはそのような制御は行いません。

また request-key-focus を使用した場合はアクティブになった時にキーフォーカス要求を自動で行います。

上記のような理由からAPIリファレンス上では、両方使用可能なオブジェクトにおいては
become-active を呼び出すように記載されています。

キャッシュデータの保存先に関して

【ご質問】
Curlのキャッシュはどこに保存されるのでしょうか。
また保存先の変更は可能でしょうか。

【回答】
Curlのパッケージキャッシュの保存先は以下の通りです。
(Curlコントロールパネル「全般」タブ内の「キャッシュ設定」ボタンを
押すと表示されるダイアログ上で確認可能です。)

WindowsXPの場合:
%USER_HOME%\Application Data\Local\Curl Corporation\Surge\package-cache
(通常 %USER_HOME% は C:\Document and Settings\[ユーザー名] になります。)

WindowsVista以降の場合:
%USER_HOME%\AppData\Local\Curl Corporation\Surge\package-cache
(通常 %USER_HOME% は C:\Users\[ユーザー名] になります。)

上記保存先は固定されており変更を行うことは出来ません。

例えばログオフ時に
%USER_HOME%\AppData\Local
配下を削除するような運用環境においてはキャッシュ機能を活用することは
出来ないことをご了承下さいますようお願いします。

GestureTouchが発生しません

【ご質問】
WindowsOSにてCurl8をマルチタッチデバイス上で使用しています。
CurlIDEドキュメントに記載されている以下のサンプルを使用して
Gesture系イベントの発生状況を確認しています。

Windows上でサポートされているGestureイベントとして
GestureTap、 GestureMagnify、 GestureRotate、 GestureTouch
が記載されていますが、GestureTouchが発生しません。

GestureTouchはどのような操作をした際に発生するイベントでしょうか。

{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:GestureBegin at f:Frame do
            {e.continue-implicit-pointer-grab f}
            {f.clear}
            set f.background = “green”
        },
        {on e:GestureEvent at f:Frame do
            {if not (e isa GestureBegin) and not (e isa GestureEnd) then
                {f.add replace? = true, {String e}}
            }
        },
        {on GestureEnd at f:Frame do
            {unset f.background}
        }
    }
}

【回答】
Curlにはタッチ操作に関するモードであるTouchInputModeというものがあります。
このTouchInputModeは初期状態では gesture という値になっております。

TouchInputMode=gestureの際には2本以上の指で行う操作である
GestureTap、 GestureMagnify、 GestureRotateは認識しますが
GestureTouchは認識しません。

TouchInputModeを bundled に変更することで1本指で行う操作である
GestureTouchを認識するようになります。
(ただしGestureTap、 GestureMagnify、 GestureRotateは認識しなくなります。)

上記サンプルの場合は、下記のコードを追記することでGestureTouchを
認識するようになります。
{on e:AttachEvent at f:Frame do
    {{f.get-view}.set-touch-input-mode “bundled”}
}

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

GestureBeginが発生しません

 【ご質問】
Curl8をマルチタッチデバイス上で使用しています。
CurlIDEドキュメントに記載されている以下のサンプルを使用して
デバイス上をタッチしてもGestureBeginが発生しません。

GestureBeginを発生させるためにはなにか条件があるのでしょうか。
またGestureBeginはどのような時に発生するイベントでしょうか。 

{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:GestureBegin at f:Frame do
            {e.continue-implicit-pointer-grab f}
            {f.clear}
            set f.background = “green”
        },
        {on e:GestureEvent at f:Frame do
            {if not (e isa GestureBegin) and not (e isa GestureEnd) then
                {f.add replace? = true, {String e}}
            }
        },
        {on GestureEnd at f:Frame do
            {unset f.background}
        }
    }
}

【回答】
GestureBegin・GestureEndイベントはCurlにてサポートされているGesture系イベントが
発生した際に、その前後で発生するイベントです。
例.2本指でGestureMagnifyを発生させると、その前後にGestureBegin・GestureEndが
  発生していることが確認出来ます。

GestureBeginイベントはタッチ操作の開始時(タッチデバイス上を触り始めた時)に
発生するものではないことにご注意下さい。

詳細は、Curl開発者ガイドの
[グラフィカル ユーザー インターフェイス]-[ポインタ イベント]内の
[ジェスチャー イベント]項をご参照ください。

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の判断に依存します)

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

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」
 をご利用頂くことで対応可能です。

 

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

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

【回答】
 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の共存はサポート
   できません。)

 

うるう秒について

【ご質問】
 うるう秒の調整に対して、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にて回避して頂く様お願い致します。

小数点の処理について

【ご質問】

 下記式で、少数第3位の四捨五入を正しく行いたいのですが、

 {value {floor 2.445 * 100 + 0.5} / 100}
 2.445 * 100 = 244.49999999999997
 244.5とならず、正しく四捨五入できません。

【回答】

これは2.445を2進数で表現すると
10.011100011110101110000101000111101011 …
となり延々と続いてしまいます。
コンピュータは無限に続くものを処理することは不可能ですので
どこかでこの値を丸め近似値として扱います。
ですので2.445*100が244.5にならず244.49999999999997となります。

これを回避するには
2進表現で循環小数とならないように計算式自体を工夫する必要があります。

例えば
2進表現で循環小数とならないように全て整数で
計算して最後に元の小数になるように処理すればよいかと思います。
{floor 2445 / 10 + (1 / 2)} / 100  のようにするなどです。

期限付きDeploymentライセンス警告に関して

【ご質問】

期限付きDeploymentライセンスのメッセージ出力について教えてください。

 

【回答】

以下のように出力されます。

ライセンス切れの日付が30日を切ると
「このアプレットのライセンスは、数週間で有効期限が切れます。」

20日を切ると
「このアプレットのライセンスは、%d 日で有効期限が切れます。」
(%dには切れる日までの日数が入ります)

2日を切ると
「このアプレットのライセンスは、明日有効期限が切れます。」

 

コンポーネントの登録に失敗します

【ご質問】

Crul8.0のVLEで7.0時代に作成したコンポーネントを登録しようとするとエラーが発生します。


機能拡張ファイル [ファイル名] をロード中にエラーが発生しました。
この機能拡張ファイルは、インストールされたパレット機能拡張のリストに
追加されていませんが、機能拡張ファイルのロードの試行によりエラーが発生する前の
ビジュアル レイアウト エディタ の状態に影響する可能性があります。
ビジュアル レイアウト エディタ の状態がこの方法で影響された場合、
マシンを再起動するか、Curl コントロール パネルを使用して
Curl ランタイムをシャット ダウンするまで、その影響が続く可能性があります。

次のテキストには、発生したエラーについての詳細が示されています。

SyntaxError: [ファイル名]:1[1]: 重複している ‘{curl … manifest}’
ステートメントに互換性がありません。 以前の宣言と一致するバージョンがありません。

【回答】
残念ながら CurlPro/IDE8.0.1000 のパレット拡張機能を用いて
Ver8以外のパレットを拡張することは不可能で御座います。

VLE機能拡張コンポーネントを作成するには作成したい
コンポーネントと同じバージョンのVLE機能拡張エディタを
使用しなければなりません。
Ver8の機能拡張を行う場合は、Ver8のIDE(VLE)をお使い頂き、
Ver8の機能拡張エディタをご使用下さいませ。

御手数ですが、御理解頂けます様御願い致します。

ロケール変更を行っての帳票印刷について

【ご質問】

「ロケールを切り替えて印刷を行うと、印刷物の文字フォントが変わる。」
 という現象が発生しております。

【回答】

font-familyの指定がなされていない場合、font-familyに sans-serif が指定されたものとして振舞います。
sans-serifには日本語フォントを保持していないため、
この際の挙動がOSやプリンタの仕様に従います。

これを回避するには、
font-familyを明示的に指定することで回避することが可能です。

font-familyの設定に関して

【ご質問】
Curl開発者ガイドの
[テキスト書式]-[文字書式およびオプション]
の項内の「font-family」の説明内に

 「一致するフォント書体がリストにない場合は
 任意のフォントが選択される可能性があります。」

と記載されていますが、font-familyの指定を行っていない場合
フォントとしてどのフォントが使われているのでしょうか。

例えばfont-familyを特に指定していない場合、
CommandButtonのラベルではどのフォントが使われるのでしょうか。

【回答】
font-familyを設定していないテキストのフォントは
OSのバージョン・設定によって変わります。

CommandButtonのラベルに関しては
OSの以下の設定によって使用されるフォントが変わります。
 ・WindowsXPの場合
  [[デスクトップ上で右クリックしてプロパティ選択]-[デザイン]-[詳細設定]
 ・WindowsVista・7・8の場合
  [デスクトップ上で右クリックして個人設定選択]-[ウインドウの色]-[デザインの詳細設定]

以下のサンプルコードと実行例を参考にしてください。

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

{VBox
    {CommandButton
        font-size = 20pt,
        label = “abc ABC ああいいううええおお”},
    {text
        font-family = “メイリオ”,
        font-size = 20pt,
        abc ABC ああいいううええおお(メイリオのサンプル行)}
}

上記コードをWindows7上で実行した際の様子

OSの設定が以下の設定の場合(初期状態です。フォントはメイリオになっています)
766-font-standard-1.png

上記サンプルコードを実行すると以下のように表示されます。
CommandButtonのラベルがメイリオのサンプル行と同じ書体であることからメイリオであることが分かります。

766-font-standard-2.png

OSの設定を以下の様に変更した場合(フォントをメイリオからMS 明朝に変更)
766-font-standard-3.png

上記サンプルコードの実行画面は以下のようになります。
メイリオのサンプル行と見比べると、CommandButtonのラベルのフォントが変わっていることが分かります。

766-font-standard-4.png

 

ロードバランサ利用時の留意点

【ご質問】
ロードバランサ利用時の留意点等ありましたら教えてください。

【回答】
Curlはサーバへの依存度は低いため、ロードバランサ利用時における特殊な設定等は必要ありません。

ライセンスファイルにはCurlクライアントから参照する際のURL(ホスト名)を指定する必要があります。
(ロードバランサ配下の各サーバの実IP、ホスト名などと関係有りません)

尚、ロードバランサ導入に伴い、想定外の挙動となっている場合は、パケットキャプチャにて
通信を監視することでトラブルシューティングを行うことが有効です。

こちらのFAQもご参照ください。
http://developers.curlap.com/faq/49-faq-operation/578-loadbalancer.html