17Th
Developer Camp

【B5】 Delphiチュートリアル セッション「知って得する！
現役ヘルプデスクが答える
Delphiテクニカルエッセンス 5.0 」
株式会社ミガロ.
吉原 泰介

1

17Th
Developer Camp

1

はじめに

2

アジェンダ• ミガロ.についてよくある問合せQ&A
よくある問合せQ&A■Q1. VCL for the WEBでWebサービス連携■Q2. トレイアイコンの利用■Q3. OpenOfficeの利用
補足資料
補足資料
■XMLデータバインディングの使い方■ Delphi2009/2010 VCL for the WEB留意点

3

ミガロ.について
株式会社ミガロ. －A 100% IBM i Company－
会社情報
会社情報
所在地：本社 大阪市浪速区湊町2-1-57
所在地：本社 大阪市浪速区湊町2-1-57
難波サンケイビル13F
難波サンケイビル13F
東京事業所 東京都港区麻布台1-4-3
東京事業所 東京都港区麻布台1-4-3
エグゼクティブタワー麻布台11F
エグゼクティブタワー麻布台11F
事業内容
事業内容
IBM i 向けのソフトウェア・ツール販売および技術サポート
IBM i 向けのソフトウェア・ツール販売および技術サポート【開発ツール】【バックアップ/災害対策ソフト】【開発ツール】【バックアップ/災害対策ソフト】
・Delphi/400
・*noMAX・Delphi/400
・*noMAX・JC/400
・PlateSpin Forge
・JC/400
・PlateSpin Forge【アプリケーション･ライフサイクル・マネージメント】【アプリケーション･ライフサイクル・マネージメント】
・MKS
・MKS

• Delphi/400• DelphiをIBM iに完全対応させたミドルウェア• 国内約650社、全世界約5,000社の導入実績

4

17Th
Developer Camp

よくある問合せQ&A

5

Q1 VCL for the WEBでWebサービス連携【質問】
VCL
VCLforforthetheWEB
WEB(IntraWeb)で郵便番号検索サービスの(IntraWeb)で郵便番号検索サービスの機能を組み込むことはできますか？
機能を組み込むことはできますか？
【回答】
Webサービスを利用することで郵便番号検索の機能をWebサービスを利用することで郵便番号検索の機能をそのまま利用することができます。
そのまま利用することができます。
Webサービスの提供内容によって、Delphiからの利用のWebサービスの提供内容によって、Delphiからの利用の方法も異なります。
方法も異なります。
XMLで結果を受け取れる形であれば、XMLデータ
XMLで結果を受け取れる形であれば、XMLデータ
バインディングの機能で容易に実装することができます。
バインディングの機能で容易に実装することができます。
6

Q1 VCL for the WEBでWebサービス連携
Webサービス連携実装例（郵便番号検索）
Webサービス連携実装例（郵便番号検索）①郵便番号を入力②Webサービスより前方一致の住所リストを取得
7

Q1 VCL for the WEBでWebサービス連携
今回利用する郵便番号検索Webサービス
グルーブテクノロジー社提供Webサービス
http://groovetechnology.co.jp/webservice/zipsearch/index.html
仕様やインターフェースの詳細が公開されています。

• 3桁以上の郵便番号をHTTPを使って渡すとXMLの形で前方一致対象のデータを返却してくれます。
サービス利用を明示する必要があるなど

Webサービスを利用場合、提供元利用規約をよく確認してください。
8

Q1 VCL for the WEBでWebサービス連携
郵便番号検索サービス連携の仕組み•

郵便番号(TIWEdit)が入力されてExitする際にOnAysncExitイベントでWebサービスを利用して、結果をTIWListBoxにセットします。
556の郵便番号
情報をリクエスト

TIdHTTPコンポーネントでリクエスト

結果
XML

結果はTXMLDocumentで受け取り
XMLデータバインディングで生成するクラスで処理する

Webサービス（REST）

9

Q1 VCL for the WEBでWebサービス連携
XMLデータバインディングで取得XMLのクラスを自動生成•

XMLデータバインディングで生成したユニットを、利用するプログラムで[ファイル|ユニットを使う]から指定するか、usesに追記します。

使い方の詳細は補足資料を参照ください。
10

Q1 VCL for the WEBでWebサービス連携
郵便番号検索サービスより受け取れるXMLデータ•

この郵便番号検索サービスでは次のような形でXMLが返却されます。
データは生成されたソースのクラスで簡単に処理できます。
フィールド
address
officezipcodeprefecture
city
town
office_namestreetprefecture_yomi
city_yomi
town_yomi
office_name_yomi

