2015年05月01日

ローカライズ時注意 その2

Delphi2007 ForeDAC TADMemtable(最近のDelphiでは、TFDMemTableに改名) の使用での注意点。

Windows7 英語版 で動かす場合、フィールド名に、2バイト文字を使うとエラーとなる。


Delphi2009以降のUniCode対応版ではもしかしたら大丈夫なのか。未確認。

posted by しんくそふと at 15:03| Comment(0) | TrackBack(0) | おぼえ

2015年03月10日

BDE ⇒ FireDAC変換 その3

String型Fieldでの未入力データの扱いについて。

TADConnectionのFormatOptionsプロパティのStrEmpty2Nullの設定に注意が必要。
特に、Nullと空文字を使い分けているプログラムでは、重要。
Defaultは、Trueなので、未入力データを空文字列として扱いたい場合は、この設定変更が必要。


個人的には、Default値は逆にしておいて欲しい。



posted by しんくそふと at 13:22| Comment(0) | TrackBack(0) | Delphiマイグレーション

2015年02月18日

CoReports 便利機能その1

フォームを作成中に気づいた便利機能です。

他のソフトにあるテキストやイメージデータを、フォームオブジェクトに直接貼り付けができます。
ラベルなどは、いちいち打ち直さなくて良いので非常に便利。



Delphiのフォームにもこの機能が欲しい。。。


弊社でCoReportsの取り扱いを行っています。

posted by しんくそふと at 10:52| Comment(0) | TrackBack(0) | CoReports Tips

2015年01月22日

ローカライズ時注意


TForm(VCL)のScaledプロパティをFalseにする。
でないと、ローカライズ先によっては、フォーム&コンポーネントサイズが変わってしまう。

変わらないコンポーネントもあるので、バランスも崩れる。


#
Delphi2007の多言語対応機能は、2バイトコード=>2バイトコード(例:日本語=>中国語)は、バグっている(報告済み)
XE7は直っているのだろうか?
いろいろ聞くと、ベースは英語で作成して、そこからの展開がベターらしい。英語苦手なんだが(ーー;)。。。


posted by しんくそふと at 10:15| Comment(0) | TrackBack(0) | おぼえ

2014年12月07日

CoReportのDelphiでの利用



2014・11・11 東京ライトニングトークで話した資料です。
以前、"Delphi開発での印刷処理実装"の中で紹介した印刷コンポーネントでもあります。

段取り悪く、話しきれなかったことはおいおい、記事にしていきたいと思います。


資料中にある、サンプルの販売は、ライトニングトークでのデモのものに、もう1〜2点追加予定です。
ただいま準備中ですので、固まりましたら、詳細をHP等でご案内させていただきます。



posted by しんくそふと at 12:00| Comment(0) | TrackBack(0) | 開発TIPS

意外と使われていない便利なプロパティ Forms.Constraints編

Delphi / Appmethod Advent Calendar 2014 投稿記事です

弊社、いろいろな会社がDelphiで作成したプロラムのメンテを多くさせていただいています。
その中で、あまり使われていないor知られていないけど、便利なプロパティについて紹介します。
(えらそうに書いているけど、他者が作ったプログラムをメンテさせていただいている中で気づいたというのが真相ではあります。。。。)


今回(次回があるかは不明)は、Forms.Constraintsです。


これは、Formをリサイズできるようにした場合の、変更できる高さや幅の制限をかけることができるプロパティです。下記の4点の指定ができます。
MaxHeight
MaxWidth
MinHeight
MinWidth

かつて(ずいぶん前)は、画面の解像度は限られたもので、事前に、画面設計も解像度などを決めて作成していました。


最近は、解像度も多種になり、特に一覧表示などは自由に表示サイズを変えたいという要望がでます。

設定は簡単に変えられるのですが、ボタンが見えなくなるなどで、ある程度のサイズより小さくならないように設定しておく必要が出ます。
このような場合、MinHeight、MinWidthにサイズ指定を指定しておくことで対応ができます。



posted by しんくそふと at 11:38| Comment(0) | TrackBack(0) | 開発TIPS

2014年11月08日

FastReport の使用



FastReport は、製品版の購入がお勧め。
なんといっても日本語のマニュアル&ヘルプがついている。
バンドル版よりバージョンもひとつ上だし。

* 最近、ブログの検索ワードで、FastReport が増えてるので、ちょっと書いてみました

追記

ただし、FireMonkey版は、扱いなしとのこと。。。

posted by しんくそふと at 09:43| Comment(0) | TrackBack(0) | 開発TIPS

2014年10月16日

TClientDataSetとTFDMemTable


画面での編集用や、印刷時の、一時テーブルに、TClietnDataSetを使っていた。
FireDACには、同様の用途として、TFDMemTable があり、FireDACに置き換えたプロジェクトには、こちらを使っている。
で、パフォーマンスは違うのかどうなのだろうと気になり確認しました。


