2011年12月1日木曜日

Excel 2007 以降のバージョンで xls 形式で保存する

|If Application.Version > 11 Then
| wbook.SaveAs Filename:=wFullPath, FileFormat:=56
|Else
| wbook.SaveAs Filename:=wFullPath
|End If

2011年6月14日火曜日

【Delphi】メッセージダイアログをフォーム中央に表示する

メッセージダイアログをフォームとして受取り、加工した後に表示する。
更新 20230724 : Windows11に対応
function TForm1.ShowConfirmMsg(_msg: string): TModalResult;
  var
    frmMsg: TForm;
begin
  frmMsg := CreateMessageDialog(_msg, mtConfirmation, [mbOK, mbCancel]);
  with frmMsg do begin
    try
      Self.InsertComponent(frmMsg);
      Position := poOwnerFormCenter;
      ShowModal;
    finally
      Free;
    end;
  end;
end;

(久しぶりに使ってみたら文法エラーが出たので Self.InsertComponent を追加しました。)

2011年6月11日土曜日

【Delphi, Firebird】エンベデッド・ドライバ

Firebird エンベデッド・ドライバの配布は簡単。

1.Firebird はサーバ版と同じバージョンのエンベデッド版をダウンロードし、以下のファイルをアプリケーションと同じフォルダに置く。
fbclient.dll ← fbembed.dllの名前を変更
icudt30.dll
icuin30.dll
icuuc30.dll

以下は、必要な場合のみ。
ib_util.dll
firebird.conf
firebird.msg
udf/
fbudf.dll

2.接続は Devart の dbx ドライバを使用。
dbexpida40.dll
dbexpida30.dll(Delphi 2006アプリケーションでは上記の代わりに)

備考:
1)fbembed.dll が Firebird の本体でsる。
2)fbembed.dll のままで何故いけないのか? どこかに gds32.dll にせよと書いてあったが、これもダメ。どこかで定義しているはずなのだが。

2011年4月9日土曜日

【Delphi】フォームを使用する DLL の終了処理

DLL でも通常のアプリケーションと同様に Form を表示することができる。
ただし、フォームの Owner となるコンポーネントが渡せないので、自分で Free してやる必要がある。
DLL の解放時に終了処理を行なうには以下のようにする。


// DLL のメインプログラム

library DllTest

uses
・・・,

Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
  savDllProc: procedure(Reason: Integer);

procedure LibExit(Reason: Integer);
begin
  //クラス手続き FreeMe はフォームが Create されていれば解放する。
  if (Reason = DLL_PROCESS_DETACH) then
    TForm1.FreeMe(nil);
  // 保存された終了手続きがあれば呼び出す
  if Assigned(savDllProc) then
    savDllProc(Reason);  
end;

procedure ShowMyForm: stdcall;
begin
  //TForm1 のクラス手続き Execute はフォームを表示する。
  TForm1.Execute(nil);
end;

exports
  ShowMyForm;

begin
  savDllProc := DllProc; // 終了手続きを保存
  DllProc := @LibExit;  // LibExit を終了手続きとして設定
end.

*上記で呼び出す Form のメソッドは以下のようなものを想定 :

class procedure TForm1.Execute(Sender: TObject);
begin
  if (Form1 = nil) then begin
    Form1:=TForm1.Create(nil);
  end;
  with Form1 do begin
    ShowModal;
  end;
end;

class procedure TForm1.FreeMe(Sender: TObject);
begin
  if (Form1 <> nil) then begin
    Form1.Free;
    Form1 := nil;
  end;
end;

2011年4月7日木曜日

DLL から Excel vba へ文字列を返す

'** Excel vba の定義 **
Function StrTest() As String
Dim wMsg As String
Dim wLen As Long

wMsg = Space(256) '作業領域を確保する
wLen = SkStringTest(wMsg) '文字列を受け取る
StrTest = Left(wMsg, wLen) '有効な文字だけを取り出して返す
End Function


{** delphi DLL の定義 **}
function SkStringTest(aStr: PAnsiChar): integer; stdcall;
// vba の String は PAnsiChar で受ける
var
wAnsiStr: AnsiString;
begin
wAnsiStr := 'Hello, Excel!'; //定数の場合は実際はコンパイラが変換してくれるが。
StrCopy(aStr, PAnsiChar(wAnsiStr));
Result := StrLen(aStr);
end;