想在一个pagecontrol下动态生成tabsheet,并动态在tabsheet加入一个dbgrid控件,怎样做啊?或者在tabcontrol中动态生成tab标签,并动态在tab下加入一个dbgrid控件。我是想建1个pagecontrol,然后打开excel文件后,就将excel中所有sheet名字加载到tabsheet中,并动态在tabsheet加入dbgrid控件,把excel数据导入进去。怎样做到啊?动态生成tabsheet容易些,可动态在tab下加入一个dbgrid控件,不知道怎么做

解决方案 »

  1.   

    不过又出现了个问题,因为tabsheet和tabsheet上的dbgrid都是动态生成的。我想对选中的某个tabsheet(也就是pagecontrol.Activepage)上的dbgrid进行操作,怎样选中呢?
    dbgrid=pagecontrol.Activepage.dbgrid不对,dbgrid.parent=pagecontrol.Activepage也不行,运行就死。
      

  2.   

    其实你要建立dbGrid和PageControl.TabSheet之间的父子关系。或者用索引数组两建立对dbGrid的管理。这样当你选种某页的时候就可以索引到对应的dbGrid.另外我觉得你没必要用一个dbGrid在TabSheet之间转来转去。可以建立多个dbGrid
      

  3.   

    能举例吗?我是动态建立多个dbGrid的。怎样建立dbGrid和PageControl.TabSheet之间的父子关系啊
      

  4.   

    看你的描述,每个动态生成的TabSheet上只有一个TDBGrid,那么可以用以下代码:procedure TForm1.Button1Click(Sender: TObject);
    var
        dbgrd: TDBGrid;
        i: Integer;
    begin
        dbgrd := nil;
        with PageControl1.ActivePage do
        begin
            for i := 0 to ComponentCount - 1 do
            begin
                if Components[i].ClassNameIs('TDBGrid') then
                    dbgrd := Components[i] as TDBGrid;
            end;
        end;
        if dbgrd <> nil then
            // 添加自己代码
    end;
      

  5.   

    这段代码包含了动态创建部分,看看有用否?procedure TForm1.OpenSpeedButtonClick(Sender: TObject);
    var
      i, j, k: Integer;
    //  grid: TDBGrid;  Value: Variant;begin  if FileOpenDialog.Execute then
      begin
     {define a file name with data}
        LoadedFileName := FileOpenDialog.FileName;    for i := suiPageControl1.PageCount - 1 downto 0 do
          suiPageControl1.Pages[i].Free;    with TMSExcel.Create(Self) do
        try
          LoadFromFile(LoadedFileName);      for k := 0 to Sheets.Count - 1 do
          begin
            sheet := Sheets.SpreadSheet(k);
            if Assigned(sheet) then
            begin
              {create a tab and grid for each sheet in workbook}
              suiPageControl1.Font.Size := 9;
              tab := TsuiTabSheet.Create(suiPageControl1);          tab.Caption := sheet.Caption;
              tab.PageControl := suiPageControl1;          grid[k] := TsuiStringGrid.Create(tab);
              grid[k].DefaultRowHeight := 21;
              grid[k].DefaultColWidth := 80;
              grid[k].Font.Size := 9;
              grid[k].Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goEditing];
              grid[k].Parent := tab;
              grid[k].Align := alClient;          grid[k].RowCount := sheet.Cells.UsedRowCount + 1;
              grid[k].ColCount := sheet.Cells.UsedColCount + 1;          for i := 1 to sheet.Cells.UsedRowCount + 1 do
              begin
                for j := 1 to sheet.Cells.UsedColCount + 1 do
                begin
                  Value := sheet.Cells.GetValue(j - 1, i - 1);
                  if (VarType(Value) = varBoolean) then
                  begin
                    if Value then
                      grid[k].Cells[j, i] := 'True'
                    else
                      grid[k].Cells[j, i] := 'False'
                  end
                  else
                    grid[k].Cells[j, i] := VarToStr(Value);
                end;
              end;
            end
          end;    finally
          Free
        end;
      end;
      IsOpenFile := True;
    end;