DelphiXE7で、テストプログラムは作成しています。
フィールドは、TLargeintFieldを1項目と、TIntegerFieldを10項目で作成しています。
TClietnDataSetについては、LogChanges=Falseに設定している。

Win32 データ100万件 (仮想マシン上で実行。メモリ3G割当設定)
 TFDMemTableTClientDataSet
Append
 7.300 Sec
6.630 Sec
 5.117 Sec
5.148 Sec
Close
 0.171 Sec
0.188 Sec
2.356 Sec
1.575 Sec

Win64 データ1000万件
 TFDMemTableTClientDataSet
Append
 54.618 Sec
54.825 Sec
 45.277 Sec
45.126 Sec
Close
1.555 Sec
1.655 Sec
 92.922 Sec
92.635 Sec

それぞれ2度づつ計測している。
Append処理は、若干、TClietnDataSetのほうが早いようだ。
ちょっと気になるというのかわからないのは、Closeで、TClietnDataSetが時間がかかる件。
タスクマネージャで見ていると、TFDMemTablは、Closeで一気にメモリ使用量が減るが、 TClietnDataSetは、Close後もしばらく増加傾向が続きその後、減少しているようだ。
TFDMemTableはs、Win32で、1000万件も処理できたが、TClietnDataSetでは、追加は動いたが、Close時に
---------------------------
Insufficient memory for this operation.
---------------------------
のエラーが出てしまう。(なので、上記テストは、Win32は、100万件としている)

全件追加した状態のタスクマネージャの観察してみると、TClietnDataSetのほうが、メモリの使用量が少ないようだ。メモリ管理を効率化してしまったがために、CLose時、何か問題を引き起こすようなことになっているのだろうか。Win64では、とりあえず、今回のテストでは同様の問題は起きない。

TFDMemTableのAppend、Closeのメモリの動き(わかりやすい)
増加のところは、Appendです。Appendが終わると増加はとまる。
Closeで一気に使用分が減る。


TClientDataSet 赤マーク部分でAppend終了、すぐにClose
なぜかCloseしても、使用メモリは増える。
緑でClose終了。黄色は、プログラム終了。
Closeでメモリ量が元に戻らないので、注意が必要ということか。。。。。


...more
posted by しんくそふと at 17:59| Comment(0) | TrackBack(0) | 開発TIPS

2014年09月30日

Excel出力コンポーネント DelphiXE7版


以前、Excel出力コンポーネントのDelphiXE6版の公開のアナウンスをしましたが、XE7が出たので、XE7版としました。

今回は、DelphiXE7用のみです。

サンプルプログラムも前バージョンは、ClientDataSetを使用していましたが、FireDACのFDMemTableに変更しています。
また、Excelは、Excel2010についてのみ確認しています。

以前のバージョンと同様ソース付です。



コンポーネント修正箇所
・Excel2010対応のため、改ページ部分を変更しています。内容はソース確認してください。

不具合など見つけましたら、連絡いただけるとありがたいです。


posted by しんくそふと at 14:43| Comment(0) | TrackBack(0) | Excel出力コンポーネント

2014年08月01日

FastReport:プレビュー画面で印刷 or PDFエクスポートした後もプレビューを続ける方法


プレビュー画面から印刷 or PDFエクスポートする

*印刷
このときプリンタなどの設定は、frxReport1で行う。
    frxReport1.PrintOptions.ShowDialog := False;
    frxReport1.PrintOptions.Printer := ’ぷりんた名’;
    frxPreview1.Print;

*PDFエクスポート
    frxPDFExport1.FileName := "ファイル名.pdf"
  frxPreview1.Export(frxPDFExport1);

frxPreview1は、プレビューで使っているコンポーネント。


(2014.9.30 未完成状態で公開したようで、修正)

タグ:FastReport
posted by しんくそふと at 19:14| Comment(0) | TrackBack(0) | 開発TIPS

2014年07月25日

Excel出力コンポーネント XE6対応


以前公開したExcel出力コンポーネントですが、DelphiXE6でもパッケージを作成しなおせば、使用可能と思います。
サンプルプログラムを少し改修中で、近々、公開予定です。
(まだ、時々ダウンロードしていただけているようなので、ご案内)



...more
posted by しんくそふと at 15:29| Comment(0) | TrackBack(0) | 開発TIPS

FastReportおぼえ 2


ラインの追加
var
  Line : TfrxLineView;

begin
〜〜〜〜
    with frxReport  do
    begin
      Line  := TfrxLineView.Create(FindObject('Sheet') as TfrxReportPage);
                                                                      //↑追加するシート名
      Line.Left := ******;
      Line.Top := ******;
      Line.Width := ******;
      Line.Height := *******;
      Line.ShowHint := False;
      Line.Diagonal := True;
    end;


