Delphi Tips 
-----------------------------

0222  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/08/28 西坂良幸 rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/08/28 西坂良幸 編集
データコントロールのDataLinkオブジェクトを取得する方法(ReadOnlyプロパティのバグの解決法)


VCLでは、DataControlのFDataLinkは、プロパティになっていないので、アクセスできませんが、
DataControlにCM_GETDATALINKメッセージを投げる事で取得(参照)できます。[Delphi-ML:41387]田原
多重継承ができないので、こうなっているそうです。

これによって、MLでも多い質問ですが、いわゆる「極東仕様」問題、すなわち、TDBEdit の ReadOnly と継承元の TCustomEdit のReadOnly の同期がとれないバグを解決することができます。[Delphi-ML:41051]藤中

以下は、藤中さんの例示コード(省略部あり)です。

// このデータコントロール(フィールド対応)は編集可能か?
function IsCanModifyFieldDataControl(Control: TControl) : Boolean;
var
  DataLink : TFieldDataLink;
begin
  // データリンクを取得
  DataLink := TFieldDataLink(Control.Perform(CM_GETDATALINK,0,0));
  if (DataLink = nil) then
     DatabaseError('CM_GETDATALINK は無効', Control);
  // データリンクが編集可能かどうか調べる
  Result := DataLink.CanModify and
          ( DataLink.DataSource.AutoEdit or
           (DataLink.DataSource.State in [dsInsert, dsEdit]) );
end;

// たとえば、Table1のAfterScrollイベントなどで動的にReadOnlyを変更する

type TCustomEditCracker = class(TCustomEdit);

procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
var
  Flg :Boolean;
begin
  // 条件
  if DataSet.FieldByName('制御フラグ').AsString = '1' then
    Flg := True
  else
    Flg := False;
  // 以下でReadOnlyを変更
  DBEdit1.ReadOnly := Flg;
  if (Flg = False) then
  begin
    TCustomEditCracker(DBEdit1).ReadOnly :=
               not IsCanModifyFieldDataControl(DBEdit1);
  end
  else begin
    TCustomEditCracker(DBEdit1).ReadOnly := True;
  end;
end;

参照: [Delphi-ML:41387] [Delphi-ML:17611] [Delphi-ML:41051] <データベース> <バグ> <コンポーネント > <DataControls>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp