修改StringGrid的Paint行为,在Onpaint事件里添加自己的代码,在代码中可判断Cell有无值再决定是否生成TEdit,生成的TEdit除指明必需的参数之外还必须指明其Parent,否则不会正确显示。最后记住释放掉动态生成的对象。

解决方案 »

  1.   

    我天天都玩StringGrid, 这个太容易了。  拿分来就是了。
    在StringGrid 的 OnDrawCell 事件中加如下代码   var MyRect :TRect ;   
    begin   
       with StringGrid1 do   
       begin   
          MyRect := CellRect(iX,iY) ;   
          Edit1.SetBounds(MyRect.Left + Left + 1,MyRect.Top+Top+2,   
              MyRect.Right - MyRect.Left,MyRect.Bottom - MyRect.Top);   
            Edit1.Text := Cells[Col,Row];   
       end   
    end;
      

  2.   

    lkj99(永动机) (
    你的那个edit1最后还要释放吗?他自己可以释放吗?
    ===============================================================
    CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!
    Http://www.ChinaOK.net/csdn/csdn.zip
    http://www.csdn.net/expert/topic/573/573604.xml
    ★  浏览帖子速度极快! ★  多个帖子界面。 ★  保存帖子html格式★ 定时检测帖子更新。★  直接发贴、回复★  采用XML接口,支持自定义显示帖子数量。★浏览历史记录。 ★
      

  3.   

    //==============================================================================
    //动态创建控件******************************************************************
    //==============================================================================
    function DynaCreateComponent(Owner: TComponent; CompType: TControlClass; CompName: String; Left,Top,Width,Height:Integer): TControl;
    begin
      if (Owner.FindComponent(CompName)<>nil) and not(Owner.FindComponent(CompName) is TControl) then
      begin
        Result := nil;
        exit;
      end;
      Result := Owner.FindComponent(CompName) as TControl;
      if Result=nil then
      begin
        Result := CompType.Create(Owner);
        with Result do
        begin
          if Owner is TwinControl then
          begin
            SetBounds(Left,Top,Width,Height);
            Parent := TwinControl(Owner);{如果是可视构件,则显示之}
            if Owner is TForm then TForm(Owner).ActiveControl := TWinControl(Result);{设置窗口焦点}
          end;
        end;
        Result.Name := CompName;
      end
      else {Result<>Nil}
      if not(Result is CompType) then
      begin
        Result := nil;
        Exit;
      end;
      Result.Visible := True;
    end;
    { 对于未知数量的控件组,利用TList
      var ControlList: Tlist; CreateNum: integer;
      const CreateClass : TControlClass = TButton;//可以任意修改TControlClass = TEdit或TPanel等。效果一样。
      var i:integer; APoint: Pointer;
      ControlList := TList.Create;
      ControlList.Clear;
      CreateNum := 10;
      for i:=1 to CreateNum do
          begin
            APoint := Pointer(DynaCreateComponent(self,CreateClass,'Button_' + IntToStr(i),0,i*20+1,60,20));//创建
            ControlList.Add(APoint);
          end;
      TButton(ControlList.Items[i]).Caption := 'XXXX';}
      

  4.   

    to  LKJ99(永动机):
    StringGrid 表格打印怎么样实现?