4

Delphi XE2 で、グリッドが別の非モーダル フォームにフォーカスを失ったときに InPlaceEditor のハイライトを StringGrid に保持する方法はありますか?

私の現在の StringGrid オプションは次のとおりです。

ここに画像の説明を入力

そうでない場合は、以下のコードを使用して、フォーカスを失った後に現在のセルの強調表示を保持することを望んでいましたが、現在のセルではなくなったときにセルを強調表示したままにすることに問題があります。

選択されていないセルの色を元に戻すには、以下のコードに「else」を追加する必要がありますか? 注意事項はありますか?

  procedure TForm1.sgMultiDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);    
  begin
    if (ACol = sgMulti.Col) and (ARow = sgMulti.Row) then
    begin
      sgMulti.Canvas.Brush.Color := clYellow;
      sgMulti.Canvas.FillRect(Rect);  
      sgMulti.Canvas.TextRect(Rect, Rect.Left, Rect.Top, sgMulti.Cells[ACol, ARow]); 
      if gdFocused in State then
        sgMulti.Canvas.DrawFocusRect(Rect); user
    end;
  end; { sgMultiDrawCell}

編集: 以下のスクリーン キャプチャは、現在の動作を明確に示しています。フォーカスを失ったときに現在のセルを下の画面キャプチャよりも明確にしたい

ここに画像の説明を入力

4

1 に答える 1

6

オプションを有効にして、常に表示されるエディターだけを強調表示する場合は、プロパティgoAlwaysShowEditorへのアクセスが必要です。これは、文字列グリッド クラスをサブクラス化し、既定のコントロール クラスInplaceEditorであるインプレース エディターの色を変更する必要があります。このコードでは、文字列グリッドがフォーカスされているかどうかに応じて、インプレース エディターの色を変更する方法が示されています。TCustomMaskEdit

type
  TStringGrid = class(Grids.TStringGrid)
  private
    procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
    procedure CMExit(var Message: TCMExit); message CM_EXIT;
  protected
    function CreateEditor: TInplaceEdit; override;
  end;

implementation

{ TStringGrid }

procedure TStringGrid.CMEnter(var Message: TCMEnter);
begin
  inherited;
  if Assigned(InplaceEditor) then
    TMaskEdit(InplaceEditor).Color := $0000FFBF;
end;

procedure TStringGrid.CMExit(var Message: TCMExit);
begin
  inherited;
  if Assigned(InplaceEditor) then
    TMaskEdit(InplaceEditor).Color := $0000A6FF;
end;

function TStringGrid.CreateEditor: TInplaceEdit;
begin
  Result := inherited;
  if Focused then
    TMaskEdit(Result).Color := $0000FFBF
  else
    TMaskEdit(Result).Color := $0000A6FF;
end;

そして、フォーカスされたグリッド状態とフォーカスされていないグリッド状態の結果:

ここに画像の説明を入力

于 2012-08-12T18:41:09.117 に答える