怎样控制某一列的是否显示?
象管家婆v9.0和胜天进销存v2004版本中,可以随意的控制某一列是否显示?
每个窗口里面都有一个设置。
麻烦给个好的思路。

解决方案 »

  1.   

    一个简单的例子,你试着改改 ^_^
    --------------------------------
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Menus, Grids, DBGrids;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        PopupMenu1: TPopupMenu;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure ItemClick(Sender :TObject);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      i :Integer;
      it :TMenuItem;
    begin
      for i:=0 to DBGrid1.Columns.Count-1 do
      begin
        it := TMenuItem.Create(nil);
        it.Caption := DBGrid1.Columns.Items[i].Title.Caption;
        it.OnClick := ItemCLick;
        it.Checked := True;
        PopupMenu1.Items.Add(it);
      end;
    end;procedure TForm1.ItemClick(Sender: TObject);
    var
      i :Integer;
    begin
      if TMenuItem(Sender).Checked then
      begin
        ShowMessage( TMenuItem(Sender).Caption); 
        //修改此处!
      end;
    end;end.
      

  2.   

    to Kevin_Lmx(繁华阅尽) 
    好像不行
      

  3.   

    你可以建个表存储sql语句(语句可以选择列的啊!例:select 列1,列6 from table),这让你就可以随意在软件上控制该列是否显示了。在用户设置的时候你只要把表里的sql语句改了就可以了。
      

  4.   

    dbgrid1.Columns.Items[3].Visible:=false;//隐藏第四列
    dbgrid1.Columns.Items[3].Visible:=true;//取消隐藏
    //这样不行吗.....
      

  5.   

    这个最好是你必须先知道有多少列的情况下使用
    dbgrid1.Columns.Items[a].Visible:=false;
    dbgrid1.Columns.Items[a].Visible:=true;
    其中a为某一个数,0开始
      

  6.   

    我是说程序运行起来,动态设定。
    像这种方法:select 列1,列6 from table)太繁琐,毕竟不可能每个dbgrideh1都要设置呀。
      

  7.   

    我就是用 Select 选定列的方法设置的。本来想用 dgGrid.Columns.Items[a].Visable := False; 的方法,可是觉得不彻底
      

  8.   

    dbgrid1.Columns.Items[3].Visible:=false;//隐藏第四列
    dbgrid1.Columns.Items[3].Visible:=true;//取消隐藏
    //这样不行吗....
    就用這個唄,
    哪裡不徹底?
      

  9.   

    你那样设置的前提是从数据库里面取出这个列的内容了,数据量大呀直接生成 SQL 语句的话能减少数据量的传输,也能提高速度的
      

  10.   

    下面一些代码你自己改改,它是生成一个文件来显示字段的,当dbgrid所在窗体启动时,从文件引入显示dbgrid字段
    //引入文件显示DBGrid字段,在dbgrid所在的窗体的formcreate事件
     Path := ExtractFilePath(Application.ExeName);
        if FileExists(Path + 'IsVisible.Txt') then
        begin
          CheckList := TStringList.Create;
          try
            CheckList.LoadFromFile(Path + 'IsVisible.Txt');
            for I := 0 to CheckList.Count - 1 do
            begin
              if I > dbgrid1.Columns.Count - 1 then Break;
              if CheckList.Values[CheckList.Names[I]] = '0' then
                dbgrid1.Columns[I].Visible := False
              else
                dbgrid1.Columns[I].Visible := True;
            end;
          finally
            CheckList.Free;
          end;//引入文件看哪些字段需要选择,查询窗体的formactivate事件,用checkbox控件来选择字段显示
     chkbox.Clear;
        for I := 0 to form4.DBGrid1.Columns.Count - 1 do
        begin
          chkbox.Items.Add(form4.DBGrid1.Columns[I].Title.Caption);
          if form4.DBGrid1.Columns[I].Visible then
            chkbox.Checked[I] := True
          else
            chkbox.Checked[I] := False;
        end;//选择字段且保存设置到文件,查询窗体的确定按钮
    for I := 0 to form4.dbgrid1.Columns.Count - 1 do
        form4.dbgrid1.Columns[I].Visible := chkbox.Checked[I];
        CheckList := TStringList.Create;
      Path := ExtractFilePath(Application.ExeName);
      try
        for I := 0 to chkbox.Items.Count - 1 do
        begin
          if chkbox.Checked[I] then
          begin
            tmpStr := chkbox.Items[I] + '=1' ;
            if I<>0 then
            check:=true;
          end
          else
            tmpStr := chkbox.Items[I] + '=0';
          CheckList.Add(tmpStr);
        end;
        CheckList.SaveToFile(Path + 'IsVisible.Txt');
      finally
        CheckList.Free;
      end;
      

  11.   

    将上面的dbgrid换成dbgridehd就可心啦
      

  12.   

    如果用cxgrid的话可以直接设置属性
    其它的控件也可以自己写代码的