IBX で Interbase / Firebird に接続するには?

 Interbase だろうが、Firebird だろうが、普通に IBX で接続できます。Delphi 2009 以降の場合、Professional 版の方は Interbase / Firebird へ接続するなら IBX でやるのが一番簡単です。Starter 版 にも IBX は付属しています。 

uses
  ..., IB, IBDatabase, IBTable, IBQuery;


procedure TForm2.Button1Click(Sender: TObject);
var
  IBXC: TIBDatabase;
  Tran: TIBTransaction;
  QRY: TIBQuery;
begin
  IBXC := TIBDatabase.Create(Self);
  try
    Tran := TIBTransaction.Create(Self);
    QRY := TIBQuery.Create(Self);
    try
      // IBDatabase
      IBXC.LoginPrompt := False;
      IBXC.Params.Clear;
      IBXC.Params.Values['user_name'] := 'SYSDBA';      // User Name
      IBXC.Params.Values['password' ] := 'masterke';    // Password(IBならmasterkey)
      IBXC.Params.Values['lc_ctype' ] := 'UNICODE_FSS'// CharSet
      IBXC.DataBaseName := '127.0.0.1:' +
                           IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) +
                           'DATA\DATA.FDB'// IBなら.IB/.IDB/.GDB
      {$IFDEF CONDITIONALEXPRESSIONS}
      {$IF CompilerVersion >= 23.0}
      IBXC.ServerType := 'IBServer'// Add XE2
      {$IFEND}
      {$ENDIF}

      // IBTransaction
      Tran.DefaultDatabase := IBXC;

      // IBQuery;
      QRY.Database    := IBXC;
      QRY.Transaction := Tran;

      IBXC.Connected := True;

      QRY.SQL.Clear;
      QRY.SQL.Add('Select * From MST_EMPLOYEE');
      QRY.SQL.Add('Where                     ');
      QRY.SQL.Add('  NAME = :_NAME           ');
      QRY.ParamByName('_NAME').AsString := Edit1.Text;
      QRY.Open;
      if QRY.IsEmpty then
        ShowMessage('Empty')
      else
        ShowMessage(IntToStr(QRY.FieldByName('CODE').AsInteger));
      QRY.Close;

      IBXC.Connected := False;
    finally
      QRY.Free;
      Tran.Free;
    end;
  finally
    IBXC.Free;
  end;
end;

 "DBX で Firebird に接続するには?" と見比べてみると面白いと思います。

 Delphi 2009 またはそれ以前で Unicode のデータベースを扱う場合には、Interbase なら "UTF8" Firebird なら "UNICODE_FSS" を使うといいでしょう。Delphi 2010 またはそれ以降であれば、Firebird も "UTF8" でイケます。Interbase の "UNICODE_FSS" は、3 バイトの UTF-8 で、U+FFFF 以降のコードポイントの Unicode 文字を格納できません。Firebird も同様ですが、Firebird は 2.1x 以降、"UNICODE_FSS" でも U+FFFF 以降のコードポイントの Unicode 文字を格納できます。

 Delphi 2010 の IBX は Delphi 2009 の IBX とバージョン番号が同じ (12.12) になっていますが、全く同じものではありません。詳しくは "IBX のバリエーション" を参照して下さい。

 Delphi XE2 の IBX は 64bit クライアントでも動作します。

 IBX の詳しい使い方は "Interbase 2009 開発者ガイド" の第9章以降に載っています。

See Also:


DBX で Interbase に接続するには?

 "DBX で Firebird に接続するには?" の Interbase 版です。 

uses
  ..., DBXInterbase; 

procedure TForm1.Button1Click(Sender: TObject);
var
  DBXC: TSQLConnection;
  QRY: TSQLQuery;
  DataBase: String;
begin
  DBXC := TSQLConnection.Create(Self);
  try
    QRY := TSQLQuery.Create(Self);
    try
      DBXC.LoginPrompt     := False;
      DBXC.DriverName      := 'InterBase';
      DBXC.ConnectionName  := 'IBConnection';
      DBXC.GetDriverFunc   := 'getSQLDriverINTERBASE';
      DBXC.LibraryName     := 'dbxint.dll';
      DBXC.VendorLib       := 'gds32.dll';

      DBXC.Params.Clear;
      DBXC.Params.Values['user_nam'     ] := 'SYSDBA';    // User Name
      DBXC.Params.Values['password'     ] := 'masterkey'// Password
      DBXC.Params.Values['ServerCharSet'] := 'UTF8';      // CharSet
      DataBase := '127.0.0.1:' +
                  IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) +
                  'DATA\DATA.IB';
      DBXC.Params.Values['DataBase'     ] := DataBase;    // Database

      QRY.SQLConnection := DBXC;
      DBXC.Connected := True;

      QRY.SQL.Clear;
      QRY.SQL.Add('Select * From MST_EMPLOYEE');
      QRY.SQL.Add('Where                     ');
      QRY.SQL.Add('  NAME = :_NAME           ');
      QRY.ParamByName('_NAME').AsString := Edit1.Text;
      QRY.Open;
      if QRY.IsEmpty then
        ShowMessage('Empty')
      else
        ShowMessage(IntToStr(QRY.FieldByName('CODE').AsInteger));
      QRY.Close;

      DBXC.Connected := False;
    finally
      QRY.Free;
    end;
  finally
    DBXC.Free;
  end;
end;  

 DBX の接続パラメータが異なるだけで、後は一緒です。

See Also:


Unicode 版 Delphi へマイグレーション (移行) するための資料がない

 敢えて言おう。"ググレカス" と。

 Delphi 2009 よりも 2010 や XE を購入したヒトが多いようです。しかしながら、"ANSI 版 Delphi -> Delphi 2010 / XE" へ移行して、ググル先生に "Delphi 2010 / XE" で質問してマトモな答えが返ってくる訳ありません。Unicode 版へのマイグレーションを行う記事は Delphi 2009 のものが圧倒的に多いのですから。

 以下に、ANSI 版 Delphi から Unicode 版 Delphi へマイグレーションを行うための資料を挙げておきます。

 殆どの資料はエンバカデロの公式サイトに存在します...しかも大半は日本語の資料です。これだけの資料があっても "資料がない" とか "わかりにくい" と言うのであれば、それは単に 理解する努力をしていない だけです。

 「コードサンプルがない?」どこまで甘えん坊さんなんだか。ちゃんと公式な ソースコードのサンプル集 があります。コードサンプルへのリンクは DocWiki のトップページにも貼ってあります。「コードサンプルがない」とか言っちゃうのは、エンバカデロのサイトをちゃんと見ていない証拠です。

 ここに列挙した資料を眺めて、それでも解決できない事がありましたら "エンバカデロ・ディスカッションフォーラム" へお越し下さい。

See Also:


現在トラブルを抱えています。"(コミュニティ名)" で素早く回答を得るにはどうすればいいのでしょうか?

 レスが付かなかったり、冷やかな反応をされるのは、

 のいずれかでしょう。

 トラブルに遭遇したら、まずそのコミュニティの過去ログを検索しましょう。それでもなおトラブルが解消できないのであれば、"ありのままの現状を正確に伝える" ようにしましょう。

 「何故 Delphi のバージョンを明記する必要があるのか?」 についてですが、"94.Delphi のどのバージョンで何が追加されたのか?" をご覧頂ければお解り頂けるでしょう。一口に Delphi と言っても、バーションによってこれだけの違いがあるのです。このバージョンの差を完璧に理解して回答できるヒトなど、この世には存在しないと思われます。たとえバージョンの差異を正確に理解していたとしても、質問者が所有する Delphi のバージョンが判らないのですから、アドバイスには複数の選択肢が含まれる事になってしまい、ピンポイントでの回答が難しくなります。

 「~ができない」「~でエラーになる」だけだと、レスを付けるヒトも憶測でしか物を言えません。ピンポイントに近いアドバイスを得たいのであれば、詳しく状況を説明する事が重要です。問題解決のために自分が試してみた事も付け加えておくといいでしょう。"憶測 (経験則)"によるものと"推測 (動作原理から導き出される理論的な仮説)"によるものではアドバイスの質が違ってきます。以下は、質問する場合の例です。

[D2009] CreateProcess() でエラーが発生する

こんにちは。
Delphi 2009 で作成したアプリケーションが CreateProcess でエラーになって困っています。 

var
  sCmdLine: String;
