簡體   English   中英

如何防止在delphi 7中編輯tstringgrid中的unmpty單元格?

[英]How to prevent editing unempty cells in tstringgrid in delphi 7?

在此輸入圖像描述 我有一個問題,需要你的幫助我將在數獨游戲上工作。 在我的Stringgrid中,我在[grid1.cells [8,8]:= inttostr(2);之前用數字填充了一些單元格。 grid1.cells [2,5]:= inttostr(9); 等等]和數字的文字字體顏色是黑色的。 現在我希望玩家不能更改(編輯)以前的值,只能添加到空單元格(只能更改自己的值)。 插入到單元格中的值必須是不同的文本字體顏色(exp:clRed)我在這兩種情況下需要幫助。 提前致謝 。

有中斷單元格編輯的過程中沒有公開的方式,但你可以做一個TStringGrid子類,並覆蓋其CanEditShow保護的方法。 在此控制子類中,您可以例如創建一個事件來控制是否創建就地編輯器。

以下內插器類介紹OnCanEdit事件,該事件將在創建OnCanEdit編輯器之前觸發,並允許您通過其CanEdit參數決定是否要創建它:

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;

此示例顯示如何僅允許對行和列索引大於2的單元格進行編輯,這不是您的情況,但我確定您了解該怎么做:

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
  private
    procedure StringGridCanEdit(Sender: TObject; Col, Row: Longint; 
      var CanEdit: Boolean);
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.OnCanEdit := StringGridCanEdit;
end;

procedure TForm1.StringGridCanEdit(Sender: TObject; Col, Row: Integer;
  var CanEdit: Boolean);
begin
  // to the CanEdit parameter assign True if you want to allow the cell
  // to be edited, False if you don't
  CanEdit := (Col > 2) and (Row > 2);
end;

雖然這個問題已經超過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;

阻止單元格的決定可以通過為相應的對象設置阻塞值來完成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM