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

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

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

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

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

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

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

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

CurlでAudio再生

【ご質問】
CurlでWAVファイルの再生をし、再生速度の変更ができますか?

【回答】
Curl開発者ガイド[サウンド]の項にも記載がありますが Curlでは
 ・パン(左右の調整:AudioBuffer.pan)、
 ・ボリューム(大小の調整:AudioBuffer.svolume)、
 ・周波数(AudioBuffer.sample-rate)
を操作することが可能です。

周波数を操作することで再生速度を変更可能です。
ただし、音程も同時に変化します。

会議中の会話を録音したWAVファイルを再生するような場合であれば
音程が変化しても許容範囲かとは存じますが 用途によりますので
予めご了承頂きますようお願い致します。

イメージの保存方法

【ご質問】
Curlで画面上に表示した特定の部品をJPEGにして保存する方法を教えてください。

【回答】
以下の手順にて作成することが可能です。

①GraphicオブジェクトをGraphic-to-PixmapプロシジャにてPixmapに変換し
②変換されたPixmapをImageData.save-to-urlにて画像保存することが可能です。

Ver.8ではPDFファイルの生成も可能でございます。(print-graphic-pdf)
こちらですと、Graphicオブジェクトを直接PDFファイルに保存できますので
実装が簡単かと思います。 併せてご検討頂ければと思います。

 

{curl 8.0 applet}

||グラフィックオブジェクト
{let g:VBox = {VBox
                  width  = 5cm ,
                  height = 5cm,
                  background = “blue”
              }
}

||グラフィックオブジェクトの表示
{value
    {VBox
        g,
        {HBox
            {CommandButton
                label = “JPEG”,
                {on Action do
                    let image-data:ImageData = {ImageData}
                   
                    ||グラフィックオブジェクトをPixmapに変換する
                    def pixmap = {Graphic-to-Pixmap g}
                   
                    ||ImageDataクラスにPixmapを設定する。
                    set image-data.pixmaps = {new {Array-of Pixmap},pixmap}

                    ||画像ファイルに変換する。
                    {image-data.save-to-url {url “./sample.jpeg”} , “image/jpeg”}  
                }
            },
            {CommandButton
                label = “PDF”,
                {on Action do
                    {print-graphic-pdf g,{url “./sample.pdf”}}
                }
            }
        }
    }
}

スクロールバーを太くしたい

【ご質問】
TextArea、DropdownList、ComboBox、RecordGridなど
動的にスクロールバーが表示される部品のスクロールバーの太さをに変更する方法を教えてください。

【回答】
これらの部品には、内蔵するスクロールバーの太さを調節するオプションが公開されておりません。
そのため他の属性のようには簡単に変更ができませんが、サブクラス化することにより可能となります。

サブクラスから部品内部のグラフィック階層を辿り、
対象となるスクロールバーを取得して
thicknessオプションから太さを設定できます。
サンプル

なお、バージョンの変更等によりこのグラフィック階層に変更がありますと、
エラーが発生するなど意図した通りに動作しなくなる可能性がございますのでご注意ください。

 

右クリックメニューのカスタマイズ

◆ご質問◆
右クリックメニューをカスタマイズしたいのですが可能でしょうか?

◆回答◆
Curlには、メニューに関するAPIが用意されており、こちらを利用することでメニューを作成することが可能です。
 Curl開発者ガイド-[グラフィカルユーザインターフェース]-[メニュー]

TextFieldやRecordGridのメニューをカスタマイズしたサンプルを添付します。

サンプルファイル

 

CDEにてCurlのライブラリ(ドキュメント)をインストールする方法

◆ご質問◆
CDEにてCurlのライブラリ(ドキュメント)をインストールする方法を教えてください。

Curl IDEの場合は、CurlIDEにて、
[メニュー]-[ヘルプ]-[ライブラリのインストール]より行っていました。

 

◆回答◆
[Eclipseメニュー]-[Window]-[Preferences]-[Curl]-[インストール済みのライブラリ]より、
[インストールボタン]より、該当のマニフェストファイルを選択してください。

CDE-lib-install.jpg

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Curlドキュメント・ビューワにインストールされます。

 

RecordGridのFocusOutについて

【ご質問】

RecordGridにおいて、FocusOutイベントを拾いたいと考えております。
マウスを使って、Grid外のTextFieldなどに直接フォーカスを移動した場合の制御です。

