3

DBGrid で True/False を Yes/No に置き換えようとしています。以下のコードはほとんど動作します:

procedure TDatamodule1.DBGridDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

  var
    sText : String;

begin
  if (UpperCase(Column.Field.FieldName) = UpperCase('Approved')) or
     (UpperCase(Column.Field.FieldName) = UpperCase('Obsolete')) then
    begin
      if Column.Field.Value = True then
        sText := 'Yes'
      Else
        If Column.Field.Value = False Then
          sText := 'No'
        Else
          sText := '';
      (Sender as TDBGrid).Canvas.FillRect(Rect);
      (Sender as TDBGrid).Canvas.TextRect(Rect, Rect.Left+3, Rect.Top+2, sText);
    end;
end;

キーボードのカーソルキーを使用してグリッド内を移動するまで、これは機能しているように見えました。フォーカスのあるセルには、常に True と Yes、または False と No が重ねて表示されます。フォーカスのあるセルにデフォルトの True/False ラベルが描画されないようにするにはどうすればよいですか? グリッドの他のすべてのセルは完全です。

編集: グリッドが読み取り専用に設定されていることに言及できませんでした。問題は選択されたものとフォーカスされているものの両方にあることに気付きました。前もって感謝します。

4

4 に答える 4

11

簡単な解決策は、ブールフィールドを設定することDisplayValuesです:

MyField.DisplayValues := 'Yes;No';
于 2013-09-10T09:35:48.743 に答える
0

あなたは間違ったレベルの抽象化で作業していると思います。2 つの計算列 (以下の例では AFlag と OFlag) を使用し、clientdataset の OnCalcFields イベントを定義します。以下のコードは、「qCpap」というデータセットに添付されています。

procedure TView.qCpapCalcFields(DataSet: TDataSet);
begin
 if qCpapApproved.AsBoolean 
  then qCpapAFlag.AsString:= 'Yes'
  else qCpapAFlag.AsString:= 'No';

 if qCpapObsolete.AsBoolean 
  then qCpapOFlag.AsString:= 'Yes'
  else qCpapOFlag.AsString:= 'No';
end;

ちなみに、文字列定数に対して 'uppercase' 関数を使用しても意味がありません。文字列を自分で大文字で書くこともできます。

于 2013-09-10T03:00:44.913 に答える