|If Application.Version > 11 Then
| wbook.SaveAs Filename:=wFullPath, FileFormat:=56
|Else
| wbook.SaveAs Filename:=wFullPath
|End If
2011年12月1日木曜日
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 にせよと書いてあったが、これもダメ。どこかで定義しているはずなのだが。
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 の解放時に終了処理を行なうには以下のようにする。
*上記で呼び出す 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;
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;
登録:
投稿 (Atom)