zoukankan      html  css  js  c++  java
  • UniGUI 之UniDBGrid(05)

    UniGUI 之UniDBGrid(05)

    目录
    1]DataSource设置
    2]显示MEMO类型里的文字
    3]显示悬浮提示
    4]显示当前记录及总记录数
    5]读取所有记录,及分页
    6]在前面加上序号列
    7]不显示标题栏
    8]列排序
    9]编辑 和 更新 数据
    10]获得某单元格里的内容

    11]标题别名

    12]将某列设置为CheckBox格式

    13]列标题下显示过滤编辑框,自动对列数据进行过滤

    14.1]右键删除一条记录

          14.2]右键删除多条记录

    15]将UniDBGrid数据另存为网页/CSV格式,导出

    16]自画整行和单元格

    17]UniDBGrid增加按钮列

    18]Argument out of range.错误

    19]一行所有列的编辑RowEditor

    20]隔行背景色设置StripeRows

    21]不显示Title按钮

    22]UniDBGrid当前列名/当前行总数/数据遍历

    23]设置标题行高

    24]设置某列的左右对齐(不含标题)

    25]设置某列为进度条显示

    26]unigui的dbgrid点击列标题进行排序


    1] 数据源DataSource设置为DataSource1


     2]  unidbgrid1.Columns[1].DisplayMemo:=true;  //显示MEMO类型里的文字,不设置只会显示(WIDEMEMO),不显示文字内容。

     


    3] unidbgrid1.Columns[1].ShowToolTip:=true;//当鼠标悬浮在某单元格上,在鼠标后面显示单元格内容;

     


    4]显示当前记录及总记录数

      function pagingBar.beforeInit(sender, config)
    { config.displayInfo = true;}

    然后 点右上角 的 Apply关闭。

     


    5]读取所有记录,及是否  分页。  WebOptions.FetchAll

     


     6]在前面加上序号列

    方法1:Options

      方法二:

     在UniDBGrid的ExtEvents事件下加如下代码:

    sender.headerCt.insert(0,new Ext.grid.RowNumberer({text:'','auto',align:'center',menuDisabled:false}));


    7]不显示标题栏;Options

      


    8]排序 

     unidbgrid1.Columns[1].Sortable:= True;

     7中的标题栏要可见


    9]编辑 和 更新 数据

    0]

     放一个UniHiddenPanel,在里面加入编辑控件UniEdit3之类的

    a)先将   wideMemo类型的要匹配 UniEdit,

     unidbgrid1.Columns[0].Editor:= UniEdit3;

     b)添加 过程

     

    /双击修改数据
    procedure TMainForm.UniDBGrid1SetCellValue(Sender: TObject; ACol, ARow: Integer;
      AField: TField; var Value: Variant);
    begin
     self.UniDBGrid1.DataSource.DataSet.Edit;
      self.UniDBGrid1.DataSource.DataSet.FieldByName(self.UniDBGrid1.Columns.Items[Acol].FieldName).Value:=Value;
      self.UniDBGrid1.DataSource.DataSet.Post;
    end;

     双击,修改后,回车,即可。


    10]获得某单元格里的内容。

    在UniDBGrid1的OnCellClick事件里

    procedure TMainForm.UniDBGrid1CellClick(Column: TUniDBGridColumn);
    begin
       if Column.FieldName = 'info' then //列名
      unimemo1.Text:=  VarToStr(Column.Field.Value) ;//Column.Field.Valueo为单元格的内容
    end;

    在UniDBGrid1的OnCellContextClick事件里

    procedure TMainForm.UniDBGrid1CellContextClick(Column: TUniDBGridColumn;
      X, Y: Integer);
    begin
      n1.Caption:= '删除  '+Column.Field.DataSet.FieldByName('aName').AsString;//单元格的内容

    UniPopupMenu1.Popup(X, Y, UniDBGrid1); // 弹出 右键菜单,绑定UniDBGrid1

    end;

    11]标题别名

      UniDBGrid1.Columns[1].Title.Caption := '成语';

    12]将某列设置为CheckBox格式

         

     左边是最终结果,右边是数据库里 的数据。

         unidbgrid1.Columns[2].CheckBoxField.AutoPost:=True; //当用户点选CheckBox后,改变前端显示并根据该属性决定:
                                                             //True—立即自动提交到数据集中并刷新前端显示
                                                             //False—只改变前端显示,当记录滚动时再提交数据集
         unidbgrid1.Columns[2].CheckBoxField.BooleanFieldOnly:=False; //是否只针对Boolean字段,
                                                                     //True—只能识别Boolean字段,非Boolean字段将不能显示CheckBox
                                                                     //False—DisplayValues和FieldValues可以针对非Boolean字段进行处理
         unidbgrid1.Columns[2].CheckBoxField.DisplayValues := 'Day;Night' ;   //DisplayValues存储显示文字  ,不设置 则 显示 True/False;
         uniDBgrid1.Columns[2].CheckBoxField.Enabled:= True;       // 一定为True;False则 不显示CheckBOx
         unidbgrid1.Columns[2].CheckBoxField.FieldValues:='0;1';    //FieldValues存储字段值,
    
    
         unidbgrid1.Columns[2].Alignment := taLeftJustify;        //靠左 排列

    13]列标题下显示过滤编辑框,自动对列数据进行过滤

            a].放一个TUniHiddenPanel控件在窗体上,然后将TUniEdit等编辑控件放置在这个隐藏的Panel内;

           b]一定要手动右键手动添加列 ;

           c]设置要过滤的列的Filtering,将其Editor属性设置对应的编辑控件

      FDQuery1.Open('select id,name,info from atb');
    
    UniDBGrid1.Columns[0].FieldName:='id';
    
      UniDBGrid1.Columns[1].FieldName:='name';
      UniDBGrid1.Columns[1].DisplayMemo := true;
      UniDBGrid1.Columns[1].Filtering.ChangeDelay := 900;  //当用户键入字符后,延时进行过滤处理的毫秒数
      UniDBGrid1.Columns[1].Filtering.Editor := UniEdit1;   //编辑控件 放在hidenPanel
      UniDBGrid1.Columns[1].Filtering.Enabled := true;   //Boolean是否允许进行过滤,一定为True;
      UniDBGrid1.Columns[1].Title.Caption:='成语';
      UniEdit1.CharEOL:=#13;  //表示回车 确定 开始  这很重要
    
      UniDBGrid1.Columns[2].FieldName:='info';
      UniDBGrid1.Columns[2].DisplayMemo := true;
      UniDBGrid1.Columns[2].Filtering.ChangeDelay := 900;
      UniDBGrid1.Columns[2].Filtering.Editor := UniEdit2;
      UniDBGrid1.Columns[2].Filtering.Enabled := true;
      UniDBGrid1.Columns[2].Title.Caption:='解释';
      UniEdit2.CharEOL:=#13;

         d]回车后的事件还得自己写。

    procedure TMainForm.UniDBGrid1ColumnFilter(Sender: TUniDBGrid;  const Column: TUniDBGridColumn; const Value: Variant);
    var    aFileterSQL: string;
    begin
      aFileterSQL := 'select *  from atb  where 1=1 ';
      aFileterSQL:= aFileterSQL+' and ' + UniDBGrid1.Columns[1].FieldName
        + ' like ''%' + UniDBGrid1.Columns[1].Filtering.VarValue + '%''';
      aFileterSQL:= aFileterSQL+' and ' + UniDBGrid1.Columns[2].FieldName
        + ' like ''%' + UniDBGrid1.Columns[2].Filtering.VarValue + '%''';
    
        FDQuery1.Open(aFileterSQL);
    end;

    14]右键删除一条记录

          a]在MainModule的BrowserOptions.boDisableMouseRightClick设为True;//  不显示网页自带的右键菜单,显示自定义右键菜单

          b]添加右键菜单,放一个UniPopupMenu1在窗口上,并添加菜单aPopupMenu,并添加事件

        c]两个设置

    //菜单执行
    procedure TMainForm.aaClick(Sender: TObject);
    begin        //删除该行
      MessageDlg('是否删除该行?', mtConfirmation, mbYesNo,
        procedure(Sender: TComponent; Res: Integer)
        begin
          Case Res of
            mrYes: // 点Yes后执行的语句
              begin
                   unidbgrid1.DataSource.DataSet.Delete;
              end;
            mrNo:   // 点No后执行的语句
              begin
                caption := 'mrNo'
              end;
          end;
        end);
    end;
    
    //c]将uniDBGrid的右键事件绑定右键菜单事件。
    procedure TMainForm.UniDBGrid1CellContextClick(Column: TUniDBGridColumn; X,  Y: Integer);
    begin
      n1.Caption:= '删除  '+Column.Field.DataSet.FieldByName('aName').AsString;
       UniPopupMenu1.Popup(X, Y, UniDBGrid1);
    end;

    14.2]右键删除多条记录

        a]将这四项 勾选  dgRowSelect   dgCheckSelect dgMultiSelect dgDontShowSelected

        b]UniDBGrid1的OnCellContextClick事件

    procedure TMainForm.UniDBGrid1CellContextClick(Column: TUniDBGridColumn;
      X, Y: Integer);
    begin
      n1.Caption:= '删除  '+ inttostr(UniDBGrid1.SelectedRows.Count) +'  项?';
    
      UniPopupMenu1.Popup(X, Y, UniDBGrid1); // 弹出 右键菜单,绑定UniDBGrid1
    end;

         c] 执行 删除 多行

    var aStr:string;
    begin
    aStr:=   uniDBGrid6.DataSource.DataSet.FieldByname('Organize').AsString;
      // 如果该项已使用,不能删除
      FDQuery3.Open('SELECT distinct 所属部门 FROM MainTable where  所属部门 = '''+
       aStr +    '''');
      if (FDQuery3.RecordCount > 0) then
      begin
        ShowMessage(aStr+'  已被使用中,不能删除!');
        Exit;
      end;
      UniDBGrid1.SelectedRows.Delete; // 删除多行
    end;

      15]将UniDBGrid数据另存为网页/CSV格式,方便导出

    procedure UniDBGridToHTML(aFDquery :TFDQuery;aHTMLFileName:string);
    var
      aHTMLtext: TstringList;
       j: integer;
    begin
      aHTMLtext := TstringList.Create;
      aHTMLtext.Add
        ('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  ' +
        '<html>   <head>    <title></title>   </head>  ' +
        '  <body>  <table border=".5pt solid windowtext;"; > ' +
        ' <col width=72 span=3 style='' 54pt''>');
    
      aHTMLtext.Add(' <tr > ');
        for j := 1 to aFDquery.FieldCount do
        begin
          aHTMLtext.Add('<td>');
          aHTMLtext.Add(aFDquery.Fields.FieldByNumber(j).FieldName);   //  列 名
          aHTMLtext.Add('</td>');
        end;
      aHTMLtext.Add(' </tr> ');
    
      aFDquery.First;
      while not(aFDquery.Eof) do
      begin
        aHTMLtext.Add(' <tr  > ');
    
        for j := 1 to aFDquery.FieldCount do
        begin
          aHTMLtext.Add('<td>');
          aHTMLtext.Add(aFDquery.Fields.FieldByNumber(j).AsString);   //  列  值
          aHTMLtext.Add('</td>');
        end;
        aHTMLtext.Add(' </tr> ');
    
        aFDquery.Next;
      end;
    
      aHTMLtext.Add('</table>  </body>  </html> ');
      aHTMLtext.SaveToFile(aHTMLFileName);
      aHTMLtext.Free;
    end;
    
    procedure UniDBGridToCSV(aFDquery :TFDQuery;aCSVFileName:string);//CSV格式
    var
    aHTMLtext: TstringList;
    i, j: integer;
    tempStr:string;
    begin
    aHTMLtext := TstringList.Create;
    tempStr := '';
    for j := aFDquery.FieldCount downto 1 do
    tempStr := aFDquery.Fields.FieldByNumber(j).FieldName + ',' + tempStr;
    tempStr := copy(tempStr, 0, Length(tempStr) - 1); //去掉最后一个 ,
    aHTMLtext.Add(tempStr);
    aFDquery.First;
    while not(aFDquery.Eof) do
    begin
    tempStr := '';
    for j := aFDquery.FieldCount downto 1 do
    tempStr := aFDquery.Fields.FieldByNumber(j).AsString + ',' + tempStr;
    tempStr := copy(tempStr, 0, Length(tempStr) - 1); //去掉最后一个 ,
    aHTMLtext.Add(tempStr);
    aFDquery.Next;
    end;
    aHTMLtext.SaveToFile(aCSVFileName);
    aHTMLtext.Free;
    end;
    
    procedure TMainForm.UniButton1Click(Sender: TObject);
    begin
      UniDBGridToHTML(FDquery1,'aa.html');
    UniSession.SendFile('aa.html'  //服务器端  文件名
                       ,'anew.html'          //客户端 新下载 的文件名
                       );
    /////////////////////////////////////////////////
    UniDBGridToCSV(FDquery1,'ae.csv');
    UniSession.SendFile('ae.csv' //服务器端 文件名
    ,'MySearch.csv' //客户端 新下载 的文件名
    );
    
    end;

     16]自画行和单元格

    procedure TMainForm.UniDBGrid1DrawColumnCell(Sender: TObject; ACol,
      ARow: Integer; Column: TUniDBGridColumn; Attribs: TUniCellAttribs);
    begin
      if ACol=0 then    // 某列
      begin
        Attribs.Color:=$E0E0E0;
        Attribs.Font.Style:=[fsBold];
      end;
      if ARow=1 then   //某行
      begin
        Attribs.Color:=$ffffff;
        Attribs.Font.Style:=[fsItalic];
      end;
    
      if Column.FieldName='UnitPrice' then
      begin
        if Column.Field.AsFloat>100 then
        begin
          Attribs.Font.Color:=clMaroon;
          Attribs.Font.Style:=[fsBold, fsItalic];
        end;
      end
      else if Column.FieldName='Quantity' then
      begin
        if Column.Field.AsInteger<200 then
        begin
          Attribs.Font.Color:=clRed;
          Attribs.Font.Style:=[fsBold];
          Attribs.Color:=clLtGray;
        end;
      end;
    end;

    17]UniDBGrid增加按钮列

    a]将UniDBGrid1的Images属性设为UniNativeImageList1,双击UniNativeImageList1,添加几个image子目录下的小图片,用做按钮图片,如下侧左图所示。

    b] 点中UniQuery1将其SQL属性如上侧右图所示配置查询语句

    select * from custom;//获取UniDBGrid1关联表的各个字段

    c]点击UniDBGrid1控件,在开发环境左上侧Structure区域选择UniDBGrid1的Columns,右键添加所有数据列,分别设置前五列的FieldName属性(关联字段名称)、Title->Caption属性(列标题名称)和Width属性(列宽),如下图所示:再新增一按钮列

    d]点中最后一列,将其FieldName设为“button”(名字随意,输入时会提示数据库链接错误,多次忽略即可),将其Title->Caption设为“操作”,将其ActionColumn->Enabled属性设置为True,将其ActionColumn->Buttons属性打开,增加三个按钮,分别点击每个TUniGridActionButton-x按钮,设置其ButtonId(按钮编号)、Hint(提示信息)、ImageIndex(关联到UniNativeImageList1的图片编号)属性,如下图所示:

     

     e]点击UniDBGrid1,在开发环境左下侧Object Inspector区域选择Events,添加OnColumnActionClick事件,简单示意点击不同按钮调用不同事件:

    procedure TMainForm.UniDBGrid1ColumnActionClick(Column: TUniDBGridColumn;
      ButtonId: Integer);
    begin
     if ButtonId=0 then begin  // 左键点击 删除图标 删除一列
        UniDBGrid1.DataSource.DataSet.Delete;
     end;
    end;

    官方例子D:Program FilesFMSoftFrameworkuniGUIDemosDesktopGrid - ActionColumn


     18]Argument out of range.错误

    Argument out of range.错误往往 是uniDBGrid有右键手动添加的固定列,删除该固定列。


    19]一行所有列的编辑,RowEditor

    uniDBGrid1.RowEditor:=Ture;

    设置后,双击(可以在ClicksToEdit属性里设置)某一行,所有列的都可以编辑,最后点Confirm提交,点Cancel取消。


    20]隔行背景色设置StripeRows

     uniDBGrid1.StripeRows:=True;


     21]不显示Title按钮

    UniDBGrid1.Columns[0].Menu.MenuEnabled:=False;



    22UniDBGrid当前列名/当前行总数/数据遍历/动态创建Filtering.Editor

    UniDBGrid1.Columns[UniDBGrid1.CurrCol].FieldName;//当前列名
    UniDBGrid1.DataSource.DataSet.Refresh;//更新数据

    unidbgrid1.DataSource.DataSet.RecordCount//当前行总数。

    procedure TMainForm.UniFormCreate(Sender: TObject);//动态创建Filtering.Editor
    Var
    THidenPanel: TUniHiddenPanel;
    TEdit: TUniEdit;
    begin

    THidenPanel:= TUniHiddenPanel.Create(self);
    THidenPanel.Parent := Self; //<--------------------
    THidenPanel.Name:= 'THiddenPanel';

    TEdit:= TUniEdit.Create(self);
    TEdit.Parent:= THidenPanel;
    TEdit.Name:= 'TEdit';
    TEdit.EmptyText:= 'teste';

    if Assigned(TEdit) then
    begin
    UniDBGrid1.Columns[3].Filtering.Editor:= TEdit;
    UniDBGrid1.Columns[3].Filtering.Enabled:= True;
    end;

    end;


    23]设置标题行高

    procedure TMainForm.UniFormCreate(Sender: TObject);
    begin
      UniDBGrid1.Columns[0].Title.Caption := '<br/>' + UniDBGrid1.Columns[0].Title.Caption + '<br/><br/>';
    //如果要更宽,多加几个<br/>
      UniDBGrid1.Columns[0].Title.Caption := '<br/>' + UniDBGrid1.Columns[0].Title.Caption + '<br/><br/><br/>';
    end;

    之前

     之后 


     24]设置某列的左右对齐(不含标题)

    UniDBGrid1.Columns[0].Alignment := taLeftJustify; // 靠左 排列TAlignment = (taLeftJustify, taRightJustify, taCenter);

     25]设置某列为进度条显示

    注意:UniDBGrid1DrawColumnCell事件里不用调用类似

    //  UniDBGrid1.Columns[3].Width := 90;
    //  UniDBGrid1.Columns[0].Alignment := taLeftJustify; // 靠左 排列
    UniDBGrid1.Columns[3]类似属性,要写在FormCreate

     a]假设FDQuery1的相关数据库设置都已连好。

     b]右击UniDBGrid1的Columns,新增与FDQuery1相对应的字段,进度条字段为整数类型pro

    ]

    c]放一个UniProgressbarWidget1,并设置Min,Max属性0,100

      

     d]关联字段

     

     e]书写数据库代码

    procedure TMainForm.UniFormCreate(Sender: TObject);
    begin
       UniDBGrid1.Columns[0].Width := 90;
      FDQuery1.Connection := UniMainModule.FDConnection1;
    
      UniMainModule.FDConnection1.LoginPrompt := False; // 取消登录提示框
      UniMainModule.FDConnection1.Open('DriverID=SQLite;Database=test1.Sqlite3');
    
      FDQuery1.Open('select isDone   ,aName  ,id,pro from ToDoListTable');//这里写UniDBGrid1中对应的列名
    
    end;

    还有两个参数可显示

     

     

    要显示百分率,ShowPercent和ShowValue 必同时设为True

     


    26]unigui的dbgrid点击列标题进行排序

    procedure DBGridSortByCol(dbGrid: TUniDBGrid; Column: TUniDBGridColumn; Direction: Boolean);
      var OrderStr:string;
          OrderPos:integer;
          SqlStr:string;
          Para:TUniParams;
          DescStr:string;
          OldSqlStr:string;
    begin
    if Direction=True then
    DescStr:=''
    else
    DescStr:=' desc';
    
    OldSqlStr:=(dbGrid.DataSource.DataSet as TUniQuery).SQL.Text;
    
    SqlStr:=LowerCase(OldSqlStr);
    
    
    Para:=(dbGrid.DataSource.DataSet as TUniQuery).Params;
    
    OrderPos:=Pos(' order ',SqlStr);
    
    if OrderPos=-1 then
    begin
      SqlStr:=SqlStr+' order by '+Column.FieldName;
    end
    else
    begin
      SqlStr:=Copy(SqlStr,0,OrderPos)+' order by '+Column.FieldName;;
    end;
    
    (dbGrid.DataSource.DataSet as TUniQuery).Close;
    (dbGrid.DataSource.DataSet as TUniQuery).SQL.Text:=SqlStr+DescStr;
    (dbGrid.DataSource.DataSet as TUniQuery).Params:=Para;
    (dbGrid.DataSource.DataSet as TUniQuery).Open;
    end;
  • 相关阅读:
    OPC客户端的进程安全初始化
    [精华] Oracle安装(linux)总结一下[转]
    Linux防火墙iptables的设置与启动[转]
    Linux Server 5.5安装SVN+Apache服务[转]
    Red hat Linux Enterprise 5.4 Edtion 学习笔记[二]
    RedHat Linux 5企业版开启VNCSERVER远程桌面功能[转]
    Linux服务配置:Vsftp的基本配置[转]
    Linux查看和剔除当前登录用户
    Ubuntu10.04的中文问题汇集与解决[转]
    Linux下扩展swap分区的方法
  • 原文地址:https://www.cnblogs.com/tulater/p/12251954.html
Copyright © 2011-2022 走看看