posted by しんくそふと at 13:10| Comment(0) | TrackBack(0) | 開発TIPS

FastReportおぼえ 1


直接コードで、オブジェクトに値を設定する方法

frxReport.(FindObject('XXXXXX') as TfrxMemoView).Text := 'XXXXXXX';
FasReport雑感
DBとの連携レポートは作りやすそうだが、上記の様に直接オブジェクトに値を入れたりするのはちょっと作りにくい。
特に、オブジェクト名の確認のため、いちいちレポート定義を開いて閉じて(定義を開いたままDelphiコードを編集できない)を繰り返さないといけないのが面倒。製品版購入でこのあたりを解消できるのだろうか?



posted by しんくそふと at 13:05| Comment(0) | TrackBack(0) | 開発TIPS

2014年06月12日

Delphi開発での印刷処理実装


弊社で使用している印刷モジュールの紹介です。
いろいろなところで印刷をどうしているか、どうするかという話によくなりますので、弊社が使用しているものの紹介をします。。

http://www.hos.co.jp/package/cr10/
弊社では、伝票などの単票形式の印刷にはこれを使っています。

残念ながら、Delphiのコンポーネントとしては、提供されていないですが、ActiveXですので、定義を取り込んでDelphiコンポーネントを作成し、使用しています。

特にこのプログラムの機能で気に入っているというか、この機能を使いたいがために弊社で使用しています。
弊社では、次の2点の特徴で、採用を決めました。
1.レイアウト関係の情報が、定義ファイルとして、別ファイルにできること
2.日本の会社が開発しているので、マニュアル等が日本語。問い合わせも日本語でできる(外国語が苦手です)

2はよいとして、1についてもう少し詳しく。
a)
ちょっとしたレイアウトの修正は、プログラムを修正することなく、この定義ファイルの差し替えで対応できます。
b)
扱うデータは、同じだけど、レイアウトが異なる帳票で、プログラムはそのままで使用する定義ファイルの切り替えのみで対応できます。
弊社では、印刷時のダイアログで、定義ファイルを選択できるようにして、印刷時にユーザーが選択できるようなクラスを作成しています。
これは、たとえば、郵便物の宛名書きなどがよい例だと思いますが、使用する封筒サイズごとの定義ファイルを作成。
印刷時に選択することによりそろぞれのレイアウトで印刷できます。
これにより、封筒サイズごとにプログラムを書く必要がなく、定義ファイルの変更で済ませることができます。
荷物の配送で複数の業者を使っている場合など、送り状が異なりますが、これも配送業者ごとにプログラムを書く必要がなく、定義ファイルの切り替えで対応しています。
これの応用で、明細行の異なる帳票も定義ファイルに非表示の明細行数を埋め込むことにより、上記のように定義ファイルの切り替えで対応できます。
また、明細項目の増減も、定義ファイルの工夫で同様に対応できます。

バーコードなども対応していますので、帳票作成をどうするかで迷われているのであれば、一同検討の価値はあると思います。
体験版もあります。
ただ、ネックは、ちょっと高いことです。以前は、もう少し安いエディションがあったのですが、いつの間にかなくなってしまった。。。

---------------------------------------------------------------------------

弊社でも、このソフトを取り扱っていますのでお問い合わせください。
 問い合わせ先メールアドレス mailto:eigyo2.bu@thinksoft.co.jp

---------------------------------------------------------------------------...more
posted by しんくそふと at 19:15| Comment(0) | TrackBack(0) | 開発TIPS

2014年05月19日

PrinterIndex := -1 時のバグ(Delphi XE6)


”通常使うプリンタ”にプリンタ設定する際使用する、
PrinterIndex := -1
についてエラーが出る不具合対応。
DelphiXE5までは、問題なし。

何でこんなバグがまぎれんねんという話はおいといて、対策。
http://qc.embarcadero.com/wc/qcmain.aspx?d=124532

Vcl.Printers.pas
---------------------------------------------------------------------------
procedure TPrinter.SetPrinterIndex(Value: Integer);
var
  lDevice, lDriver, lPort : Array[0..255] of Char;
  lDeviceMode : THandle;
begin
  CheckPrinting(False);
  if (Value < -1) or (Value >= Printers.Count) then
    RaiseError(SPrinterIndexError);
  if (Value = -1) or (PrinterIndex = -1)  then //<-- この行条件変更
    SetToDefaultPrinter;
  if Value <> FPrinterIndex then
  begin
    if Value <> -1 then                  //<-- この行追加
      FPrinterIndex := Value;
    with TPrinterDevice(Printers.Objects[FPrinterIndex]) do
{$IF DEFINED (CLR)}
      SetPrinter(Device, Driver, Port, 0);
{$ELSE}
      Printer.GetPrinter(lDevice, lDriver, lPort, lDeviceMode);
    GlobalUnlock(lDeviceMode);
    GlobalFree(lDeviceMode);
    lDeviceMode := 0;
    Printer.SetPrinter(lDevice, lDriver, lPort, lDeviceMode);
{$ENDIF}
    FreeFonts;
    SetState(TPrinterState.psNoHandle);
  end;
