« ☆『コンピュータ・アルゴリズム事典』サポートページ | トップページ | ☆TStringGridでの縦書き(日本語) »

☆BDE Table.Locateで・・・。

ずいぶん昔に作ったBDEを使ったプログラムをDelphi2007で再コンパイルして仕事をしていたところ、 「この操作は行えません」というエラーメッセージが頻繁に表示されるようになりました。

そこでシンプルなサンプルを作って、原因を探したところ、Locateメソッドの検索文字がフィールドサイズより長い場合にエラーになっていました。(そんな仕様だっけ?)

又、この問題とは別に、TEditのMaxLengthがランタイムテーマの影響を受けることが確認できました。 検索文字入力用Editには、元々MaxLengthをフィールド長さで設定してあり、今まで検索文字がフィールドサイズを超えることがなかったのですが、ランタイムテーマの影響で、バイト数から文字数扱いになってしまい、エラーが起こったようです。

今回は、文字長さをバイト数で計算して、フィールド長さ以下であることを確認の上、Locateメソッドに渡すことにより、この問題を解決しました。

※テスト用プログラムです。データベースは、DBDEMOSのemployee.dbを使っています。
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;

type
  TForm1 = class(TForm)
    Table1: TTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  S1, S2: String;
begin
  S1 := Edit1.Text;
  S2 := Edit2.Text;
  Table1.Locate('LastName;FirstName',VarArrayOf([S1, S2]), [loPartialKey]);
end;

end.

Locate

|

« ☆『コンピュータ・アルゴリズム事典』サポートページ | トップページ | ☆TStringGridでの縦書き(日本語) »