如何防止在delphi 7中编辑tstringgrid中的unmpty单元格?

时间:2014-02-28 01:31:52

标签: delphi

enter image description here我遇到了问题,需要你的帮助 我打算玩数独游戏。在我的Stringgrid中,我在[grid1.cells [8,8]:= inttostr(2);之前用数字填充了一些单元格。 grid1.cells [2,5]:= inttostr(9);等等]和数字的文字字体颜色是黑色的。现在我希望玩家不能更改(编辑)以前的值,只能添加到空单元格(只能更改自己的值)。 插入单元格的值必须是不同的文本字体颜色(exp:clRed) 在这两种情况下我需要帮助。 提前致谢 。

2 个答案:

答案 0 :(得分:6)

没有公开的方法来中断单元格编辑过程,但您可以创建一个TStringGrid子类并覆盖其CanEditShow受保护的方法。在这个控制子类中,您可以例如制作一个事件来控制是否创建就地编辑器。

以下插入器类介绍{I}事件,该事件将在创建就地编辑器之前触发,并允许您通过其OnCanEdit参数决定是否要创建它:

CanEdit

此示例显示如何仅允许对行和列索引大于2的单元格进行编辑,这不是您的情况,但我确定您了解该怎么做:

type
  TCanEditEvent = procedure(Sender: TObject; Col, Row: Longint;
    var CanEdit: Boolean) of object;

  TStringGrid = class(Grids.TStringGrid)
  private
    FOnCanEdit: TCanEditEvent;
  protected
    function CanEditShow: Boolean; override;
  public
    property OnCanEdit: TCanEditEvent read FOnCanEdit write FOnCanEdit;
  end;

implementation

{ TStringGrid }

function TStringGrid.CanEditShow: Boolean;
begin
  Result := inherited CanEditShow;

  if Result and Assigned(FOnCanEdit) then
    FOnCanEdit(Self, Col, Row, Result);
end;

答案 1 :(得分:1)

尽管这个问题已有4年以上的历史了,但我正在回答,因为最初的答案并非绝对正确。实际上,有 种防止编辑特定单元格的方法:

您可以设置TStringGrid OnSelectCell的CanSelect参数:

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Options := StringGrid1.Options+[goEditing];

  StringGrid1.Cells[2,3] := '3';
  StringGrid1.Objects[2,3] := Pointer(1);
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  if StringGrid1.Objects[ACol,ARow]<>nil then
    CanSelect := false;
end;

可以通过为相应的Objects设置一个阻塞值来完成阻塞一个单元格的决定