ラベル Delphi の投稿を表示しています。 すべての投稿を表示
ラベル Delphi の投稿を表示しています。 すべての投稿を表示

2015年7月28日火曜日

【Delphi】圧縮・解凍

Mr.X-Ray の下記のサイトに 7-zip32.dll を使用する方法が詳しく載っている。
http://mrxray.on.coocan.jp/Delphi/plSamples/732_Archiver7-ZIP32.htm#03

7-zip のコマンドはパラメタの設定がややこしい。
Mr.X-Ray のオリジナルではサブフォルダーも処理するが、サブフォルダーを無視するには「-r」パラメタを削除する。
またパスワードを付けるには「-pXXXXXXXX」を追加する。

2014年9月13日土曜日

【Delphi, Firebird】今さらながら、Devartのドライバでdbexpressに接続

設計時には問題なく接続できていたのに、実行したら
「不明なドライバです: DevartInterBase」
と出る。
動いているプログラムと見比べても悪い所がなかなか見つからない。

uses に DbxDevartInterbase を追加しなければいけなかったのだ。3時間ほども無駄にしてしまった。
Readme.html にはそんな記述がないが、最初に見つけたときはどうしたのだったか。

2014年7月28日月曜日

[Delphi]StringGrid の列幅を設計時の設定する

StringGrid は個々の列幅を設定するプロパティがないので、通常は実行時の OnCreate 等で
|  with StringGrid1 do begin
|    ColWidths[0] := 24;  ColWidths[1] := 64;  ・・・
|  end;
のように列幅の設定をしていると思うが、自分で書いたプログラムでは設計時にちゃんと列幅が設定されているではないか。どうやったのか思い出せなくてググってみたが適切な記事にヒットしない。出来ている StringGrid をテキスト表示してみたらわかりました。フォームをテキスト表示にしてエディタで編集するだけ。
| object StringGrid1: TStringGrid
|   Left = xxx
|   ・・・
|   ColWidths = ( 64 80 240 32 ・・・)  ← のように!
| end

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;