【T2】Delphiテクニカルセッション「知って得する！現役ヘルプデスクが答えるDelphiテクニカルエッセンス」
株式会社ミガロ
RAD事業部 技術支援課 顧客サポート
吉原 泰介

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

1アジェンダ• ミガロについて• 問合せ分析• よくある問合せQ&A【Q１】Excel出力パフォーマンスを改善したい【Q2】DBGridでこんなことがしたい！
【Q3】Editで右寄せ表示できますか？
【Q４】クライアント端末の情報を取得したい！
【Q５】多言語環境に対応するには？
• これからのサポート
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

21

ミガロについて
株式会社ミガロ －A 100% System i Company－
会社情報
会社情報
所在地：本社 大阪府大阪市浪速区湊町2-1-57

所在地：本社 大阪府大阪市浪速区湊町2-1-57
難波サンケイビル13F
難波サンケイビル13F
拠点 東京都港区麻布台1-4-3拠点エグゼクティブタワー麻布台11F
東京都港区麻布台1-4-3
エグゼクティブタワー麻布台11F

事業内容
事業内容
IBM System i に特化した開発ツール販売
IBM System i に特化した開発ツール販売
および技術サポート
および技術サポート
Delphi/400
DelphiをSystem iに完全対応させたミドルウェア
国内530社、全世界約5,000社の導入実績

3

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

問合せ分析
サポートには月100件弱の問合せ対応
Delphi問合せ内容比率
ｺﾝﾎﾟｰﾈﾝﾄ

問合せ分類比率2%

ｻｰﾄﾞﾊﾟｰﾃｨ
12%

その他
Delphi/400
環境・他連携26% 5%

21%

ﾌﾟﾛｸﾞﾗﾑ方法
65%

フィードバック
フィードバック

ホームページ
ホームページ
顧客専用サイト
顧客専用サイト

Delphi69%

皆様へフィードバック
皆様へフィードバック
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

42

【Q１】 Excel出力パフォーマンスを改善したい！
• 【質問】
OLEを利用したExcelの出力処理で件数が多い場合、OLEを利用したExcelの出力処理で件数が多い場合、処理時間が長くて困っています。
処理時間が長くて困っています。

• 【回答】
Delphi⇔Excel間の通信回数を減らすことで格段にDelphi⇔Excel間の通信回数を減らすことで格段にパフォーマンス向上を行うことができます。
パフォーマンス向上を行うことができます。

5

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

【Q１】 Excel出力パフォーマンスを改善したい！
•出力Excel

出力Excel

Cell単位の通信
Delphiプログラム
Delphiプログラム
while not(EOF) do
begin//Cellごとに値を書き込みを行う。
WorkSheet.Cells[iRow, 1].Value :=FieldByName('TEST01').AsString;
WorkSheet.Cells[iRow, 2].Value :=FieldByName('TEST02').AsString;
WorkSheet.Cells[iRow, 3].Value :=FieldByName('TEST03').AsString;
WorkSheet.Cells[iRow, 4].Value :=FieldByName('TEST04').AsFloat;･･･

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

Delphiプログラム
Delphiプログラム

まとまった単位での通信//クリップボードに書き込み内容を編集して格納
Clipboard.Clear;
Clipboard.AsText := strText;･･･//クリップボードから貼り付け
WorkSheet.Cells[1, 1].Select;
WorkSheet.Paste;

63

【Q２】DBGridでこんなことがしたい！①• 【質問】DBGridで行毎にチェックを付けさせることは可能ですか？
DBGridで行毎にチェックを付けさせることは可能ですか？

• 【回答】DBGridのOnDrawCellイベントで描画制御を行うこと
DBGridのOnDrawCellイベントで描画制御を行うこと
でDBGriｄ上でのチェックボックスを扱うことができます。
でDBGriｄ上でのチェックボックスを扱うことができます。

7

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

【Q２】DBGridでこんなことがしたい！①
クリック処理CellClickイベント

Check

受注No
000001000002000003000004

取引先
A社
B社
C社
D社

ﾌｨｰﾙﾄﾞ値が01に更新

ﾌｨｰﾙﾄﾞ値が10に更新

・・・
・・・
・・・・・・・・・

受注No
000001000002000003000004

取引先
A社
B社
C社
D社

・・・
・・・
・・・・・・
・・・

描画処理
ﾌｨｰﾙﾄﾞ値が0
DrawColumnCellイベント
ﾌｨｰﾙﾄﾞ値が1
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

84

【Q２】DBGridでこんなことがしたい！①
if (Column.Field.DataType = ftInteger) thenCellClickイベントの作成

beginif DataSource.DataSet.FieldByName(AFieldName).AsInteger = 1 then
DataSource.DataSet.FieldByName(AFieldName).AsInteger := 0
else
DataSource.DataSet.FieldByName(AFieldName).AsInteger := 1;