【回答】

RecordGrid外へのフォーカス移動のタイミングで
セルのフォーカスアウト時の処理をさせることについては、
文字列を表示するセルの場合、cell-specに
StandardStringCellのサブクラスをセットすることで可能です。
StandardStringCellのcreate-editorメソッドをオーバーライドして、
その戻り値となるコントロール(TextField)に
FocusOut時の処理を定義してください。

詳細は添付資料(sample.curl)をご参照ください。
文字列、ドロップダウンリスト、チェックボタンの各セルの背景色が、
フォーカスのIn/Outのタイミングで変化するサンプルです。

http://developers.curlap.com/curl/faq/grid_focus_out_sample.curl

 

create-editorメソッドについては、開発者ガイドの
[StandardBaseEditableStringCell.create-editor]の項をご参照ください。

マウスオーバー時のイベントについて

【ご質問】
ドラッグ&ドロップで、2つのオブジェクト同士を統合させる処理を考えています。
この際、ドラッグ側とドロップ先のオブジェクトの内容を比較して、
(ドロップしてからの判断ではなく)「マウスオーバー中に」ドロップ可否を判断したいです。

【回答】
DragOverクラスのdssフィールドに保存されている
DataTransferSourceSetオブジェクトから
ドラッグ中のオブジェクトを取り出すことができます。

詳細は以下のサンプルをご参照ください。
(ドラッグ中のオブジェクトの属性によって
ドロップが可能かどうかを判断しています。)

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

