我在PageControl1上加了多个TabSheet,每个TabSheet上都有一个StringGrid, 我用的是第三方控件AdvStringGrid,我在点击增加一行的菜单时在当前StringGrid上增加一行。执行如下的代码:
procedure TfmHistoryForecastRecord.Add1Click(Sender: TObject);
var
  iNo : string;
  i, iCol : integer;
begin   
  (sender as TAdvStringGrid).RowCount := (sender as TAdvStringGrid).RowCount + 1;  iNo := sNo;
  Delete(iNo,Length(Trim(iNo)) - 1, 2);
  iNo := IntToStr(StrToInt(iNo) + 1);
  (sender as TAdvStringGrid).Cells[0, (sender as TAdvStringGrid).RowCount - 1] := iNo + '期';
  sNo :=  iNo + '期';  blCanEdit := True;
  Save1.Enabled := blCanEdit;  (sender as TAdvStringGrid).Cells[2, (sender as TAdvStringGrid).RowCount - 1] := '';  iCol := 4;
  for i := 0 to sSection.Count - 1 do
    if iCol < (sender as TAdvStringGrid).ColCount then
    begin
      (sender as TAdvStringGrid).Cells[iCol, (sender as TAdvStringGrid).RowCount - 1] := '';
      iCol := iCol + 3;
    end;
  end;
编译可以通过,但在执行的时候报错:Invalid class typecast,请问我如何实现这一功能呢。

解决方案 »

  1.   

    原则问题:
    sender 不是能随意的转换为你想要的类的.在你的说明中,你的代码是写在的菜单项的click事件中,那你的sender 就只能
    sender as TMenuItem,而不能(sender as TAdvStringGrid)就是这个点击事件,不是TAdvStringGrid触发的,而是菜单触发的.
      

  2.   

    明白这个原因吧,,如果你想要sender as TAdvStringGrid),那就必须是在TAdvStringGrid的事件中写,然后别的TAdvStringGrid,就可以共用这个事件