我想实现在StringGrid上的某个单元格上点击一下,就在对应的单元里打上√,本来有√的清空。我在它的OnDrawCell里写一了一段代码,出现的问题是,不断的打√然后清空,单元格不断闪烁。
procedure TFrm_select.sg1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   if (Acol <> 0) and (ARow <> 0) then
   begin  if ARow mod 2 = 0 then
  begin
     sg1.Canvas.Brush.Color := clSkyBlue;
     sg1.Canvas.Brush.Style := bsSolid;
     sg1.Canvas.FillRect(Rect);
  end;    if gdSelected in State then
      if  trim(sg1.Cells[ACol,ARow]) = '' then
    sg1.Cells[ACol,ARow] := '√'
  else
    sg1.Cells[ACol,ARow] := '' ;  
  end;
end;
麻烦高手指点一下,应该怎么写。

解决方案 »

  1.   

    楼主你这写法有问题吧
    sg1.Cells[ACol,ARow] := '' ;
    这不是互相排斥吗?
      

  2.   

    不能在OnDrawCell事件中改变StringGrid.cells的值,那样会造成死循环,改变 cells的值会再次触发OnDrawCell
      

  3.   

    哦,那这种单击某个单元格要改变StringGrid.cells的值应该怎么办,写在什么事件里?
      

  4.   

    用了两个事件,效果居然达到了。
    procedure TFrm_select.sg1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);begin
     if  trim(sg1.Cells[ACol,ARow]) = '' then
      hasvalue := False
      else
       hasvalue := true ;  sg1SetEditText(self, ACol, ARow,'');
      end;
    procedure TFrm_select.sg1SetEditText(Sender: TObject; ACol, ARow: Integer;
      const Value: String);
    begin
        if  not hasvalue then
            sg1.Cells[ACol,ARow] := '√'
         else
            sg1.Cells[ACol,ARow] := '' ;end;
      

  5.   

    楼主那样,真是多此一举了.procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    begin
     if StringGrid1.Cells[ACol,ARow]='√' then
       StringGrid1.Cells[ACol,ARow]:=''
     else
       StringGrid1.Cells[ACol,ARow]:='√';
    end;不就可以了,呵,给我分吧