begin
  sCmdLine := 'notepad.exe';
  CreateProcess(nil, PChar(sCmdLine), …
end;

Vista でのみ発生し、XP ではこの問題が発生しないようです。

OS: Windows Vista Home Premium + SP2
Delphi: 2009 Professional (Build 12.0.3420.21218)

 レスが付いた時に、回答する側は "回避策" あるいは "原因となる部位を特定するための検証手順" を提示する場合が殆どです。検証手順を示されたら、まずはその検証を行い結果を報告して下さい。この際に他の事 (別のコンポーネントを試した等) をやってしまうと、例えその結果トラブルが解決できたとしても、原因が特定できないために、同じ症状で同じ質問が繰り返される事になります。

 回答によって解決したのであれば、同様の症状に悩んでいる方のためにも、その旨をちゃんと返信して下さい。"お礼" という意味ではありません。解決したのかしなかったのかが分からないと、同じ質問が繰り返されるからです。

 回答者の指摘によって直接的/間接的を問わず、自分にミスがあった事に気付いたら素直に認めましょう。はぐらかされると、回答者は別の解法を提示してきます (もちろん的外れな解法を)。これは "質問者/回答者" 双方にとって時間の無駄であり、コミュニティにも有益な情報をもたらしません。

 質問をする事は全然悪いことではありませんし、質問時に自分を卑下する事もありません。ただ、的確なアドバイスを求めるのであれば詳細な情報を公開する事、そして、アドバイスをくれたヒトに素直に従ってみる事です。

See Also:


Microsoft Office にソースコードをシンタックスハイライト (強調構文表示) で貼り付けたい

   TEAD があれば簡単です。お忘れかもしれませんが、Delphi 使い (D2007~D2010) は TEAD合法的にタダで使えます。多分、C++Builder や RAD Studio でもレジストせずに TEAD を使えると思います (2007 以降)。

Microsoft Word / ワードパッド へ直接貼り付ける場合

  1. TEAD を起動
  2. 任意のソースコードを読み込ませる
  3. [ オプション | リッチテキスト出力 | リッチテキスト ]
    (選択状態だと選択部分だけを出力できます)
  4. シンタックスハイライトされたソースコードが RTF 形式でクリップボードにコピーされる。
  5. Microsoft Word へペースト
  6. フォント等を調整する。
 この方法は基本的なやり方です。

Microsoft Excel / Word でテキストボックスへ貼り付ける場合

  1. TEAD を起動
  2. 任意のソースコードを読み込ませる
  3. Microsoft Excel / Word の [ 挿入 | テキストボックス ] でテキストボックスを挿入する。
  4. TEAD で [ オプション | リッチテキスト出力 | リッチテキスト ]
    (選択状態だと選択部分だけを出力できます)
  5. シンタックスハイライトされたソースコードが RTF 形式でクリップボードにコピーされる。
  6. テキストボックスへペースト。
  7. フォント等を調整する。
 枠付きになります。テキストボックスなので、レイアウトが自在に行えます。

Microsoft PowerPoint へ貼り付ける場合

  1. 上の "Microsoft Excel / Word でテキストボックスへ貼り付ける場合" を参考に Excel か Word のテキストボックスにソースコードが貼り付けられた状態にする。
  2. Excel または Word に貼り付けられたテキストボックスをコピー。
  3. PowerPoint のスライド内の "何もない所" をクリック。
  4. Excel または Word のテキストボックスを PowerPoint にペースト。
  5. フォント等を調整する。
 PowerPoint のテキストボックスは Excel / Word のものと少し仕様が異なるようで、PowerPoint でテキストボックスを挿入して、そこへ RTF 形式で貼り付けても書式情報は無視されるようです。

 こうして貼り付けられたソースコードは画像ではないので、

 このような利点があります。実際に "TEAD -> (Word) -> PowerPoint -> PDF" 変換したものは、私が担当したデブキャンセッションの資料 (例えばコレ) で確認する事ができます。ソースコード部分を選択してみてください。

 現バージョン の TEAD は ANSI なテキストエディタですが、ソースコードを貼り付ける用途であれば特に不便な点はないと思います。また、Delphi 2007 以降がインストールされていない環境で TEAD を使いたい場合には "Free Edition" を使うか、Vector で購入して下さい。


ラベルを縦書きにしたい

 以下のやり方で可能です。

  1. TLabel を貼り、Caption に適当な文字列を指定。
  2. AutoSize を False に設定。
  3. かなり大きめに引き伸ばす。
  4. Font.Name に '@MS ゴシック' を指定。
  5. Font.Orientation に 2700 を指定。
  6. Allignment を taRightJustify に指定 (BiDiMode を bdRightToLeft でもいい)。
 このやり方だと長音記号 ('ー') 等も正しく縦書きされます。

 別のやり方もあります。こちらは、TLabel を使わない方法です。

  1. Microsoft PowerPoint を起動
  2. [挿入 | テキストボックス | 縦書きテキストボックス]
  3. 文字を入力。
  4. 縦書きテキストボックスを右クリック。
  5. "図として保存" で "拡張 Windows メタファイル (*.emf)"。
  6. TImage に保存した emf ファイルを読み込む。
 この方法だと、文字列の一部に部分的に装飾を施したり、文字色を変更する事ができます。

 但し、要 Microsoft PowerPoint です。古い Word / Excel には "図として保存" が存在しますので、PowerPoint と同様の事ができましたが、最近の Word / Excel ではできなくなっているようです。Word / Excel からの場合には、一旦 PowerPoint へ貼り付けて作業する必要があります。

 TLabel でなくていいのなら、Delphi 1/2 用ですが、JLLabel (TRotateLabel) を使うのが簡単かもしれません。dcr が 16bit リソースなので、32bit に変換しなくてはならないのと、あまりにも古いコンポーネントなので、Published にプロパティやメソッドを追加してやる必要がありますが、Delphi XE でも動作します。

unit JLLabel;
{==========================================================================}
{ JL's RotateLabel with 3D-effects                                         }
{                                                                          }
{ Copyright © 1996 by Jörg Lingner, Munich, Germany (jlingner@t-online.de) }
{                                                                          }
{ FREEWARE                                                                 }
{ Free to use and redistribute.                                            }
{ No warranty is given by the author, expressed or implied.                }
{                                                                          }
{ 3D-effects: from RZLABEL-component                                       }
{ Copyright © by Ray Konopka (Raize Software Solutions, Inc.)              }
{--------------------------------------------------------------------------}
{ This component works like TLabel and has 2 additional properties:        }
{                                                                          }
{ Escapement: draw text with angle (0..360 deg)                            }
{             selected font must be a TrueType!!!                          }
{                                                                          }
{ TextStyle:  draw text with 3D-effects  tsRecessed                        }
{                                        tsRaised                          }
{                                        tsNone                            }
{                                                                          }
{--------------------------------------------------------------------------}
{ Vers.  Date   Remarks                                                    }
{ 1.0  30.03.97 Initial release                                            }
{                                                                          }
{==========================================================================}
interface

uses

  WinProcs, Wintypes, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type
  TTextStyle = (tsNone, tsRaised, tsRecessed);

  TRotateLabel = class(TCustomLabel)
  private
    fEscapement: Integer;
    fTextStyle: TTextStyle;
    procedure SetEscapement(aVal: Integer);
    procedure SetTextStyle(aVal: TTextStyle);
    procedure CalcTextPos(var aRect: TRect; aAngle: Integer; aTxt: String);
    procedure DrawAngleText(aCanvas: TCanvas; aRect: TRect; aAngle: Integer; aTxt: String);
  protected
    procedure DoDrawText(var Rect: TRect; Flags: Word);
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Escapement: Integer read fEscapement write SetEscapement;
    property TextStyle: TTextStyle read fTextStyle write SetTextStyle;
    property Align;
    property Alignment;
    property Anchors;
    property AutoSize;
    property BiDiMode;
    property Caption;
    property Color;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property EllipsisPosition;
    property Enabled;
    property FocusControl;
    property Font;
    property Layout;
    property ParentBiDiMode;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ShowAccelChar;
    property ShowHint;
    property Transparent;
    property Visible;
    property WordWrap;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnMouseActivate;
    property OnMouseDown;
    property OnMouseEnter;
    property OnMouseLeave;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
    {$IF CompilerVersion >= 21.0}
    property GlowSize; // Windows Vista only
    property Touch;
    property OnGesture;
    {$IFEND}
  end;

procedure Register;

{ ========================================================================== }
implementation

procedure Register;
{ ========================================================================== }
begin
  RegisterComponents('Samples', [TRotateLabel]);
end;
{ ========================================================================== }

constructor TRotateLabel.Create(AOwner: TComponent);
{ ========================================================================== }
begin
  inherited Create(AOwner);

  fEscapement := 45;
  fTextStyle := tsRaised;
  Font.Name := 'Arial';
end;
{ ========================================================================== }

procedure TRotateLabel.SetEscapement(aVal: Integer);
{ ========================================================================== }
begin
  if fEscapement <> aVal then
    begin
      if aVal < 0 then
        begin
          while aVal < -360 do
            aVal := aVal + 360;
          aVal := 360 + aVal;
        end;
      while aVal > 360 do
        aVal := aVal - 360;
      fEscapement := aVal;
      Invalidate;
    end;
end;
{ ========================================================================== }

procedure TRotateLabel.SetTextStyle(aVal: TTextStyle);
{ ========================================================================== }
begin
  if fTextStyle <> aVal then
    begin
      fTextStyle := aVal;
      Invalidate;
    end;
end;
{ ========================================================================== }

procedure TRotateLabel.Paint;
{ ========================================================================== }
const
  Alignments: array [TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
  WordWraps: array [Boolean] of Word = (0, DT_WORDBREAK);
var
  Rect: TRect;
begin
  with Canvas do
    begin
      if not Transparent then
        begin
          Brush.Color := Self.Color;
          Brush.Style := bsSolid;
          FillRect(ClientRect);
        end;
      Brush.Style := bsClear;
      Rect := ClientRect;
      DoDrawText(Rect, DT_EXPANDTABS or WordWraps[WordWrap] or Alignments[Alignment]);
    end;
end;
{ ========================================================================== }

procedure TRotateLabel.CalcTextPos(var aRect: TRect; aAngle: Integer; aTxt: String);
{ ========================================================================== }
{ Calculate text pos. depend. on: Font, Escapement, Alignment and length     }
{ if AutoSize true : set properties Height and Width                         }
{ -------------------------------------------------------------------------- }
var
  DC: HDC;
  hSavFont: HFont;
  Size: TSize;
  x, y: Integer;
  cStr: array [0 .. 255of Char;

begin
  StrPCopy(cStr, aTxt);
  DC := GetDC(0);
  hSavFont := SelectObject(DC, Font.Handle);
  GetTextExtentPoint32(DC, cStr, Length(aTxt), Size);
  SelectObject(DC, hSavFont);
  ReleaseDC(0, DC);

  if aAngle <= 90 then
    begin { 1.Quadrant }
      x := 0;
      y := Trunc(Size.cx * sin(aAngle * Pi / 180));
    end
  else if aAngle <= 180 then
    begin { 2.Quadrant }
      x := Trunc(Size.cx * -cos(aAngle * Pi / 180));
      y := Trunc(Size.cx * sin(aAngle * Pi / 180) + Size.cy * cos((180 - aAngle) * Pi / 180));
    end
  else if aAngle <= 270 then
    begin { 3.Quadrant }
      x := Trunc(Size.cx * -cos(aAngle * Pi / 180) + Size.cy * sin((aAngle - 180) * Pi / 180));
      y := Trunc(Size.cy * sin((270 - aAngle) * Pi / 180));
    end
  else if aAngle <= 360 then
    begin { 4.Quadrant }
      x := Trunc(Size.cy * sin((360 - aAngle) * Pi / 180));
      y := 0;
    end;
  aRect.Top := aRect.Top + y;
  aRect.Left := aRect.Left + x;

  x := Abs(Trunc(Size.cx * cos(aAngle * Pi / 180))) + Abs(Trunc(Size.cy * sin(aAngle * Pi / 180)));
  y := Abs(Trunc(Size.cx * sin(aAngle * Pi / 180))) + Abs(Trunc(Size.cy * cos(aAngle * Pi / 180)));

  if AutoSize then
    begin
      Width := x;
      Height := y;
    end
  else if Alignment = taCenter then
    begin
      aRect.Left := aRect.Left + ((Width - x) div 2);
    end
  else if Alignment = taRightJustify then
    begin
      aRect.Left := aRect.Left + Width - x;
    end;
end;
{ ========================================================================== }

procedure TRotateLabel.DrawAngleText(aCanvas: TCanvas; aRect: TRect; aAngle: Integer; aTxt: String);
{ ========================================================================== }
{ Draw text with FontIndirect (angle -> escapement)                          }
{ -------------------------------------------------------------------------- }
var
  LFont: TLogFont;
  hOldFont, hNewFont: HFont;
begin
  CalcTextPos(aRect, aAngle, aTxt);

  GetObject(aCanvas.Font.Handle, SizeOf(LFont), Addr(LFont));
  LFont.lfEscapement := aAngle * 10;
  hNewFont := CreateFontIndirect(LFont);
  hOldFont := SelectObject(aCanvas.Handle, hNewFont);

  aCanvas.TextOut(aRect.Left, aRect.Top, aTxt);

  hNewFont := SelectObject(aCanvas.Handle, hOldFont);
  DeleteObject(hNewFont);
end;
{ ========================================================================== }

procedure TRotateLabel.DoDrawText(var Rect: TRect; Flags: Word);
{ ========================================================================== }
{ Draw the text normal or with angle and with 3D-effects                     }
{                                                                            }
{ 3D-effects: RZLABEL-component                                              }
{ (c) by Ray Konopka (Raize Software Solutions, Inc.)                        }
{ -------------------------------------------------------------------------- }
var
  Text: String;
  TmpRect: TRect;
  UpperColor: TColor;
  LowerColor: TColor;
  cStr: array [0 .. 255of Char;
begin
  Text := Caption;
  StrPCopy(cStr, Text);

  if (Flags and DT_CALCRECT <> 0and
     ((Text = ''or ShowAccelChar and (Text[1] = '&'and (Text[2] = #0)) then
    Text := Text + ' ';

  if not ShowAccelChar then
    Flags := Flags or DT_NOPREFIX;
  Canvas.Font := Font;

  UpperColor := clBtnHighlight;
  LowerColor := clBtnShadow;

  if fTextStyle = tsRecessed then
    begin
      UpperColor := clBtnShadow;
      LowerColor := clBtnHighlight;
    end;

  if fTextStyle in [tsRecessed, tsRaised] then
    begin
      TmpRect := Rect;
      OffsetRect(TmpRect, 11);
      Canvas.Font.Color := LowerColor;
      if fEscapement <> 0 then
        DrawAngleText(Canvas, TmpRect, fEscapement, Text)
      else
        DrawText(Canvas.Handle, pChar(Text), Length(Text), TmpRect, Flags);

      TmpRect := Rect;
      OffsetRect(TmpRect, -1, -1);
      Canvas.Font.Color := UpperColor;
      if fEscapement <> 0 then
        DrawAngleText(Canvas, TmpRect, fEscapement, Text)
      else
        DrawText(Canvas.Handle, pChar(Text), Length(Text), TmpRect, Flags);
    end;

  Canvas.Font.Color := Font.Color;

  if not Enabled then
    Canvas.Font.Color := clGrayText;

  if fEscapement <> 0 then
    DrawAngleText(Canvas, Rect, fEscapement, Text)
  else
    DrawText(Canvas.Handle, pChar(Text), Length(Text), Rect, Flags);
end;
{ ========================================================================== }

end.

 上記コードは少なくとも BDS 2006 ~ XE で動作します (GlowSize 等の一部のプロパティは正しく機能しません)。


Microsoft Office のオートシェイプを画像として貼り付けたい

 ちょっと見栄えのするフォームを作ろうとする場合には、Office のオートシェイプで描画したものをそのまま貼り付けると楽です。

  1. Microsoft PowerPoint を起動
  2. 適当にオートシェイプを貼り付ける。
  3. オートシェイプを右クリック。
  4. "図として保存" で "拡張 Windows メタファイル (*.emf)"。
  5. TImage に保存した emf ファイルを読み込む。
 但し、要 Microsoft PowerPoint です。古い Word / Excel には "図として保存" が存在しますので、PowerPoint と同様の事ができましたが、最近の Word / Excel ではできなくなっているようです。Word / Excel からの場合には、一旦 PowerPoint へ貼り付けて作業する必要があります。

 こうして貼られた画像は emf 形式なので、キレイに拡大縮小できます。


TPrinter に罫線引くのがメンドイ

 QuickReport や RaveReports は最初は簡単なのですが、ちょっと凝った事をしようとするととても面倒な事になります。TPrinter で印刷するコードを記述した方が結局は早かったりします...が、いかんせん罫線を引くのはとても面倒です。

 罫線の多い帳票は Excel で作って、差し込み印刷を行いましょう。

  1. Microsoft Excel を起動
  2. 適当に帳票をデザインする。
  3. "スプールファイル変換ツール" で、EXCEL から emf 画像を得る。
  4. TPrinter.Canvas に保存した emf ファイルを読み込む。
  5. 固定でない部分だけ、TPrinter へ書き込む。
 emf なので、A4 -> B4 拡大印刷とかも簡単です。「直接 EXCEL を操作した方が早い?」いえいえ、この方法だとアプリケーション実行環境には Office が必要ないのです。


 BACK