Delphi

TDBGridの右寄せ・センターリング @Delphi

新しいバージョンを買っているのに、移行せずに、
古いバージョンを使ってきたが、やっとXE2に着手。
最新は、10.2 Tokyo

XE5から、iOS/Androidの開発も出来るようになったので、
このバージョンまでは、保有しているが、
まだ、インストールすらしていない。

まだ、そこまで必要な案件がない・・・

***

TDBGridのカスタムドローで、センターリング・右寄せするには、
昔は、

with TDBGrid.canvas do begin
case Column.Alignment of
 taRightJustify:
  // 右寄せ
  LeftMargin := Column.Width - TextWidth(bufStr) - 4;
 taCenter:
  // 中央寄せ
  LeftMargin := (Column.Width - TextWidth(bufStr)) div 2;
 end;
 TextRect(Rect, Rect.Left + LeftMargin, Rect.Top + 2, bufStr);
end;

と、書いていたが、XE2にしてから、ずれるようになったので、
調べてみたところ、

今は、

with TDBGrid do begin
  case Column.Alignment of
    taRightJustify:
      // 右寄せ
      uFormat := DT_RIGHT or DT_SINGLELINE or DT_VCENTER;
    taCenter:
      // 中央寄せ
      uFormat := DT_CENTER or DT_SINGLELINE or DT_VCENTER;
    else
      uFormat := DT_LEFT or DT_SINGLELINE or DT_VCENTER;
  end;

  aRect      := Rect; // ※DrawTextは変数渡し(RectはConst)
  InflateRect(aRect, 0, 0);
  DrawText(Handle, PChar(bufstr), Length(bufstr), ARect, uFormat);
end;

と書くようだ。

参  >> TDBGrid の複数行選択とセルのカスタム描画 

 

また、XE2からスタイルテーマが選べるようになり、
黒塗りが出来るようになった。

しかし、上記カスタムドローをしちゃうと、背景が真っ白になったりするので、

Canvas.Font.Color :=TStyleManager.ActiveStyle.GetSystemColor(clWindowText)
// ※clWindowTextを、clbtnface、clWindowなどに、変更

を、追加することで、各テーマの標準色を取ってきてくれる。

 

客様の反応は、わからないけど、これで納品予定(笑

白バックって、三原色を放つため、光量が強すぎて、目には刺激が強すぎるが、
その点、黒バックって、目に優しいんですよね♪

昔のDOSの画面は、真っ黒に緑文字だったのに、
紙は白だけど、ディスプレイも白じゃないとって、誰が決めたんだろう?

PS.
最近見つけた、Windowsの新機能 >> 夜間モード

https://support.microsoft.com/ja-jp/help/4027563/windows-10-set-your-display-for-night-time

ブルーライトカットで、目が一瞬で楽になるのが、わかります。
お試しあれ!。

-

OLE制御(OpenOffice Calc vs. Ms Excel)

Microsoft Office(Excel)のライセンスが、ややこしいので、
OpenOffice(Calc)を検討。
※ライセンス問題については、後述

***

安牌を取るなら、既に出来上がっているExcelで良かったんだけど、
テストは?、ということ、これからの部分。

なので、Calcが登場するチャンスはまだあったわけで、

Excelで出来たことを、Calcで
どのように処理するか、を、まとめました。

OLE


Excelは、Delphiにコンポーネントがあるのと、
デモプログラムなんかで、割りとカンタンにOLE制御可。

Calcの唯一の資料は、
http://edn.embarcadero.com/jp/article/40857/images/40857/b5.pdf

Excel OLEでも同じだが、CalcをOLE制御するにあたり、
それ以降は、他の言語の解説を流用して、記述するしかない。
(言語毎の書き方が違うだけで、基本同じ)

非表示(パラメーターを指定して、ファイル読み込む)

 vP := VarArrayCreate([0, 0], varVariant);
 vP[0] := vOpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
 vP[0].Name := 'Hidden'; // 非表示で起動
 vP[0].Value := true;

vStarDesktop.loadComponentFromURL('file:///' + xls_path, '_blank', 0, vP);

保存せずに終了(変更していない、ことにする)

vDoc.Modified := False;
vStarDesktop.terminate;

とか。

ExcelをCalcに移植


Calcは、

セルの指定が違う(左Excel/右Calc)
_設定!B1 >> _設定.B1

など、
一部変更が必要だったり、対応していない機能があるものの、

xlsのほとんど読み込める。

マクロは、ほとんど書き直す必要があるみたいだけど、
今回、マクロは多用していないが、

困ったことは、
Excelだとテキストボックスに「=B1」などと、
他のセルの値を指定できるのに対し、

Calsは出来ない・・・

テキストボックスをOLEで制御するしかないか?と、
いろいろ探したけど、見つからず。
途中で、テキストボックスの値を別のテキストボックスに書き出すサンプルを発見。

http://oooug.jp/faq/index.php?faq%2F5%2F20

ここに、デモがあったので、
DLして必要箇所を移植してみたけど、どうも動かず、

わかったことは、

フォーム・テキストボックスと
テキストボックスと、2種類ある!

デモでは、前者を使い、
Excelからの移植では、後者を使っていた。

 

プロパティーでセルの値を指定できたので、まず、1つ解決。

次に、印刷に反映できるか?、
だったけど、これも問題なく、基本的な移植が完了した!

そして残すは、

耐久テストだけ!

***

MsOfficeと、OpenOfficeのライセンス


ライセンス単位で、2つのPCにインストール出来るので、
3万円だとしても、1台あたり、半値で2台使える!

わけではなく、

ライセンス上、二人が使うことは出来ない。

※あくまで、サブ機にも入れていいよ、程度で、

2台に入れるのに、6万円は高いだろうという、配慮

 

多くの人が、無視して、二人で使っているだろうけど、
流石に、お客さんに推し進めることは出来ないため、

お客さんが、正当にお金を払ってくれればいいのですが、

どうせ、印刷するだけなので、
無駄でもあり、負担にもなります。

ということで、今回、ビジネスでも利用可能な

無料のOpenOfficeに移植した次第です。

参考 > OpenOfficeのライセンスについて

http://forest.watch.impress.co.jp/docs/serial/moritalk/536026.html

今回使ったのは、Apache OpenOfficeなので、Apache Licenseになり、
LibreOfficeは、GNU Lesser General Public Licenseとなり、

※共に、同じOpenOfficeの派生系

開発レベルでいうと、
いろいろと問題があるけど、

個人・団体利用、商用・非商用に関係なく
無償利用が許可されている。

が、寄付をさせて頂く予定。

http://www.openoffice.org/ja/

-