procedure TForm1.DBGrid1CellClick(Column: TColumn);

end;

var

DataSource.DataSet.Post;

SaveOptions:TDBGridOptions;end

AFieldName: String;

else

begin
with DBGrid1 do
begin

Options := SaveOptions;
exceptOptions := SaveOptions;

if(Assigned(Column.Field)) thenbegin
SaveOptions := Options;try
if (not Column.ReadOnly) and (Column.Field.Tag = 9) and(DataSource.DataSet.Active) thenbegin
Options := Options - [dgEditing];raise;
end;
end;
end;
inherited;
end;

AFieldName := Column.FieldName;
if (DataSource.DataSet.State = dsBrowse) then
DataSource.DataSet.Edit;※この方式はイベントの動作上、DBGridのOptions>dgEditingがFalseであることが前提となります。

9

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

【Q２】DBGridでこんなことがしたい！①
if AField.Value <> Null then

DrawColumnCellイベントの作成

begin
if (Fields[DataCol].DataType = ftInteger) thenprocedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;

begin

DataCol: Integer; Column: TColumn; State: TGridDrawState);

if (AField.AsInteger =1) thenvar

begin

AFieldName: string;

Windows.DrawFrameControl(Canvas.Handle, Myrect,AField: TField;

DFC_BUTTON, DFCS_BUTTONCHECK + DFCS_CHECKED);

MyRect: TRect;

end

const

else

CBHeight=14;

begin

begin

Windows.DrawFrameControl(Canvas.Handle, Myrect,MyRect := Rect;

DFC_BUTTON, DFCS_BUTTONCHECK);

MyRect.Top := Trunc((MyRect.Bottom - MyRect.Top - CBHeight) / 2)end;+ MyRect.Top;

end;

MyRect.Bottom := MyRect.Top + CBHeight;

endwith DBGrid1 doelse

begin

beginif(Assigned(Fields[DataCol])) thenWindows.DrawFrameControl(Canvas.Handle, Myrect,begin

DFC_BUTTON, DFCS_BUTTONCHECK + DFCS_INACTIVE);

if (Fields[DataCol].Tag = 9) then

end;

begin

end;

AFieldName := Columns[DataCol].FieldName;

end;

AField := DataSource.DataSet.FieldByName(AFieldName);

end;

Canvas.FillRect(Rect);inherited;end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

105

【Q２】DBGridでこんなことがしたい！②• 【質問】DBGridの表示状態をユーザーごとに持たせる
DBGridの表示状態をユーザーごとに持たせることはできますか？
ことはできますか？

• 【回答】DBGrid.ColumnsオブジェクトのSaveToFile/LoadFromFile
DBGrid.ColumnsオブジェクトのSaveToFile/LoadFromFile
メソッドを利用することで、ユーザーが変更した表の実行メソッドを利用することで、ユーザーが変更した表の実行状態を保存・読み込みすることができます。
状態を保存・読み込みすることができます。

11

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

【Q２】DBGridでこんなことがしたい！②
Delphiプログラム
受注No
000001000002000003000004

取引先
A社
B社
C社
D社

担当者
田中中村
佐藤
木村

・・・・・・・・・・・・
・・・

画面終了時
DBGrid.Columns.SaveToFile(設定ファイル)

並び替え
担当者 受注No
取引先
田中 000001 A社
中村 000002 B社
佐藤 000003 C社
木村 000004 D社

設定ファイル・・・・・・・・・・・・
・・・

画面起動時
DBGrid.Columns.LoadFromFile(設定ファイル)

次回起動時初期化されない本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

126

【Q３】 Editで右寄せ表示できますか？
• 【質問】
Editコンポーネントで数値項目を表示する場合、右寄せでEditコンポーネントで数値項目を表示する場合、右寄せで表示することはできますか？
表示することはできますか？

• 【回答】
Editコンポーネントの標準プロパティ等では右寄せはEditコンポーネントの標準プロパティ等では右寄せは行えませんが、派生させて新しいコンポーネントを作成行えませんが、派生させて新しいコンポーネントを作成すれば対応することができます。
すれば対応することができます。

13

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

【Q３】 Editで右寄せ表示できますか？
unit REdit;
interface

右寄せ表示Editｺﾝﾎﾟｰﾈﾝﾄの作成uses
SysUtils, Classes, Controls, StdCtrls, Windows;
typeTREdit = class(TEdit)private{ Private 宣言 }protected{ Protected 宣言 }procedure CreateParams(var Params: TCreateParams); override;
public{ Public 宣言 }published{ Published 宣言 }end;

OSがWin98以前、WinNT4のSP3以前、またはDelhi3以前の場合はParamsに与える内容を以下のようにする必要があります。
procedure TREdit.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or WS_MULTILINE or ES_RIGHT
and not WS_VSCROLL and not WS_AUTOVSCROLL;
end;{右寄せ表示}procedure Register;implementation
procedure Register;
begin
RegisterComponents('パレットページ名', [TREdit]);end;{ TREdit }procedure TREdit.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or ES_RIGHT;
end;
end.
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