{let vbox:VBox = {VBox halign = “center”, spacing = 1cm,
                     {HBox spacing = 2cm,
                         {EllipseGraphic
                             width = 10mm, height = 15mm, dragee = {ImageDragee}},
                         {EllipseGraphic
                             width = 20mm, height = 5mm, dragee = {ImageDragee}},
                         {EllipseGraphic
                             width = 20mm, height = 10mm, dragee = {ImageDragee}},
                         {EllipseGraphic
                             width = 15mm, height = 20mm, dragee = {ImageDragee}
                         }
                     },
                     {TextFlowBox   
                         border-width = 2pt,
                         border-color = “black”,
                         margin = 5pt, 
                         height = 5cm,
                         width = 5cm,
                         opaque-to-events? = true,
                         {text font-size = 16pt, 縦に長い図形だけドロップできます},
                        
                         {on e:DragOver do
                             || DataTransferSourceSetを取得
                             {if-non-null dss = e.dss  then
                                 {for i = 0 to dss.for-loop-count – 1 do
                                     || DataTransferSourceを取得
                                     {type-switch {{dss.get i}.get-data}
                                      case obj:EllipseGraphic do
                                         || ドラッグ中のEllipseGraphicオブジェクトにアクセス
                                         {if obj.height > obj.width then
                                             {e.will-accept-drop?
                                                 {proc
                                                     {type:Type,
                                                      x:Distance,
                                                      y:Distance,
                                                      effect:#DragEffect
                                                     }:DragEffect
                                                     {return drag-effect-copy}
                         }}}}}}},
                         {on e:Drop do
                             {e.accept-drop
                                 {proc
                                     {a:any,
                                      x:Distance,
                                      y:Distance,
                                      effect:#DragEffect}:DropResult
                                     {return
                                         {DropResultCopy
                                             action =
                                                 {proc {}:void
                                                     {if a isa EllipseGraphic then
                                                         {if a.height > a.width then
                                                             {popup-message
                                                                 modal? = true,
                                                                 “縦に長いのでdrop可”}
                         }}}}}}}}}
            }
}

{View
    {Frame vbox, width = 8cm, height = 8cm},
    visibility = “normal”,
    {on WindowClose do
        {exit}
    }
}

また、APIリファレンスの
[CURL.GUI.BASE]-[DataTransferSourceSet]
の項をご参照ください。

トレイを利用した印刷

【ご質問】

トレイを指定して印刷することができますか?

 

【回答】

Ver.8では出力するプリンタのトレイを指定することができます。
CurlAppsギャラリーにサンプルデモアプリがありますのでご確認できます。
http://developers.curlap.com/gallery/apps/134
また、Ver.8より印刷関連機能が強化されてますので併せてご確認いただければと思います。

ファイルのダウンロードダイアログについて

【ご質問】

 インターネットエクスプローラーのように、リンクをクリックするとファイルを開くのか、
 保存するのか、キャンセルするのかを表示するダイアログを表示することは可能でしょうか?
 開くを選択すると、WindowsであればOSが拡張子と紐付けているアプリケーションで開かれるといったものです。

【回答】

Curlの標準APIにて、お望みのダイアログを表示させることはできませんが、
HTTPヘッダに”Content-Disposition: attachment; filename=fname.ext”
を含めるとファイルのダウンロードダイアログを開くことが出来ることが判っています。
http://support.microsoft.com/kb/260519/ja

そのため、以下の流れでダイアログを表示させることが可能かと思われます。

① Curl画面にてリンクをクリックする。
② Curlからサーバにリクエスト情報を投げる。
③ サーバから該当ファイルを返却する際に、HTTPヘッダに以下情報を埋め込む。
  “Content-Disposition: attachment; filename=ファイル名”
④ クライアント側にてダイアログが表示される。

 

Dialogの大きさ取得

【ご質問】
Dialogの大きさを取得する方法について教えてください。

【回答】
Dialogを表示させた後、Dialogのwidthおよびheightを取得することで可能です。

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

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

{let size:VBox = {VBox}}
{let d:Dialog = {Dialog
                          width = 5cm,
                          height = 5cm,
                          {CommandButton
                              label = “get-size”,
                              {on Action do
                                  {size.clear}
                                  {size.add “幅  : ”&d.width}
                                  {size.add “高さ : ”&d.height}
                              }
                          }
                      }
}

{VBox
    {CommandButton
        label = “show”,
        {on Action do
            {d.show}
        }
    },
    {Fill height = 0.1cm},
    size
}

 

高さ幅の取得方法

【ご質問】

 Tableクラスにてwidth,heightへ値をセットせず幅高さを指定してないオブジェクト
 の幅と高さの値を取得するにはどうしたらよろしいでしょうか?

【回答】

get-bounds (メソッド)にて取得したGRectのwidthおよびheightを取得することで実現可能です。
詳細はサンプルをご参照ください。

http://developers.curlap.com/curl/faq/get_boundssample.curl

バイナリデータの受信について

【ご質問】

Curl側でバイナリーデータを受け取るための機能は提供されていますでしょうか?
バイナリデータをAcrobatReaderでPDFとして表示させたいです。

バイナリーデータを受け取り、AcrobatReaderを起動して表示するというやり方を教えていただけないでしょうか?

【回答】

バイナリデータの受信は可能です。
httpレスポンスの内容は
byte配列に取得することができます。

http://developers.curlap.com/curl/faq/pdf_bin_sample.curl

ダウンロードしたpdfファイルをローカルに保存して
関連付け実行するサンプルを添付いたしました。

詳細は、開発者ガイドの
[Curl プロセス間のコミュニケーション]
-[ファイルやその他のリソースへのアクセス]
-[ストリーム]-[バイト ストリーム]
をご参照ください。

拡張子に紐付くプログラムの自動実行について(WINDOWS)

【ご質問】
ファイルをダウンロードし、その後自動でダウンロードファイルを実行したいと考えております。

Windowsではアイコンをダブルクリックすると拡張子に関連付けされたアプリケーションが実行されますが、
Curlでも同様の処理が出来ますでしょうか?

【回答】
STARTコマンドをrun-host-shellプロシージャから実行することで
関連付け実行が可能です。
フルパスをSTARTコマンドの引数としてお渡しください。

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

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

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

{let tf:TextField =
    {TextField
        value = “フルパスを入力してください”,
        width = 10cm
    }
}

{let cb:CommandButton =
    {CommandButton
        label=“関連付け実行”,
        {on Action do
            let url-link:Url = {url file:/// & tf.value}
            let file:any = {url-link.resolve error-if-missing? = false}
            {type-switch file
             case file:File do
                ||ファイルとして存在する
                let hostprocessrtn:int =
                    {run-host-shell
                        “START \”\” cmd /c \”” & url-link.local-filename asa String & “\””
                    }
             else
                {popup-message “ファイルが存在しません”}
            }
        }                           
    }
}

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

また、APIリファレンスの
[CURL.RUNTIME.HOST-PROCESS]-[run-host-shell]
の項をご参照ください。

ScrollBoxの「expanded-vscroll-bounds?」について

【ご質問】
ScrollBoxの「expanded-vscroll-bounds?」プロパティ
「スクロール可能な領域を垂直に拡張し、内容がちょうど見えなくなる位置までスク
ロールできるようにします。」
を用いると、スクロールボックスの上と下両方が拡張されますが、
下のみ見えなくなるまで拡張する方法はありますでしょうか。

【回答】
この点についての制御を行うプロパティ等はございませんが、
オープンコントロールを使用すれば可能です。

※オープンコントロールは標準コントロール部品全体を複製しているため、
  ソースのコンパイル等に時間を要し、
  全体の処理速度が遅くなる可能性がありますので、
  使用する際はお気をつけください。

クエリ文字列のあるURLで呼び出すとパーシスタントデータが読み出せない

【ご質問】
アプレット呼び出し時にパラメータを設定するため
http://www.sample.com/sample.curl?query=hoge
のようにクエリ文字列を付加したURLで
アプレットを呼び出すことにしました。

この呼び出される側のアプレットは
プライベートパーシスタントデータを使用しているのですが、
クエリ文字列(?query=hogeなど)のあるURLで呼び出されると、
クエリ文字列のないURLで呼び出した時に保存したデータが
読み出せなくなることがわかりました。
異なるURLとみなして、データファイルを別途に作成するようです。

クエリ文字列のあるURLで呼び出されたときにも
同じデータファイルを読み書きできるようにする方法はないでしょうか?

【回答】
このような場合は、プライベートパーシスタントデータの代わりに
共有パーシスタントデータをご使用ください。
クエリ文字列のあるURLで呼び出された場合でも
共通のパーシスタントデータファイルを使用できます。

詳細は、Curl開発者ガイドの
[外部リソースとの対話]-[クライアント側パーシスタントデータ]-[共有パーシスタントデータ]
の項をご参照ください。

エンターキーでタブ移動

【ご質問】
エンターキーでタブ移動することは可能でしょうか?

【回答】
可能です。

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

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

{define-proc {prepare-traverse-with-enter
                      atc:ActiveTraversalContainer,
                      target-controls:{Set-of Type},
                      ignore-exception? = true
                  }:void
    {let gui-m:GuiManager = {get-gui-manager}}
    {let fm:#FocusManager = {atc.get-focus-manager}}
    {gui-m.add-event-handler
        {on ke:RawKeyRelease at gui-m do
            {if ke.keycode == Keycode.enter and fm.keyboard-focus-target isa ControlUI then
                def target = fm.keyboard-focus-target asa ControlUI
                def ctl = target.control
                {if {target-controls.member? {type-of ctl}}then
                    {if ke.shift? then
                        {d.traverse forward?=false}
                     else
                        {d.traverse}
                    }
                }
            }
        }
    }
    {return}
}

{def enter-to-move-targets:{Set-of Type} =
    {{Set-of Type}
        TextField
        ,PasswordField
        ||,TextArea || In TextArea, enter key will be kept as a carriage return key.
        ,{type-of {SpinControl}.focus-object} || for DateField and SpinControl
        ,CommandButton
        ,CalendarControl
    }
}

{let d:Dialog
    ={Dialog
         {VBox
             {TextField prompt=“enter to move next”},
             {PasswordField prompt=“enter to move next”},
             {TextDisplay value=“test”},
             {DateField},
             {SpinControl},
             {CalendarControl},
             {CommandButton},
             {TextArea}
         }
     }
}

{value d}

{prepare-traverse-with-enter
    d,
    enter-to-move-targets
}

 

pcurlをget-backtraceしたときにソースコードの行番号を知りたい

◆ご質問◆
pcurl化されたものをget-backtraceしたときに
ソースコードの行数を知りたい。(何もしないと行数が??になります。)
例)
#0   get-backtrace (0x100467f5-58) at curl://source-9/Core/ConsoleDebugger/stack.curl:??
#1   Xxxxx.xxx-xxxx-xx (0x06159883-79) at file:///c:/Documents and
Settings/xxxx/デスクトップ/xxxx/load.scurl:??
#2   Xxxxx.xxx-xxxx-xx (0x0615b82f-1999) at file:///c:/Documents and
Settings/xxxx/デスクトップ/xxxx/load.scurl:??
#3   Xxxxx.handle-message (0x0615bb53-183) at file:///c:/Documents and
Settings/xxxx/デスクトップ/xxxx/load.scurl:??
…….

◆回答◆
まず、IDEで「コンポーネントターゲット設定」で「デバッグインフォメーションを含める」の
チェックボックスを選択し、デプロイします。

Curlコントロールパネルの「デバッガ」タグでそのURLを登録します。(例:http://localhost/)

そして実行すると以下のようにソースコードの行数が表示されます。
例)
http://localhost/start.curl

#0   get-backtrace (0x100467f5-58) at curl://source-9/Core/ConsoleDebugger/stack.curl:??
#1   Xxxxx.xxx-xxxx-xx (0x06159883-79) at file:///c:/Documents and
Settings/xxxx/デスクトップ/xxxx/load.scurl:1301[4]
#2   Xxxxx.xxx-xxxx-xx (0x0615b82f-1999) at file:///c:/Documents and
Settings/xxxx/デスクトップ/xxxx/load.scurl:900[8]
#3   Xxxxx.xxx-xxxx-xx (0x0615bb53-183) at file:///c:/Documents and
Settings/xxxx/デスクトップ/xxxx/load.scurl:847[8]
…….

2重起動制御

【ご質問】
独立型アプレットが起動している状態で、同じアプレットを起動しようとした場合に、
そのアプレットが起動済みであるかの判定を行うことは出来ますか。

【回答】
独立型アプレットに以下のようなコードを追加することで、実現可能です。

{let invoke-count:int = 0}

{do
  set {get-the-applet}.launch-handler =
          {proc {url:Url}:void
              {inc invoke-count}
              {if invoke-count > 1 then
                  {popup-message “すでに起動しています。”}
              }
          }
}

プロセスのインスタンスは1つであるため、グローバル変数の初期化は1回だけ行われます。
しかし、アプレットのlaunch-handlerは起動ごとに呼ばれるため、
この中でグローバル変数のチェックを行うことで、起動済みかどうかの判断をしています。

コンテキストメニューのカスタマイズについて

【ご質問】
カスタマイズされたコンテキストメニューに
標準で右クリック時に表示されるコンテキストメニューの「印刷」と同等処理を行う
メニューを作成することは可能でしょうか?

また、特定コントロールのみを印刷するといった制御は可能でしょうか?

【回答】
print-graphicプロシージャを使用することで実現可能です。

★同等処理を行うには
print-graphicプロシージャに印刷対象として、
画面に表示されている全てのコンテンツを含むコンテナ(FrameやVBoxなど) を指定し、
「hstretch? = true」及び「ne-title = {get-base-url}」の2つのプロパティの設定を行います。
これにより、デフォルトの「印刷…」とほぼ同等の印刷を行うことができます。

{MenuAction
   label = “印刷…”,
    {on Action do
        {print-graphic
            contents,  ||画面に表示されている全コンテンツを含むFrameなど

          ||デフォルトの「印刷…」ボタンと同じスタイルで印刷する為に
          ||以下のプロパティを変更します。

             hstretch? = true,
             ne-title = {get-base-url}
         }
    }
}

★印刷対象の制御をするには
print-graphicプロシージャの印刷対象として、印刷したいコントロールを指定することによって、
特定のコントロールのみ印刷することが可能となります。

また、context-popupプロシージャの設定をする際に、
menu-pane-procのキーワード引数に対して、下記のように記述することにより、
コンテキストメニューを呼び出したコントロールの印刷を行うという設定もできます。 

menu-pane-proc =
{proc {vi:Visual}:MenuPane
    {return
        {MenuPane
            {MenuAction
                label = vi.name & “印刷”,
                {on Action do
                    {print-graphic
                    vi,
                    ne-title = {get-base-url}
                    }
                            }
                     }
              }
    }
}

この設定は、例えば、画面に表示されている全てのコントロールに対して、
そのコントロールのみの印刷を行うというコンテキストメニューを追加する場合などに使用できます。
(例えば、全てのコントロールを含むVBoxのchild-arrayを呼び、for文を使い、
その1つ1つのchildに対して、add-event-handlerで上記設定を行った
context-popupプロシージャを追加するという方法が考えられます。)