説明
住所の郵便番号の情報です。zipcode, prefecture, city, town, prefecture_yomi, city_yomi,
town_yomiが設定されます。
事業所の個別郵便番号の情報です。zipcode, prefecture, city, town, street, office_name,office_name_yomiが設定されます。
郵便番号が、「9999999」の形式で設定されます。
都道府県名が設定されます。
市区町村名が設定されます。
町域名が設定されます。
大口事業所等名が設定されます。
大口事業所等名の小字名、丁目、番地等が設定されます。
都道府県名のよみ（カタカナ）が設定されます。
市区町村名のよみ（カタカナ）が設定されます。
町域名のよみ（カタカナ）が設定されます。
大口事業所等名のよみ（カタカナ）が設定されます。

11

Q1 VCL for the WEBでWebサービス連携
郵便番号検索サービスのリクエストURL• 今回利用する郵便番号検索サービス はURLにパラメータを付与
してアクセスするとXMLの形で結果を得ることができます。
556の郵便番号を検索する場合は次のようなURLになります。
共通アドレス部分

http://groovetechnology.co.jp/ZipSearchService/v1/zipsearch? format=xml&ie=UTF8&oe=UTF8&zipcode=556?以降がパラメータ部分
Format:返却形式
Ie:インプット文字コード
oe:アウトプット文字コード

zipcodeというパラメータで郵便番号を指定。ここにIWEditの入力値をセットする。
12

Q1 VCL for the WEBでWebサービス連携
住所データ取得（ソース）
procedure TfrmWebSample2Input.edtMCYUBNAsyncExit(Sender: TObject;
EventParams: TStringList);var
i: Integer;
URI: String;
RootNode: IXMLGroovewebserviceType; //XMLデータバインディングで取り込んだクラス
begin// リクエストするURLをセット
URI := 'http://groovetechnology.co.jp/ZipSearchService/v1/zipsearch?'+ 'format=xml&ie=UTF-8&oe=UTF-8&zipcode=' + iedtMCYUBN.Text;// レスポンスとして戻されたXMLを処理する
リクエストURL編集
XMLDocument1.XML.Text := IdHTTP1.Get(URI);
RootNode := Getgroovewebservice(XMLDocument1);
lstMCYUBN.Items.Clear; // 住所リストをクリア
ソース内コンポーネント名// 受け取ったXMLデータから住所リストを作成■郵便番号入力
for i := 0 to RootNode.Address.Count - 1 do
iedtMCYUBN：TIWEdit
lstMCYUBN.Items.Add(Format('%d : %s%s%s',■住所リスト表示[RootNode.Address.Items[i].Zipcode,//郵便番号
lstMCYUBN：TIWListbox
RootNode.Address.Items[i].Prefecture, //都道府県名■処理用
RootNode.Address.Items[i].City,//市町村名XMLDocument1：TXMLDocument
RootNode.Address.Items[i].Town]));//町域名
IdHTTP1：TIdHTTP// 住所リストが1件でもあれば先頭データを選択状態に
if lstMCYUBN.Items.Count > 0 then13
lstMCYUBN.ItemIndex := 0;end;

Q1 VCL for the WEBでWebサービス連携
カスタマイズ例①ダブルクリックすると画面項目にセット②住所からさらにWebサービスを利用して地図情報を表示など

14

Q1 VCL for the WEBでWebサービス連携
Client/Server型のアプリケーションで利用•

Client/Server型のアプリケーションでもデータバインディングで取り込んだ
ソースとTIdHttp、TXmlDocumentで実装の方法はほぼ同じです。

Webサービスを利用場合、提供元利用規約をよく確認してください。
15

Q1 VCL for the WEBでWebサービス連携
Webサービス連携実装例（グラフ表示）
Webサービス連携実装例（グラフ表示）

16

Q1 VCL for the WEBでWebサービス連携
今回利用するグラフ生成Webサービス
GoogleのWebサービスの1つGoogle Chart API を利用する
http://code.google.com/intl/ja/apis/chart/index.html
インターフェースパラメータ仕様やサンプルなどが公開されています。

Webサービスを利用場合、提供元利用規約をよく確認してください。

17

Q1 VCL for the WEBでWebサービス連携
Google Chart API でのグラフ生成• 今回グラフに使用するGoogle Chart API はURLにパラメータを付与してアクセスすると簡単に結果を得ることができます。
次のようなURLでアクセスすると
http://chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World

パラメータ通りのグラフが作成できます。

18

