我用adoquery连了一个dbgrid,想用edit+button做一个搜索功能,就是对dbgrid中显示的记录进行查找,如果该记录中的某个字段包含edit.text,那么将该记录用其他颜色显示。说明:dbgrid中的内容是可以动态更新的,所以dbgrid中的字段数量和他们的类型都是可以动态变化的(不确定)。
还有个小问题,就是我没对dbgrid进行任何设置就用来显示内容,发现有时候一个字段会占很宽的位置,有没有一种方法使它的宽度自动适合内容的宽度阿!!!
谢谢各位!万望不吝赐教!!

解决方案 »

  1.   

    先回答第二个问题:让DBgrid自动调整宽度
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, DBCtrls;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOTable1: TADOTable;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure FormCreate(Sender: TObject);
        function NewTextWidth(fntFont: TFont; const sString: OpenString): integer;
        function iCalcGridWidth(dbg: TDBGrid): integer;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function TForm1.NewTextWidth(fntFont: TFont; const sString: OpenString): integer;
    {根据程序默认系统取得文字所需宽度值}
    var
      fntSave: TFont;
    begin
      result := 0;
      fntSave := Application.MainForm.Font;
      Application.MainForm.Font := fntFont;
      try
        result := Application.MainForm.Canvas.TextWidth(sString);
      finally
        Application.MainForm.Font := fntSave;
      end;
    end;function TForm1.iCalcGridWidth(dbg: TDBGrid): integer;
    {指定TDBGrid名称计算所需显示宽度}
    const
      cMEASURE_CHAR = '0';
      iEXTRA_COL_PIX = 4;
      iINDICATOR_WIDE = 11;
    var
      i, iColumns, iColWidth, iTitleWidth, iCharWidth: integer;
      //分别代表字段数,列数,列宽,列标题宽,字宽
    begin
      iColumns := 0;
      result := GetSystemMetrics(SM_CXVSCROLL);
      //得到系统滚动条的大小
      iCharWidth := NewTextWidth(dbg.Font, cMEASURE_CHAR);
      with dbg.dataSource.dataSet do
        for i := 0 to FieldCount - 1 do
          with Fields[i] do
            if visible then{字段是否可视}
            begin
              iColWidth := iCharWidth * DisplayWidth;
              if dgTitles in dbg.Options then
              begin
                iTitleWidth := NewTextWidth(dbg.TitleFont, DisplayLabel);
                if iColWidth < iTitleWidth then
                  iColWidth := iTitleWidth;
              end;
              inc(iColumns, 1);
              inc(result, iColWidth + iEXTRA_COL_PIX);
            end;
            if dgIndicator in dbg.Options then
            begin
              inc(iColumns, 1);
              inc(result, iINDICATOR_WIDE);
            end;
            if dgColLines in dbg.Options then
              inc(result, iColumns)
            else
              inc(result, 1);
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      W, i: Integer;
    begin
      ADOTable1.Active := True; 
      W := 0;
      for i := 0 to DBGrid1.Columns.Count - 1 do //遍历数据列累加宽度
        W := W + DBGrid1.Columns[i].Width + 4; //增加必要的值协调右边框余值
      DBGrid1.ClientWidth := W; //设置宽度
      Self.ClientWidth := (DBGrid1.Left * 2) + DBGrid1.Width; //调整窗体宽度
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Showmessage(IntToStr(iCalcGridWidth(DBGrid1)));//统计DBGIRD所需宽度方法
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      Showmessage(Inttostr(DBGrid1.Width));//显示当前DBGIRD宽度
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      ADOTable1.Active := not ADOTable1.Active; //打开关闭数据库显示
    end;end.
      

  2.   

    你在http://search.csdn.net 的delphi中搜索一下 dbgrid color,很多很多:))
      

  3.   

    to  orchidbing(米饼) and  angelface(§君临天下§) 
    我搜了,但没有很合适的.我刚开始学,不怎么会灵活应用,恳请高手给点我这问题的代码吧(包括对dbgrid的搜索),谢谢,
      

  4.   

    代码都很基础的,我给你讲点思路吧,先用一个adoquery1连接dbgird,用它查询在dbgrid中显示的内容,然后再用一个adoquery2查询和adoqury1一样的内容,但多了一个条件,就是满足like *edit1.text*.
    显示颜色的我给你一段参考代码吧   procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var i:real;
    begin
        if ..... then
    begin
        DbGrid1.Canvas.Brush.Color:=clRed  //你想要显示的颜色
        DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
    end;
    end;