zoukankan      html  css  js  c++  java
  • delphi开发回忆录——面向对象的基础,继承(续)

    在事件中声明
    var
      testform:TfrmBasic;
    并创建窗体对象,然后进行赋值操作,从前面的代码中我们不难看出这样写程序有太多的弊端,比如:代码重复,死板等等。
    其实我们可以通过TRzGroupBar控件的TRzGroupItem对象的Tag或者Caption来创建相应的窗体对象,例如:
    procedure TfrmMain.rgBaseDatumItems0Click(Sender: TObject);
    begin
        CreateFormSelect(Sender);
    end;
    函数CreateFormSelect如下:
    procedure TfrmMain.CreateFormSelect(Sender: TObject);
    begin
      MsgBox((Sender as TRzGroupItem).Caption,0);
    end;

    根据上面,我们在全局单元文件中创建一个创建窗体对象的函数:Procedure CreateForm(TBTag:Integer;aCaption:String);
    然后在CreateFormSelect中调用CreateForm,如下:
    procedure TfrmMain.CreateFormSelect(Sender: TObject);
    begin
       CreateForm(TRzGroupItem(Sender).tag,(Sender as TRzGroupItem).Caption);
    end;
    我们可以在过程CreateForm中对所创建的窗体不同而赋相应的对象,比如设置控件的显示,赋于不同的数据集对象等等

    接下来,我们在数据窗体中放入两组ADOQuery和DataSource分别命名为:dsEmployeeqryEmployeedsDepartmentqryDepartment,然后设置dsEmployee的Dataset属性为qryEmployee,dsDepartment的Dataset属性为qryDepartment,再设置qryEmployeeqryDepartment的SQL属性分别为:
    select * from Employee和select * from Department,当然需要在数据库分别创建表Employee和Department。
    函数CreateForm根据传入的参数不同而创建不同类型的三种窗体:基本资料窗体,单据窗体和报表窗体,代码如下:
    Procedure CreateForm(TBTag:Integer;aCaption:String);
    begin
      case TBTag of
      100..199:
        begin
           CreateBasicForm(TBTag,aCaption);
        end;
      200..299:
        begin
          CreateBillForm(TBTag,aCaption);
        end;
      300..399:
        begin
          CreateReportForm(TBTag,aCaption);
        end;
      end;
    end;

    在此代码中我们发现调用了CreateBasicForm,而这个方法才是我们真正创建基本资料窗体的函数,现在来揭开她的神秘面纱,看她到底有什么魔力。
    Procedure CreateBasicForm(TBTag:Integer;aCaption:String);
      var
      LableList,LableDetail:string;
      tempstr:string;
    begin
      Case TBTag of
      100:
        begin
          LableList:='员工列表';
          LableDetail:='员工资料';
          frmDM.dsMaster:=frmDM.dsEmployee;
        end;
      101:
        begin
          LableList:='部门列表';
          LableDetail:='部门资料';
          frmDM.dsMaster:=frmDM.dsDepartment;
        end;
      end;
      LockWindowUpdate(frmMain.Handle);
      if Assigned(vBasicForm) then
      begin
        MsgBox('窗体创建错误!',MB_ICONINFORMATION);
        exit;
      end;
      if Not Assigned(vBasicForm) then
      begin
        vBasicForm:=TfrmBasic.Create(Application);
        vBasicForm.Caption:=aCaption;
        with vBasicForm do
        begin
          dbgrdhList.DataSource:=frmDM.dsMaster;
          dxdbinsEdit.DataSource:=frmDM.dsMaster;
        end;
        frmDM.dsMaster.DataSet.Active:=True;
        with vBasicForm.dbgrdhList do
        begin
          Columns.Clear;
          Columns.Add;
          Columns[0].Title.Caption:=copy(LableList,1,4)+'编码';
          Columns[0].Width:=100;
          Columns[0].FieldName:=frmDM.dsMaster.DataSet.Fields[1].FieldName;
          Columns.Add;
          Columns[1].Title.Caption:=copy(LableList,1,4)+'名称';
          Columns[1].Width:=160;
          Columns[1].FieldName:=frmDM.dsMaster.DataSet.Fields[2].FieldName;
        end;
        InitDataSetInspectorl(frmDM.dsMaster.DataSet.Tag);
        vBasicForm.Show;
      end
      else
        vBasicForm.show;
      LockWindowUpdate(0);
    end;

    从代码中可以看出,根据传入的参数,来对一些变量进行赋值,特别注意的一行代码是frmDM.dsMaster:=frmDM.dsEmployee;
    此行代码是对数据组件窗体中的组件进行赋值,目的是为了在基窗体中引用的类TBaseClass中的数据操作保证是对相同的数据集操作。
    回顾一下TBaseClass类中对数据的操作,都是对数据窗体中的dsMaster数据源进行操作的。因为我们在窗体时要将相应的数据源码赋值给数据窗体中的dsMaster数据源。继续看代码,可以知道已经将数据窗体中的dsMaster数据源赋值到创建窗体中的dbgrdhList和dxdbinsEdit控件,代码如下:dbgrdhList.DataSource:=frmDM.dsMaster;
    dxdbinsEdit.DataSource:=frmDM.dsMaster;
    接下来的代码是对两个数据显示控件进行初始化,而dxdbinsEdit则是通过方法InitDataSetInspectorl进行初始化,方法InitDataSetInspectorl的源码如下:
    Procedure InitDataSetInspectorl(TableTag:Integer);
    var
      i,j,TempWidth,MaxWidth:integer;
      StrTableID,StrList:String;
      TempQuery:TADOQuery;
      TableValue:Boolean;
      varRow:integer;
      vFL:integer;
      vFieldList:array [0..19] of String;
    begin
      StrTableID:=GetFieldName(TableTag,2);
      StrTableID:='01';
      TempQuery:=TADOQuery.Create(Application);
      Try
        TempQuery.Connection:=frmDM.conDB;
        TempQuery.SQL.Clear;
        TempQuery.SQL.Text:=Format('Select * From DataDictContent where TableID=''%s'' order by TableID,FieldID',[StrTableID]);
        TempQuery.Open;
        i:=0;
        MaxWidth:=0;
        if vBasicForm.dxdbinsEdit.TotalRowCount>0 then
          vBasicForm.dxdbinsEdit.ClearRows;
        if Not TempQuery.IsEmpty then
        While Not TempQuery.Eof do
        begin
          if TempQuery.FieldByName('DisplayFlag').AsBoolean then
          with vBasicForm do
          with dxdbinsEdit do
          begin
            BeginUpdate;
            DefaultFields := False;
            case TempQuery.FieldByName('InspectorRowType').AsInteger of
            0:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBRow,TempQuery,0);  //TdxInspectorDBRow  类型引用单元文件dxDBInsp
            1:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBRow,TempQuery,1);
            2:
              CreateInspectRow(dxdbinsEdit,TdxInspectorComplexRow,TempQuery,2);  //TdxInspectorComplexRow    类型引用单元文件dxInspct
            3:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBMaskRow,TempQuery,3);
            4:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBDateRow,TempQuery,4);
            5:
              CreateInspectRow(dxdbinsEdit,TdxInspectorLookupRow,TempQuery,5);
            6:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBCheckRow,TempQuery,6);
            7:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBCalcRow,TempQuery,7);
            8:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBButtonRow,TempQuery,8);
            9:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBSpinRow,TempQuery,9);
            10:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBPickRow,TempQuery,10);  //TdxInspectorDBPickRow    类型引用单元文件dxDBInRw
            11:
              CreateInspectRow(dxdbinsEdit,TdxInspectorBlobRow,TempQuery,11);
            12:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBImageRow,TempQuery,12);
            13:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBTimeRow,TempQuery,13);
            14:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBCurrencyRow,TempQuery,14);
            15:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBHyperLinkRow,TempQuery,15);
            16:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBPopupRow,TempQuery,16);
            17:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBMRURow,TempQuery,17);
            18:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBMemoRow,TempQuery,18);
            19:
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBGraphicRow,TempQuery,19);
            else
              CreateInspectRow(dxdbinsEdit,TdxInspectorDBRow,TempQuery,1);
            end;
            EndUpdate;
          end;
          TempQuery.next;
        end;
      finally
        TempQuery.Free;
      end;
    end;
    上面方法又调用了CreateInspectRow方法,代码如下:
    procedure CreateInspectRow(varDBInspector:TdxDBInspector;IR: TdxInspectorRowClass;
                        varADOQuery:TADOQuery;RowFlag:integer);
    var
      RowButton:TdxEditButtonClass;   //TdxEditButtonClass类型所引用单元文件dxExEdtr
      varInt:integer;
      StrList:string;
      j:integer;
    begin
      with varDBInspector do
        with TdxInspectorDBRow(CreateRow(IR)) do
        begin
          Caption:=varADOQuery.FieldByName('DisplayCaption').AsString;
          FieldName :=varADOQuery.FieldByName('FieldName').AsString;
          if varADOQuery.FieldByName('ReadOnlyFlag').AsBoolean then
            ReadOnly:=True;
          name:='ir'+FieldName;
          if RowFlag=8 then
          begin
             varInt:=varDBInspector.IndexOfRow(varDBInspector.RowByName(Name));
             (varDBInspector.Rows[varInt] as TdxInspectorDBButtonRow).OnButtonClick:=frmBasic.DBInspectorRowOnButtonClick;
          end;
          if FieldName='Password' then
            PasswordChar:='*';
          if RowFlag=10 then
          if varADOQuery.FieldByName('DictionaryFlag').AsBoolean then
            begin
              if varADOQuery.FieldByName('DictionaryType').AsBoolean then
              begin
                //Items[i].ButtonStyle:=ibsAuto;
                //Items[i].PickList.Clear;
                varInt:=varDBInspector.IndexOfRow(varDBInspector.RowByName(Name));
                StrList:=varADOQuery.FieldByName('DictionaryTypeID').AsString;
                j:=POS(';',StrList);
                while j<>0 do
                begin
                  (varDBInspector.Rows[varInt] as TdxInspectorDBPickRow).Items.Add(Copy(StrList,1,j-1));
                  //Items[i].PickList.Add(Copy(StrList,1,j-1));
                  StrList:=Copy(StrList,j+1,Length(StrList)-j);
                  j:=POS(';',StrList);
                end;
              end
              //else
              //Items[i].ButtonStyle:=ibsEllipsis;
            end;

        end;
    end;
    上面两个
    过程代码较多,其实也很简单,只要对控件TdxDBInspector多了解一下就会明白。主要是动态创建数据字段。在此不再多做介绍。
    上面代码中有这样两行代码: 
    StrTableID:=GetFieldName(TableTag,2);
     StrTableID:='01';
    显然有些问题,既然通过函数赋值,那为什么又对StrTableID赋值为'01'呢?
    还有对数据显示控件TdxDBInspector进行初始化显示时用到的DataDictContent 表,等等问题,下次再做介绍

  • 相关阅读:
    iOS开发多线程篇—创建线程
    【C语言】23-typedef
    李洪强经典面试题10
    李洪强经典面试题9
    李洪强经典面试题8
    李洪强经典面试题7
    多态性
    Oracle exp使用正則表達式导出部分表
    Android NDK开发初步
    HDU1864 最大报销额 01背包
  • 原文地址:https://www.cnblogs.com/edrp/p/1070811.html
Copyright © 2011-2022 走看看