zoukankan      html  css  js  c++  java
  • DBGrid中顯示行號的終極解決方案

            昨天在大富翁論壇上見一貼子,求在DBGrid中顯示行號的方法,並稱此題為“曠世難題”,我一想,這樣的題目也叫曠世難題?於是自己就動手嚐試,結果發 現原來並不簡單,確實是有點難度。後來又在網上搜索良久,也始終找不到一個很好的解決方案,有的也只是在瀏覽狀態下才能實現,而在Insert下卻不能實 現,所有的行號都顯示為 -1。
            難道?delphi真的是無能為力的嗎?我不信,幾經試驗,終於讓我找到了解決方法,代碼如下:

    //聲明全局變量i

    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; 
    const Rect: TRect;
      DataCol: 
    Integer; Column: TColumn; State: TGridDrawState);
    begin
      
    with DBGrid1.DataSource.DataSet do
      begin
        
    if DataCol = 0 then                           //設置在第一列
        begin
          
    if state<>dsInsert  then i:= recno;           //這句是關鍵。。。
          DBGrid1.Canvas.TextRect(Rect, Rect.
    Left + 2, Rect.Top + 2, IntToStr(i));
          inc(i);                  
    //將i加1
        
    end;
      
    end;
    end;

    procedure TForm1.DataSource1StateChange(Sender: TObject);
    begin                                            
    //狀態改變時將i置為1
      i:
    =1;
    end;

            問題完美解決了,代碼也很簡單,只是加了一個中間變量 i 。
            到目前為為止,網上還未見到此種解決方案,如有雷同,純屬巧合。  
                                                                                          
    以上方法後來證明還是有點問題,修正如下:
    var
      Form1: TForm1;
      i:
    integer;
      bflag,bflag2:
    boolean;

    implementation

    {$R 
    *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      adoquery1.Open;
    end;

    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; 
    const Rect: TRect;
      DataCol: 
    Integer; Column: TColumn; State: TGridDrawState);
      var
        rect1:TRect;
        sValue :
    string;
        ss:
    boolean;
    begin
      
    if DataCol = 0 then                           //設置在第一列
      begin
        
    if DBGrid1.DataSource.DataSet.state<>dsInsert  then
          i:
    = DBGrid1.DataSource.DataSet.recno;

        Rect1 :
    = Rect;
        
    with dbgrid1 do
        begin
          Canvas.Brush.Color :
    = clBtnFace;
          sValue :
    = IntToStr(i);
          Canvas.FillRect(Rect1);
          Canvas.Pen.Width :
    = 1;
          Canvas.Pen.Color :
    = clWhite;
          Canvas.MoveTo(Rect1.
    Left, Rect1.Bottom);
          Canvas.LineTo(Rect1.
    Left, Rect1.Top);
          Canvas.LineTo(Rect1.
    right, Rect1.Top);
          Canvas.Pen.Color :
    = clBtnShadow;
          Canvas.LineTo(Rect1.
    right, Rect1.Bottom - 1);
          Canvas.LineTo(Rect1.
    Left, Rect1.Bottom - 1);
          Rect1.Top :
    = Rect1.Top +1;
          
    if State = [gdSelected, gdFocused] then
          begin
            
    if bflag=true then
            begin
              sValue:
    =inttostr(datasource.DataSet.RecordCount +1);
              i:
    =datasource.DataSet.RecordCount +1;
                ss:
    =true;
            
    end;
          Canvas.Font.Color :
    = clred;
          
    end
          
    else
          begin
            Canvas.Font.Color :
    = clgreen;
          
    end;
          DrawText(Canvas.Handle, PChar(sValue), Length(sValue), Rect1, DT_CENTER);
        
    end;
        
    if i<=dbgrid1.DataSource.DataSet.RecordCount then
        begin
          inc(i);
        
    end
        
    else
        begin
        
    if (ss<>truethen
          i:
    =dbgrid1.DataSource.DataSet.RecordCount+3 -TDrawGrid(DBgrid1).RowCount ;
        
    end;
      
    end
      
    else bflag2:=false;
    end;

    procedure TForm1.DataSource1StateChange(Sender: TObject);
    begin
      
    if dbgrid1.DataSource.DataSet.State <>dsbrowse then
      begin
        i:
    =dbgrid1.DataSource.DataSet.RecordCount+3 -TDrawGrid(DBgrid1).RowCount ;
        bflag :
    = true;
      
    end
      
    else
        bflag:
    =false;
    end;

    procedure TForm1.DBGrid1ColEnter(Sender: TObject);
    begin
     
    if (bflag=true)and (dbgrid1.SelectedField.FieldNo <>1then
     begin
      i:
    =dbgrid1.DataSource.DataSet.RecordCount+3 -TDrawGrid(DBgrid1).RowCount;
      dbgrid1.Refresh;
     
    end;
    end;

    procedure TForm1.DBGrid1ColExit(Sender: TObject);
    begin
      
    if (bflag=true)and (dbgrid1.SelectedField.FieldNo =1then
     begin
      i:
    =dbgrid1.DataSource.DataSet.RecordCount+1;
      dbgrid1.Refresh;
     
    end;
    end;

    end.


        文章出处:http://www.cnblogs.com Bonny.Wong(让思想飞翔)2005.1.12
  • 相关阅读:
    Kubernetes 弹性伸缩全场景解析 (四)- 让核心组件充满弹性
    15分钟在笔记本上搭建 Kubernetes + Istio开发环境
    idea 插件的使用
    jQuery获取select元素选择器练习
    【Maven】添加ueditor到maven本地仓库
    jQuery序列化乱码解决
    Linux安装RedHat
    MyBatis SQL xml处理小于号与大于号
    js判断数据类型
    基于SSM框架的通用权限框架设计
  • 原文地址:https://www.cnblogs.com/fuyingke/p/377255.html
Copyright © 2011-2022 走看看