end;
---------------------------------------------------------------------------
ということらしい。
とりあえず試したらうまく行った。...more
posted by しんくそふと at 20:25| Comment(0) | TrackBack(0) | エラー対応覚え

2014年04月10日

Delphiマイグレーション記録 用紙サイズ指定


Printer.Canvas を使った印刷で、事前に用紙サイズを指定する場合、用紙サイズの定数に注意が必要。
Delphi2007以前(以降は未調査)の場合、カスタム用紙 DMPAPER_USER = 256 となっている。

最近の機種では、必ずしも 256 がカスタム用紙でない。

プリンタを変更したなどで、用紙サイズの指定がうまくいかなくなったときは、この辺りをまず疑う必要がある。


posted by しんくそふと at 10:14| Comment(0) | TrackBack(0) | Delphiマイグレーション

2014年04月03日

FireBird gbak Restoreパラメータ


gbak -r -p 8192 -v -user sysdba -pas ????? -FIX_FSS_METADATA SJIS_0208 -FIX_FSS_DATA SJIS_0208 -REP (backup file) (DB)

上書きパターン

-FIX_FSS_METADATA SJIS_0208
-FIX_FSS_DATA SJIS_0208

Ver2.*から上記のように文字コードの指定を付けないとうまく行かないケースがある。
posted by しんくそふと at 16:24| Comment(0) | TrackBack(0) | 開発TIPS

2014年02月23日

BDE ⇒ FireDAC変換 その2 (MapRules)


前回、保留していたデータマッピング機能について試してみた。
前回同様、データベースはOracle。

TADConnectionのFormatOptionsプロパティを下記で設定
-------------------------------------------------------------------
    FormatOptions.AssignedValues = [fvMapRules]
    FormatOptions.OwnMapRules = True
    FormatOptions.MapRules = <
      item
        SourceDataType = dtBCD
        TargetDataType = dtDouble
      end
      item
        SourceDataType = dtFmtBCD
        TargetDataType = dtDouble
      end>
-------------------------------------------------------------------

前回必要だった、Oracle Numberフィールドの、TFloatField定義からの、 TBCDFieldやTFmtBCDFieldへの置き換えが不要になった。
タグ:FireDAC BDE MapRules
posted by しんくそふと at 16:23| Comment(0) | TrackBack(0) | Delphiマイグレーション

2014年02月05日

Delphiマイグレーション記録 QuickReport


QuickReport

Pro版(Ver5)を購入で、最新バージョンをダウンロード可能。
残念ながら、VCL版のみだが、64bit版もある。

一度購入すれば、Delphi新バージョンに対応したものが、ダウンロード可能。
〜Xe7版もダウンロードできる(2014/10/3確認)
Xe8版も確認(2015/6/18)
10Seattle版も確認(2016/5/9,たぶんもっと以前に公開されていたと思う)
10Berlin版も確認(2016/5/9)

#
Delphi2007についてくるバンドル版は、Ver4なので注意が必要。
一部イベント引数の方が変わるので注意。
Sender:TQuickRep が、 Sender:TCustomQuickRep
定義を変えるだけで対応できる。とりあえず上記の変更が必要。今のところこの修正だけで弊社が対応したシステムでは済んでいる。

...more
posted by しんくそふと at 10:41| Comment(0) | TrackBack(0) | 開発TIPS

2014年01月04日

DBGridで列移動不可で列幅変更ができるようにする


標準のDBGridは、列幅変更ができるようにすると列移動もできるようになってしまうオプションしかない。
列移動はできないが、列幅変更だけしたいときの方法。
オリジナルのソースを弄ります。

1)
Vcl.DBGrids.pas(またはDBGrids.pas)を別のフォルダにコピー。

2)
TCustomDBGrid.SetOptions メソッドの以下の行を変更
dgColumnResize がTrueの時の設定処理
      NewGridOptions := NewGridOptions + [goColSizing, goColMoving];
から、goColMovingをコメントアウト
      NewGridOptions := NewGridOptions + [goColSizing{, goColMoving}];
(XE4だと、3965行)

3)
上記ファイルを、オリジナルより先に読むように、path等を設定、または、プロジェクトに追加。

(注意)
元ソースを変えるので、プロジェクト全体が変わる。
同一プロジェクトで画面によっては、列移動も可能にしたいという要望があるときはこの方法はNG。
posted by しんくそふと at 11:28| Comment(0) | TrackBack(0) | おぼえ