Q1 VCL for the WEBでWebサービス連携
Google Chart APIのリクエストURL• リクエストURLの構造例＜パラメータと値＞
・共通アドレス：http://chart.apis.google.com/chart?
・サイズ：chs=500x200
・割合：chd=t:60,40
・グラフの種類：cht=p3
・ラベル：chl=Hello|World
呼び出し構造は共通アドレス?(パラメータ1)&(パラメータn)･･･
呼び出しアドレスに続いてパラメータを付け足していく
19

Q1 VCL for the WEBでWebサービス連携
Google Chart APIのリクエストURL• パラメータでグラフの種類を変える。
cht(グラフの種類）が違うと
http://chart.apis.google.com/chart?chs=300x300&chd=t:30,20,60,80&cht=lc

http://chart.apis.google.com/chart?chs=300x300&chd=t:30,20,60,80&cht=bvs

20

Q1 VCL for the WEBでWebサービス連携
Google Chart APIサービス連携の仕組み• Delphi側でグラフに表示したいデータやグラフの種類に基づいたパラメータでURLを作成してTIWURLWindowコンポーネントで表示する。

データでURLを編集して表示

データ表示：TIWDBGrid
データ移動：TIWDBNavigator
21

Q1 VCL for the WEBでWebサービス連携
BarChart（棒グラフ）のパラメータ• 今回使用するBarChart（棒グラフ）のパラメータは次の通り■タイトル(エンコード文字-UTF8)
chtt=%E7%A8%9A%E3%80%80%E5%86%85■グラフの種類（棒グラフ） ■Xラベル
cht=bvg
chxl=0:|2001|2002|2003|・・・・
■Y目盛
■サイズ
chs=300x300
chxr=1,0,2000■最小/最大値■色chco=76A4FB
chds=0,2000■ラベル表示■データ
chxt=x,y
chd=t:1100,1200,1300,・・・・※他にも使用できるパラメータは多数あります。

22

Q1 VCL for the WEBでWebサービス連携
グラフURLの作成手続き実装（ソース）//グラフURL作成手続き
ソース内コンポーネント名
procedure TSampleChartfrm.CrtChart;■TIWGrid表示データセット
var
ClientDataSet1：TClientDataSet//パラメータ編集用■フィールドsURL,sChxl,sChxt,sChs,sChds,sChxr,sCht,sChco,sChd,sChtt: String; 地区：地区名
begin
200X年：年度毎降水量//共通URL■グラフ表示sURL := 'http://chart.apis.google.com/chart';
IWURLWindow1 ：TIWURLWindow//タイトルsChtt := '?chtt=' + HttpEncode(UtF8Encode(ClientDataSet1.FieldByName('地区').AsString));//グラフ種類
タイトルはデータ（ここでは地区というフィールド）sCht := '&cht=bvg';//サイズ
からセットする。
sChs := '&chs=300x300';
ChartのタイトルはUTF8なので//色
UTF8EncodeしてからHttpEncodeで
sChco := '&chco=76A4FB';“旭 川”なら %E7%A8%9A%E3%80%80%E5%86%85//表示ラベル
sChxt := '&chxt=x,y';のようにセットされる。
//xラベルsChxl := '&chxl=0:|2001|2002|2003|2004|2005|2006|2007|2008';//y目盛
23
sChxr := '&chxr=1,0,2000';

Q1 VCL for the WEBでWebサービス連携
グラフURLの作成手続き実装（ソース）
データはデータセットよりカンマ編集で結合してセットする。
（ここでは200X年という8フィールド固定）
フィールドではなく、レコードなどで数が可変ならラベルとあわせてループロジックで編集する。

//データ域sChds := '&chds=0,2000';//データ
sChd := '&chd=t:'+ ClientDataSet1.FieldByName('2001年').AsString + ','+ ClientDataSet1.FieldByName('2002年').AsString + ','+ ClientDataSet1.FieldByName('2003年').AsString + ','+ ClientDataSet1.FieldByName('2004年').AsString + ','+ ClientDataSet1.FieldByName('2005年').AsString + ','+ ClientDataSet1.FieldByName('2006年').AsString + ','+ ClientDataSet1.FieldByName('2007年').AsString + ','+ ClientDataSet1.FieldByName('2008年').AsString;//URLを結合して設定
IWURLWindow1.URI := sURL + sChtt + sCht + sChs + sChco + sChxt + sChxl + sChxr + sChds + sChd;
end;

24

Q1 VCL for the WEBでWebサービス連携
初期処理、データ移動時に手続き呼出（ソース）//初期処理procedure TSampleChartfrm.IWAppFormCreate(Sender: TObject);
Begin//データOpen
ClientDataSet1.Open;//グラフ作成
CrtChart;
end;//データセットのAfterScrollイベントでデータ移動時にグラフ更新
procedure TSampleChartfrm.ClientDataSet1AfterScroll(DataSet: TDataSet);
Begin//グラフ作成
CrtChart;end;

25

Q1 VCL for the WEBでWebサービス連携
Client/Server型のアプリケーションで利用•

Client/Server型のアプリケーションでもTIWURLWindowの代わりに
TWebBrowserコンポーネントを経由して表示すれば使うこともできます。

Webサービスを利用場合、提供元利用規約をよく確認してください。
26

Q2 トレイアイコンの利用【質問】
Windowsのトレイ通知やトレイアイコンへの常駐といったWindowsのトレイ通知やトレイアイコンへの常駐といったアプリケーション操作はできますか？
アプリケーション操作はできますか？
【回答】
DelphiではVersion2006よりTTrayIconというDelphiではVersion2006よりTTrayIconというトレイ操作専用のコンポーネントが提供されています。
トレイ操作専用のコンポーネントが提供されています。
これを利用するとWindowsのトレイ通知やトレイへのこれを利用するとWindowsのトレイ通知やトレイへの常駐といったアプリケーション動作が可能です。
常駐といったアプリケーション動作が可能です。
27

Q2 トレイアイコンの利用
トレイアイコンとはデスクトップの右下のタスクトレイに格納された常駐している
アプリケーションのアイコンです。
以下WindowsXPでのトレイアイコンの画面例
アプリケーションを終了させずに常駐させる使い方
ウィルス対策ソフトなどは
タスクトレイに常駐必要なメッセージを通知したり、時間のかかるプログラムをバックグラウンドで処理する使い方

28

Q2 トレイアイコンの利用
×ボタンでアプリケーションを終了させずに常駐させる使い方例
画面終了

29

Q2 トレイアイコンの利用
フォームのCloseQueryイベントでアプリケーション終了させずに常駐させる（ソース）
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin//閉じるボタン以外でCloseされる場合はトレイアイコンへ
ソース内コンポーネント名
if ActiveControl <> btnClose then
TrayIcon1 ： TTrayIcon
begin
CanClose := False;//画面を閉じない
Self.Visible:= False;//画面非表示
TrayIcon1.Visible := True;//トレイアイコン表示
TrayIcon1.BalloonHint := 'タスクトレイに常駐しています'; //メッセージ設定
TrayIcon1.ShowBalloonHint;//メッセージ表示
end;
end;

トレイアイコンをクリックされたら元の画面を表示（ソース）
procedure TForm1.TrayIcon1Click(Sender: TObject);begin
Self.Visible:= True;//画面表示TrayIcon1.Visible := False;//トレイアイコン非表示
end;

サンプルコードでは
TrayIconを直接操作していますが、一連の処理を関数化しておけば便利です。 30

Q2 トレイアイコンの利用時間のかかる処理をバックグラウンド化する使い方例

時間がかかる処理は
待ち受け画面も邪魔になるのでトレイへ常駐

31

Q2 トレイアイコンの利用時間のかかる処理でトレイアイコンに常駐する（ソース）
procedure TForm1.Button1Click(Sender: TObject);
Begin//処理開始Self.Visible:= False;//画面非表示
TrayIcon1.Visible := True;//トレイアイコン表示
TrayIcon1.BalloonHint := '承認処理中です。しばらくお待ちください。'; //メッセージ設定
TrayIcon1.ShowBalloonHint;//メッセージ表示//いろいろ処理//処理終了
TrayIcon1.BalloonHint := '処理が完了しました。';
TrayIcon1.ShowBalloonHint;//メッセージ設定//メッセージ表示

end;

32

Q2 トレイアイコンの利用常駐監視しながらメッセージ通知する使い方例①トレイ常駐時に
TTimerの監視を開始※トレイ常駐終了時にはTTimerの監視を終了②タイマーコンポーネントで定期的に通知対象のデータを監視③対象データがあればメッセージ通知→他のユーザーからの申請を通知できる33

Q2 トレイアイコンの利用
フォームのCloseQueryイベントでアプリケーション終了させずに常駐させる（ソース追記）
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin//閉じるボタン以外でCloseされる場合はトレイアイコンへ
ソース内コンポーネント名
if ActiveControl <> btnClose thenTTimer1 ： TTimer
begin
CanClose := False;//画面を閉じない
Self.Visible:= False;//画面非表示
TrayIcon1.Visible := True;//トレイアイコン表示
TrayIcon1.BalloonHint := 'タスクトレイに常駐しています'; //メッセージ設定
TrayIcon1.ShowBalloonHint;//メッセージ表示Timer1.Enabled:= True;//タイマー監視開始
タイマー制御end;
end;

トレイアイコンをクリックされたら元の画面を表示（ソース追記）
procedure TForm1.TrayIcon1Click(Sender: TObject);begin
Self.Visible:= True;//画面表示TrayIcon1.Visible := False;//トレイアイコン非表示
Timer1.Enabled:= False;//タイマー監視終了
end;

タイマー制御34

Q2 トレイアイコンの利用
TTimerで通知対象データの監視（ソース）
procedure TForm1.Timer1Timer(Sender: TObject);var
iCount : Integer;
begin//SELECT Count(*) 等のSQLで対象データを取得
SQLQuery1.Open;iCount := SQLQuery1.Fields[0].AsInteger;
SQLQuery1.Close;

負荷やメッセージが煩わしくならない程度の間隔で監視する※監視の間隔はTTimerのInterval
プロパティで設定
ソース内コンポーネント名■監視対象カウント抽出用//対象データがあれば通知メッセージを表示
SQLQuery1 ： TSQLQuery
if iCount > 0 thenbegin
TrayIcon1.BalloonHint := '未承認のデータがあります'; //メッセージ設定
TrayIcon1.ShowBalloonHint;//メッセージ表示
end;
end;

35

Q3 OpenOfficeの利用【質問】
DelphiからOpenOfficeをExcelのように利用することはDelphiからOpenOfficeをExcelのように利用することはできますか？
できますか？
【回答】
OpenOfficeのCalcもOLEで操作することができるので、OpenOfficeのCalcもOLEで操作することができるので、Excelと同様にセル編集やファイル出力といった動作を実
Excelと同様にセル編集やファイル出力といった動作を実装することができます。
装することができます。
またExcelにはないPDF出力などの便利な機能も利用す
またExcelにはないPDF出力などの便利な機能も利用することができます。
ることができます。
ただしxls形式ファイルを読み込み/出力も可能ですが、
ただしxls形式ファイルを読み込み/出力も可能ですが、Calcの機能上、xlsx形式での出力は行えません。
Calcの機能上、xlsx形式での出力は行えません。
36

Q3 OpenOfficeの利用
OpenOffice(正式名称： OpenOffice.org )とはオープンソースのオフィスソフトの一つ。
Microsoft社の「Microsoft Office」と高い互換性があり、LinuxやWindowsなど様々なOSで動作する。
オープンソースソフトのため、誰でも自由に無償で利用することができ、また、興味があれば開発に参加することもできる。
(IT用語辞典引用)
ja: OpenOffice.org 日本語プロジェクト
http://ja.openoffice.org/

37

Q3 OpenOfficeの利用
OpenOfficeで使用できる主な機能
Writer

ワープロソフトMath

数式作成ソフトCalc

表計算ソフトDraw

図形描画ソフト

Impress プレゼンテーションソフト

Base

データベースソフト

今回は表計算のCalcを利用
見た目も操作もほぼMicrosoftのExcelと同じです。
ファイル拡張子は.odsです。xlsやxlsxも読み込めます。
無償で使うことができますが、もちろんオープンソース
なので正式な製品サポートがあるわけではありません。

38

Q3 OpenOfficeの利用以降のDelphiからのCalc操作のサンプルはOpenOffice.org 3.2.1をインストールした環境での動作です。

39

Q3 OpenOfficeの利用
今回のサンプルでは処理をボタンで分割しているのでサービス、ファイル関係の変数はグローバルで定義します。
Calc操作を行うための共通変数・関数（ソース）
privatevOpenOffice : Variant; //サービスマネージャ
vStarDesktop: Variant; //サービス
vDocument: Variant; //ドキュメント
vSheet: Variant; //シート
function dummyArray: Variant; //空プロパティ配列設定用

・・・//空のプロパティ配列を返却
function TForm1.dummyArray: Variant;begin
Result:= VarArrayCreate([0, -1], varVariant);
end;

40

Q3 OpenOfficeの利用
CalcのAPIでのPropertyValue•

Calcの操作上で使用するAPIのパラメータにはPropertyValueという構造体がよく使われます。
このパラメータは、ドキュメントのオープンと作成に対するさまざまなオプシ
ョンを OpenOffice.org に提供します。

PropertyValue 構造体には、個々のオプションごとにオプション名(Name)と設定値(Value)をセットで格納します。
ファイル保存のAPIを利用する例//パラメータ用プロパティ配列生成
vaProperties := VarArrayCreate([0, 0], varVariant);//プロパティ用オプション生成
vProperty:= vOpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');//プロパティ用オプション値設定
vProperty.Name := 'FilterName';vProperty.Value := 'MS Excel 97';
PropertyValueを作成//オプション内容をプロパティ配列に設定してAPIへ渡す
vaProperties[0] := vProperty;//ファイルを保存
vDocument.StoreToURL('file:///' + sFileName, vaProperties);41

Q3 OpenOfficeの利用
CalcのAPIでのPropertyValue（続き）•

ただPropertyValue構造体がパラメータの場合でも、オプションを特に設定する必要がないのであれば毎回Var配列を定義するのも面倒なので、先に実装した
dummyArrayで代用します。
ファイル保存のAPIを利用する例//ファイルを保存
vDocument.StoreToURL('file:///' + sFileName, dummyArray);

オプション設定が必要ない場合、
dummyArrayで代用する

42

Q3 OpenOfficeの利用
Calcを起動する（ソース）
procedure TForm1.btnCalcStartClick(Sender: TObject);
begin//サービスマネージャ生成
vOpenOffice := CreateOleObject('com.sun.star.ServiceManager');//サービス生成
新規ドキュメント
vStarDesktop := vOpenOffice.createInstance('com.sun.star.frame.Desktop'); は//新規ドキュメントを生成する場合‘private:factory/
vDocument:= vStarDesktop.loadComponentFromURL('private:factory/scalc'
scalc’を指定, '_blank', 0, dummyArray);_blank://既存ドキュメントを読み込む場合
すでにファイル// vDocument := StarDesktop.loadComponentFromURL('file:///C:/Temp/Test.ods' が開かれていて//, '_blank'
も新しいウイン//, 0
ドウを使って指//, dummyArray);
定のファイルを//アクティブなSheetを設定(1番目のSheet)
開く
vSheet:= vDocument.Sheets.getByIndex(0);既存ドキュメントを//Sheet名変更
開く場合はこちら
vSheet.Name := '第17回デベロッパーキャンプ';end;
43

Q3 OpenOfficeの利用
Calcを終了する（ソース）
procedure TForm1.btnCalcEndClick(Sender: TObject);
begin//サービス終了
vStarDesktop.terminate;//サービス破棄vStarDesktop := unassigned;//サービスマネージャ破棄
vOpenOffice:= unassigned;end;

Calcでセル値を編集する（ソース）
procedure TForm1.btnCalcCellSetClick(Sender: TObject);begin//セルに値を代入
vSheet.getCellRangeByName('C2').String := 'B5 Delphiセッション';
end;

セルを指定してアクセス

44

Q3 OpenOfficeの利用
Calcでフォントを変更する（ソース）
procedure TForm1.btnCalcFontClick(Sender: TObject);begin//半角英数記号フォント・サイズ設定
vSheet.getCellRangeByName('C2').CharFontName:= 'ＭＳ 明朝';
vSheet.getCellRangeByName('C2').CharHeight:= 24;//日本語文字（マルチバイト文字や半角カナ文字）フォント・サイズ設定
vSheet.getCellRangeByName('C2').CharFontNameAsian := 'ＭＳ ゴシック';
vSheet.getCellRangeByName('C2').CharHeightAsian:= 16;
end;

Calcで罫線を引く（ソース）

CharXXXでは日本語文
字には適用されないのでCharXXXAsianで指定

procedure TForm1.btnCalcBorderClick(Sender: TObject);var
vBorder : Variant; //罫線処理用
begin//罫線のオブジェクトを生成
vBorder:= vOpenOffice.Bridge_GetStruct('com.sun.star.table.BorderLine');//罫線の色の設定
vBorder.Color:= RGB(200,0,0); //青//罫線の太さを設定
vBorder.OuterLineWidth:= 100;//罫線をセット(C2からE2の下線)
vSheet.getCellRangeByName('C2:E2').BottomBorder:= vBorder;
end;

45

Q3 OpenOfficeの利用
Calcでファイルを保存する（ソース）
procedure TForm1.btnCalcSaveClick(Sender: TObject);var
sFileName: String;//保存ファイル名編集用
保存パスはURL形式で
begin
設定する。
//保存ダイアログ実行
×…¥…¥Test.ods
if SaveDialog1.Execute then○…/…/ Test.ods
begin//ダイアログの保存パスを/形式に置換
sFileName := StringReplace(SaveDialog1.FileName, '¥', '/', [rfReplaceAll]);//ファイルを保存
vDocument.StoreAsURL('file:///' + sFileName, dummyArray);
保存APIは//変更保存等ダイアログを表示しない
StoreAsURL
vDocument.Modified := False;
end;
end;

Calcを終了する際に変更保存ダイアログが表示させない設定

StoreToURLでも保存できますが、
基本エクスポートAPI46

Q3 OpenOfficeの利用
Calcでxls保存する（ソース）
procedure TForm1.btnCalcXlsClick(Sender: TObject);var
vaProperties : variant; //保存パラメータ用<配列>
vProperty: variant; //保存オプション用<配列値>
sFileName: String;//保存ファイル名編集用
begin//保存ダイアログ実行
if SaveDialog1.Execute then
begin//ダイアログの保存パスを/形式に置換
sFileName := StringReplace(SaveDialog1.FileName, '¥', '/', [rfReplaceAll]);//パラメータ用プロパティ配列生成
vaProperties := VarArrayCreate([0, 0], varVariant);//プロパティ用オプション生成
vProperty:= vOpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');//プロパティ用オプション値設定
基本はodsと同じ
vProperty.Name := 'FilterName';vProperty.Value := 'MS Excel 97';ですが、xlsで保存する//オプション内容をプロパティ配列に設定
場合は別形式なので
vaProperties[0] := vProperty;
フィルタープロパティで//ファイルを保存
vDocument.StoreToURL('file:///' + sFileName, vaProperties); 指定する必要があります。
Xlsx形式保存はCalcでは不可//変更保存等ダイアログを表示しない
vDocument.Modified := False;47
end;
保存APIはStoreToURLでend;

Q3 OpenOfficeの利用
CalcでPDF保存する（ソース）
procedure TForm1.btnCalcPDFClick(Sender: TObject);var
vaProperties : variant; //保存パラメータ用<配列>
vProperty: variant; //保存オプション用<配列値>
sFileName: String;//保存ファイル名編集用
begin//保存ダイアログ実行
if SaveDialog1.Execute then
begin//ダイアログの保存パスを/形式に置換
sFileName := StringReplace(SaveDialog1.FileName, '¥', '/', [rfReplaceAll]);//パラメータ用プロパティ配列生成
vaProperties := VarArrayCreate([0, 0], varVariant);//プロパティ用オプション生成
vProperty:= vOpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');//プロパティ用オプション値設定
基本はodsと同じ
vProperty.Name := 'FilterName';vProperty.Value := 'calc_pdf_Export';
ですが、pdfで保存する//オプション内容をプロパティ配列に設定
場合は別形式なので
vaProperties[0] := vProperty;
フィルタープロパティで//ファイルを保存指定する必要があります
vDocument.StoreToURL('file:///' + sFileName, vaProperties);
48
end;
保存APIは必ずStoreToURLでend;

Q3 OpenOfficeの利用
Calcで印刷する（ソース）
procedure TForm1.btnCalcPrintClick(Sender: TObject);var
vaProperties : Variant; //プリンタ指定パラメータ用<配列>
vProperty: Variant; //プリンタ指定オプション用<配列値>
begin//パラメータ用プロパティ配列生成
vaProperties :=VarArrayCreate([0, 0], varVariant);//プロパティ用オプション生成
vProperty := vOpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');//プロパティ用オプション値設定
vProperty.Name := 'Name';vProperty.Value := ‘FinePrint’;//設定したいプリンタ名//オプション内容をプロパティ配列に設定
vaProperties[0] := vProperty;//プリンター指定
vDocument.setPrinter(vaProperties);//印刷
vDocument.print(dummyArray);
end;

プリンタを
指定

ディフォルトプリンタへの印刷
であればこれだけ49

Q3 OpenOfficeの利用
Calc上での操作のコーディングが分からないときは・・•

Excelと同じように操作をマクロで記録できるので、マクロの中身を見てコーディングの参考にできます。
②やりたい操作④
記録終了①マクロの記録開始③保存50

Q3 OpenOfficeの利用
Calc上での操作のコーディングが分からないときは・・⑤マクロの管理から保存したマクロを開く⑥操作のマクロがコーディングの参考にできます51

17Th
Developer Camp

補足資料
2

XMLデータバインディングの使い方

52

XMLデータバインディングの使い方
XMLデータバインディングの利用① （以前もやった覚えが・・• プロジェクトを開いたまま[ファイル|新規作成|その他]から
XMLカテゴリでXMLデータバインディングを選択

53

XMLデータバインディングの使い方
XMLデータバインディングの利用②• Webサービスで返却されるXMLサンプルを保存しておき、XMLを指定。
（スキーマファイルがある場合はスキーマファイルで可能）

54

XMLデータバインディングの使い方
XMLデータバインディングの利用③• 解析結果に従いコードがプレビューされるので、ウィザードを進めて完了するとソースコードが生成されます。

55

XMLデータバインディングの使い方
XMLデータバインディングの利用④•

Delphiのソースが生成されたら、利用したいプログラムで[ファイル|ユニットを使う]から指定するか、usesに追記します。

生成されたソース

56

17Th
Developer Camp

補足資料
3

Delphi2009/2010 VCL for
the WEB留意点

57

Delphi2009/2010 VCL for the WEB留意点
実行表示時の0Dを含む文字の欠落•

Unicodeの下2桁が0Dの文字（“名”,“不”, “損”,“服”,“納”,“鈍”, “倍”・・・等）
はTIWLabelのCaptionプロパティやTIWEditのTextプロパティで設定すると実行時に表示が欠落してしまいます。

これは0Dが改行コードとして認識されているために発生しているので回避対応が必要です。
QC報告
http://qc.embarcadero.com/wc/qcmain.aspx?d=87756
58

Delphi2009/2010 VCL for the WEB留意点
実行表示時の0Dを含む文字の欠落の対処方法例•

TIWLableコンポーネント
RawTextプロパティをTrueに設定すると改行の制御がOffになるので正しく表示できます。

•

TIWEditコンポーネント
RawTextプロパティはないので、IWCompEdit.pasに対応を加えてユニットを組み込めば正しく表示できます。

IWCompEdit.pasの対応点
TIWCustomEdit.RenderHTML関数内の次の部分を変更
Result.AddStringParam('VALUE', TextToHTML(Text));→
Result.AddStringParam('VALUE', TextToHTML(Text, False, False));59

Delphi2009/2010 VCL for the WEB留意点
Asyncイベント実行時の0Dを含む文字の欠落•

Async関係のイベントで0Dの文字をTIWEditのTextプロパティに設定すると表示が欠落してしまいます。

procedure TIWForm1.AsyncEventAsyncClick(Sender: TObject;
EventParams: TStringList);
begin
IWEdit1.Text := IWLabel1.Caption;
end;

これはRenderHTML関数ではなくRenderAsync関数で欠落しているため
前述の対応は有効ではありません。
60

Delphi2009/2010 VCL for the WEB留意点
Asyncイベント実行時の0Dを含む文字の欠落の対処方法例•

TIWEditコンポーネント
Async以外のイベントで処理を代行するか、
IWCompEdit.pasに対応を加えてユニットを組み込む必要があります。
IWCompEdit.pasに対応を加える場合は
TIWCustomEdit.RenderAsync関数が修正対象になります。
■修正例■
■修正例■
画面上に表示されているElement値は欠落していますが、画面上に表示されているElement値は欠落していますが、コンポーネント内でコンポーネント内でtext
textとして正しい値を保持しているので、として正しい値を保持しているので、JavaScritpを発行して直接Element値を上書きします。
JavaScritpを発行して直接Element値を上書きします。
表示上は欠落していますがtextの値は正しく保持されています（RenderAsync実行時点）

61

Delphi2009/2010 VCL for the WEB留意点
Asyncイベント実行時の0Dを含む文字の欠落の対処方法例
function TIWCustomEdit.RenderAsync(AContext: TIWBaseHTMLComponentContext): TIWXMLTag;variwedtOwner : TComponent; //Ajax対応処理 add
sText,sJS : String;//Ajax対応処理 add
begin・・・・既存ステップは掲載割愛・・・・
RenderAsyncCommonProperties( AContext, Result );//Ajax対応処理 start
iwedtOwner := Owner;
if Owner is TFrame then
begin
while (iwedtOwner is TFrame) do
begin
iwedtOwner := TFrame(iwedtOwner).Owner;
end;
end;

JavaScript発行のため、IWEdit
が配置されているIWFormを
Ownerとして取得。
Frameが使われた場合を考慮してループ処理。

62Delphi2009/2010 VCL for the WEB留意点
Asyncイベント実行時の0Dを含む文字の欠落の対処方法例
JavaScript発行時に画面
if iwedtOwner is TIWForm then値で変換が必要なものは
begin
事前に変換。
sText := Text;
このコードは変換例なので
sText := StringReplace(sText, '&', '&amp;', [rfReplaceAll]); インジェクション上で問題
sText := StringReplace(sText, '<', '&lt;', [rfReplaceAll]);あるものは変換を追加して
sText := StringReplace(sText, '>', '&gt;', [rfReplaceAll]);ください。
sJS := 'document.getElementById('+ QuotedStr(HTMLName)+ ').innerText = '+ QuotedStr(sText) + ';';
ElementのinnnerTextを上書きす
TIWForm(iwedtOwner).AddToInitProc(sJS);
るJavaScript文を生成。
end;//Ajax対応処理 end
except
事前に取得したIWFromで
FreeAndNil(Result);
AddToInitProcを使用してend;
JavaScritpを実行。
end;63