147

【Q４】クライアント端末の情報を取得したい！
• 【質問】
実行プログラムが動作しているクライアント端末のIPアドレス
実行プログラムが動作しているクライアント端末のIPアドレスを取得することはできますか？
を取得することはできますか？

• 【回答】
環境にもよりますが、取得することが可能です。
環境にもよりますが、取得することが可能です。
他にもコンピュータ名等の情報も取得することができます。
他にもコンピュータ名等の情報も取得することができます。

15

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

【Q４】クライアント端末の情報を取得したい！
IP取得関数GetIPAddressの作成
usesにWinSockを追記
function GetIPAddress: String;var
wVerReq: Word;
WSData: TWSAData;
Buff: array[0..255] of Char;
Host: PHostEnt;
IP: PChar;
begin
wVerReq := MakeWord(1, 1);
if WSAStartup(wVerReq, WSData) = 0 thentry
if GetHostName(Buff, Length(Buff)) = 0 thenbegin
Host := GetHostByName(@Buff);
if Host <> nil thenbegin
IP := Host^.h_addr_list^;
Result := IntToStr(Integer(IP[0]))+ '.' + IntToStr(Integer(IP[1]))+ '.' + IntToStr(Integer(IP[2]))+ '.' + IntToStr(Integer(IP[3]));
end;
end;
finallyWSACleanup;end;end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ドメイン名の取得にはWinSock APIのGetHostName及びGetHostByNameを主に利用します。
この関数はネットワークデバイスが複数存在するケースを想定していませんのでご注意下さい。

{Edit1にIPアドレスを表示}
Edit1.Text := GetIPAddress;168

【Q５】多言語環境に対応するには？
• 【質問】
複数の言語環境で稼動するシステムを作成する効率の複数の言語環境で稼動するシステムを作成する効率の良い手法はありますか？
良い手法はありますか？

• 【回答】
Delphiに搭載されている言語変換機能を利用することで、Delphiに搭載されている言語変換機能を利用することで、１プロジェクトで言語変換してリソースを生成することが１プロジェクトで言語変換してリソースを生成することができます。
できます。

17

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

【Q５】多言語環境に対応するには？
アメリカ サーバ• 受託開発例

ファイルA(DDM)

日本 サーバ

共通領域
ファイル

ファイル
ファイルA

ドイツ サーバ

ファイルA(DDM)

ファイルA(DDM)

クライアント【 Delphi 】
クライアント【 Delphi 】
IniファイルによってIniファイルによって多言語の画面に切り替え！
多言語の画面に切り替え！

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

英語リソース
英語リソースドイツ語リソース
ドイツ語リソース
・・・語リソース
・・・語リソース

ファイル

18

9

【Q５】多言語環境に対応するには？
①日本語で画面作成

ウィザードに従って言語等を指定する②プロジェクトメニューより[言語]-[追加]を選択

19

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

【Q５】多言語環境に対応するには？
③ウィザードが完了するとトランスレーションマネージャーが起動します。
この画面で日本語に対応する英語を登録していきます。

④新しい日本語が出てくるたび、上図のようにトランスレーションリポジトリ（辞書のようなもの）に登録していきます。
リポジトリに登録することにより、次から同じ単語が出てくるとウィザードで自動翻訳してくれます。
※画面の日本語をなるべく統一しておく必要があります

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

2010

【Q５】多言語環境に対応するには？
④プログラムをコンパイルすると拡張子ENU（米英語選択時）のファイルが完成します。

一度英語の画面を作成すると、プロジェクトメニューより[言語]-[ローカライズ済プロジェクトの更新]を選択することで英語画面の再作成を行うことができます。

21

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

これからのサポート• 良いシステムはわかりやすい！
• 良いシステムはレスポンスが早い！
• サポートもそうありたいと考えます！
ミガロサポートに対する評価

良くな
普通 い
19% 3%■要望Top5■
具体的な導入事例やサンプルプログラムをもっと公開して欲しい。
画面の設計の仕方など、５２５０の発想で考えてしまうので、画面の構築例が見たい。
教育コースで、Webシステムの作り方を教えて欲しい。
信頼のおける開発会社を紹介して欲しい。
今後もDelphi/400をサポートし続けて欲しい。

良い78%

良い196

普通良くない48■満足Top5 ■ミガロのテクニカルサポートには、いつも早急に答えてもらっている。
サポート担当者は、非常に親切。
購入するときに丁寧なデモや紹介をやってもらった。
ミガロHPのパフォーマンス情報等は非常に役立っている。
ミガロのアプリケーション受託開発力に大変満足している。

7

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

http://www.migaro.co.jp/2211