我遇到了问题,需要你的帮助 我打算玩数独游戏。在我的Stringgrid中,我在[grid1.cells [8,8]:= inttostr(2);之前用数字填充了一些单元格。 grid1.cells [2,5]:= inttostr(9);等等]和数字的文字字体颜色是黑色的。现在我希望玩家不能更改(编辑)以前的值,只能添加到空单元格(只能更改自己的值)。 插入单元格的值必须是不同的文本字体颜色(exp:clRed) 在这两种情况下我需要帮助。 提前致谢 。
答案 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设置一个阻塞值来完成阻塞一个单元格的决定