数据库操作部分:
题目:   数据库操作,要实现添加、修改、删除、保存要求:
   实现UI分离提示:
   利用模板简化操作,提高复用性。实例:
    建立一个公用的模板{应用窗体继承技术}来实现代码的复用性和界面的统一性,并且将业务规则实现分离,部分的改动不会对程序有大的变动。
模板如下,我提供完整的模板,请与我联系。unit TempletForm;interface    ...............
type
  TMyForm = class(TForm)
    ............
    procedure imgMinButtonClick(Sender: TObject);
    procedure imgSizeButtonClick(Sender: TObject);
    procedure imgCloseButtonClick(Sender: TObject);
    procedure imgCaptionMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure imgCaptionMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure imgCaptionMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure imgSysIconMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure popSystemMenuPopup(Sender: TObject);
    procedure N_SizeClick(Sender: TObject);
    procedure N_MoveClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    canmove:boolean;
    curPoint:TPoint;
    oldPoint:TPoint;
    Canvas:TCanvas;
  protected
    procedure CreateParams(var Params:TCreateParams);override;
    procedure WMActivate(var Msg:TWMACTIVATE); message WM_ACTIVATE;
  public
    { Public declarations }
  end;var
  MyForm: TMyForm;implementation{$R *.dfm}procedure TMyForm.CreateParams(var Params:TCreateParams);
begin
  inherited CreateParams(Params);
  if BorderStyle<>bsNone then
    Params.Style :=WS_THICKFRAME or WS_POPUP or WS_BORDER;
end;procedure TMyForm.imgMinButtonClick(Sender: TObject);
begin
  if Application.MainForm =self then
    Application.Minimize
  else
    DefWindowProc(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
end;procedure TMyForm.imgSizeButtonClick(Sender: TObject);
begin
  if self.WindowState = wsNormal then
  begin
    DefWindowProc(Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
    imgSizeButton.Picture :=imgRestoreButton.Picture;
  end
  else
  begin
    DefWindowProc(Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
    imgSizeButton.Picture :=imgMaxButton.Picture;
  end;end;procedure TMyForm.imgCloseButtonClick(Sender: TObject);
begin
  DefWindowProc(Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
end;procedure TMyForm.imgCaptionMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if (Button=mbLeft)and(ssLeft in Shift)then
  begin
    canmove:=true;
    Canvas:=TCanvas.Create;
    with Canvas do
    begin
      pen.Style :=psdot;
      brush.Style :=bsClear;
      pen.Width :=2;
      Pen.Mode :=pmNotXor;
      Handle :=GetDC(0);
      Rectangle(left,top,Left+width,top+height);
      curPoint.X :=X;
      curPoint.Y :=Y;
      oldPoint.X :=Left;
      oldPoint.Y :=Top;
    end;        //end with
  end;  //end if
end;procedure TMyForm.imgCaptionMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if not canmove then exit;
  with Canvas do
  begin
    Rectangle(oldPoint.x,oldPoint.y,oldPoint.x+Width,oldPoint.y+Height);
    oldPoint.x :=Left +X-curPoint.x;
    oldPoint.y :=Top +Y-curPoint.y;
    Rectangle(oldPoint.x,oldPoint.y,oldPoint.x+Width,oldPoint.y+Height);
  end;
end;procedure TMyForm.imgCaptionMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if not canmove then exit;
  with Canvas do
  begin
    Rectangle(oldPoint.x,oldPoint.y,oldPoint.x+Width,oldPoint.y+Height);
    Left :=oldPoint.x;
    Top :=oldPoint.y;
    Free;
  end;
  canmove:=not canmove;
end;procedure TMyForm.FormCreate(Sender: TObject);
begin
  lbCaption.Caption :=Caption;
end;procedure TMyForm.imgSysIconMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PopSystemMenu.Popup(Left+ImgSysIcon.Left,Top+ImgSysIcon.Top+ImgSysIcon.Height);
end;procedure TMyForm.popSystemMenuPopup(Sender: TObject);
begin  N_Restore.Enabled :=imgSizeButton.Visible and (WindowState =wsMaximized);
  N_Max.Enabled :=imgSizeButton.Visible and (WindowState =wsNormal);
  N_Size.Enabled :=imgSizeButton.Visible ;
end;procedure TMyForm.N_SizeClick(Sender: TObject);
begin
  DefWindowProc(Handle, WM_SYSCOMMAND, SC_SIZE, 0);
end;procedure TMyForm.N_MoveClick(Sender: TObject);
begin
  DefWindowProc(Handle, WM_SYSCOMMAND, SC_MOVE, 0);
end;procedure TMyForm.FormShow(Sender: TObject);
begin
  if WindowState=wsNormal then
    imgSizeButton.Picture.Bitmap :=imgMaxButton.Picture.Bitmap
  else if WindowState=wsMaximized then
    imgSizeButton.Picture.Bitmap :=imgRestoreButton.Picture.Bitmap
end;procedure TMyForm.WMActivate(var Msg: TWMACTIVATE);
begin
  if (Msg.Active =WA_ACTIVE) or (Msg.Active =WA_CLICKACTIVE) then
  begin
    imgCaption.Picture.Bitmap :=imgColorCaption.Picture.Bitmap;
    imgLeftUp1.Picture.Bitmap :=imgColorLeftUp.Picture.Bitmap;
    imgRightUp1.Picture.Bitmap :=imgColorRightUp.Picture.Bitmap;
    coolBarMenu.Bitmap :=imgColorMenubar.Picture.Bitmap;
  end
  else begin
    imgCaption.Picture.Bitmap :=imgGrayCaption.Picture.Bitmap;
    imgLeftUp1.Picture.Bitmap :=imgGrayLeftUp.Picture.Bitmap;
    imgRightUp1.Picture.Bitmap :=imgGrayRightUp.Picture.Bitmap;
    coolBarMenu.Bitmap :=imgGrayMenubar.Picture.Bitmap;
  end;
end;end.引用type
  Tfrm_hygl = class(TMyForm)
    ztl: TStatusBar;

解决方案 »

  1.   

    小小, 你干脆在 CSDN 办个“小小学堂”得了!!  ^_^
      

  2.   

    我也想知道ui分离是个什么东东?
    顺便请老师有空得时候看看我这个贴子,关于ocx的,总没人答,只好请教老师了。
    http://expert.csdn.net/Expert/topic/1859/1859314.xml?temp=.7314722
      

  3.   

    To leapmars(流铭) 
    在Midas版见过你回答问题,相当不错。
    我那点东西,那敢办小小学堂,见笑了。所谓的UI操作就是(User Interface)用户界面分离。基本的界面操作和具体的业务规则进行分离,简单的就可以这样认为,单机上可以、c/s可以,Midas更应该如此。----------------
    沉沦中..........
      

  4.   

    作为一个OCX控件{应该叫组件吧},首先你要创建ActiveX Lib,当创建完之后,你要打开TLB(类型库 Shift + F12 or View -> Type Library),你要让别人可以用你这个OCX中定义的方法,那么这一切方法只有在TLB中去写才可以。方法如此,其中字段、属性也需要这样定义,不然别人没有办法用你的这个组件,而方法、字段、属性置其ID为小于0的整数{这一点和普通的组件有出入}----------------
    沉沦中..........
      

  5.   

    郁闷ing,什么时候能到你们的水平
    先了,
      

  6.   

    很多看不懂。。可以发一份完整的给我吗谢谢了 [email protected]
      

  7.   

    to dh9450完整的代码也是我自己的思路来填写师傅的代码空。还不如你自己来写。我老乡焦裕禄说得好:吃别人嚼过的馍馍不香。自己看着办吧。
      

  8.   

    ihihonline (小小-&gt;沉沦中..........) :你的模板是否可以放个地方参考一下?
      

  9.   

    我也想看看你的完整的模板也很感兴趣!好象写得挺复杂的!
    这样的一个窗口好象是无标题栏的窗口,很奇怪一个类MIS中怎么会有大量的这种类型的窗口
    呵呵,后来细想了一下明白了,一定是做的类似换肤的东西了,用自己的图片之类的伪装成
    原来的标题栏以及最大、最小化按钮能,不知道是不是这样的!
      

  10.   


    imgCaptionMouseDown这个事件中使用了
     GetDC(0) TCanvas.Create这里难到不用ReleaseDC,Canvas.Free吗?呵呵,希望你不介意回答我这个没入门的学生的问题!!!
      

  11.   

    蒲石 你好,感谢你的再次关注,放一点我最近写的文档:《谈组件技术》中的封装时对UI的解释:
    封装:组件对象要封装组件,而组件又要封装接口,最终接口还是需要封装其所实现的业务逻辑规则,所以,单一的从OOP的这一点上来考虑的话,组件对象和OOP就应该有某种分不开的关系。封装主要提体在两个方面:类封装、对象封装,具体的细节可以参考相关资料。封装就是一种UI分离,为什么我会这样说呢?提到封装,也许我们最容易想到的就是黑匣子。的确,我也承认封装就是一个基于黑匣子的实现方式,而且也是相当恬当的一种比喻,如何说呢?因为封装也一样有两个"界面",一个是活的,一个是稳定的,而所谓的活就是封装内部所处理业务规则的实现方法,如果不去计较其效率的话,我们可以用任何的手段去实现其内部的功能,可以进行随意性修改(此处的随意性修改仅仅是为了体提它的"活"而给出的。)但是无论其是如何的活,如何的随意性,它都有一个最终的目的,就是为了实现一个稳定的"界面",内部的内容可以进行改动,而稳定的接口是不应该随意更动的。类如此、对象如此,一个接口、组件、组件对象更是如此。单纯的从一个项目而言,这种封装就是一种UI分离,不要固执的认为UI分离就是将用户操作和逻辑规则处理放在了两个"物理"上很远的操作就是封装,如果这样认为,我只能说你的OOP理解的不好。此处给一个例子来进行分析:
      TCustomForm = class(TScrollingWinControl)
      private    FActiveControl: TWinControl;
        FFocusedControl: TWinControl;
        function GetMDIChildren(I: Integer): TForm;
        function GetMonitor: TMonitor;     ……
      public
        constructor Create(AOwner: TComponent); override;
        procedure AfterConstruction; override;
           ……
       end;
    想说明的是此处的private 就是我们刚刚所说的活的部分,它的内部可以进行任何的改动的,但是,它必须要保证最终的Public 是稳定的。这就是一种封装的提体,也是一种UI操作的实例。同时我们也应该注意到,正是因为封装性,所以就要求我们在考虑稳定部分的时候做一些工作,当一个项目投于应用之中之后,我们就没有办法再去更改这些稳定的部分,因为这些部分是直接于用户进行关联的,用户的操作就是对急定部分的操作,如果一但改动了某一个用户正在使用的稳定部分的属性,其后果就是项目的重新规划、开发。总之一句话:封装可以隐藏实现细节,使得代码模块化,实现代码的可复用性。不知道封装的阐述各位是否明白?如果有任何的疑问可以与我联系,欢迎您和我一起探讨。而模板也可以实现一种封装,在某种程序度上可以这样说,它将封装与继承都体现了进去,不是吗:)这里提到:
    imgCaptionMouseDown这个事件中使用了
     GetDC(0) TCanvas.Create这里难到不用ReleaseDC,Canvas.Free吗?此处的确,但也不得不考虑到,做为一个模板,从启动时将有可能要一直用以应用程序的结束,而它的机制就是一种共享,每一个具体的实例可以不创建多个模板实例,所以,此处对于你这个疑问也可以勉强的这样回答。----------------
    沉沦中..........
      

  12.   

    非常感谢,收益颇丰。通俗的来讲,无论你给一辆汽车换什么样的发动机,反正要开动它都是统一的踩油门,转方向盘
    这里油门和方向盘就是你说的Public部分,发动机就是Private部分。这样理解应该没错吧。对于上面的代码我还有些问题我不太清楚模板的工作机理,但是就简单的从代码角度考虑,它无非是在TForm和
    我们自己的Form中间多插了一个类,而从模板继承下来的Form也都有自己的实例
    为什么不能ReleaseDC呢。奇怪的问题还有
      imgCaptionMouseDown中
      Canvas := TCanvas.Create;
    这里会默认引用窗体本身的Canvas,而这个Canvas是只读的,难到在这个模板里为该项增加了一个写方法?
    我注意到了这个Canvas是在MouseUp的时候释放的,问题是原来窗体的Canvas值已经被改了!。
    最大的一个问题,为什么一定要在桌面画布上画而不直接在窗口画布上画,有什么特别的原因吗?
      

  13.   

    To (蒲石) 
    呵呵,没有这个意思,别介意,手忙脚乱Ing..........
    ------------------------------------
    奇怪的问题还有
      imgCaptionMouseDown中
      Canvas := TCanvas.Create;
    这里会默认引用窗体本身的Canvas,而这个Canvas是只读的,难到在这个模板里为该项增加了一个写方法?
    我注意到了这个Canvas是在MouseUp的时候释放的,问题是原来窗体的Canvas值已经被改了!。
    最大的一个问题,为什么一定要在桌面画布上画而不直接在窗口画布上画,有什么特别的原因吗?
    -------------------------------------
    我是不知道如何回答你的问题。你是否可以用例子阐述你想要说表达的意思呢?----------------
    沉沦中..........
      

  14.   

    哦,看来是我表述有问题!好!首先你的Canvas是哪里来的?
    procedure TMyForm.imgCaptionMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      if (Button=mbLeft)and(ssLeft in Shift)then
      begin
        canmove:=true;
        Canvas:=TCanvas.Create;
        with Canvas do就你上面的回答我估计你是专门声明了一个Canvas属性,把原来的TForm固有的Canvas属性覆盖
    了,或者是声明了一个全局Canvas,不知道是否是这样?也就是说我不知道你的这个Canvas是哪里
    来的。最大的一个问题,为什么一定要在桌面画布上画而不直接在窗口画布上画,有什么特别的原因吗?    Canvas:=TCanvas.Create;
        with Canvas do
        begin
          pen.Style :=psdot;
          brush.Style :=bsClear;
          pen.Width :=2;
          Pen.Mode :=pmNotXor;
          Handle :=GetDC(0);
          Rectangle(left,top,Left+width,top+height);
          curPoint.X :=X;
          curPoint.Y :=Y;
          oldPoint.X :=Left;
          oldPoint.Y :=Top;
        end;        
    其中GetDC(0)就是获取桌面画布,以后的Rectangle就是对桌面画布进行操作了,
    那么为什么要在桌面上画呢?也许看到你模板的效果就知道了,可惜我这里只能猜了。
      

  15.   

    如果是要模拟窗口移动时的虚线框,那真的不如重载WM_NCHITTEST消息!
      

  16.   

    To 蒲石
    这儿有一个问题就是,桌面去窗体的区别,我用它做模板并不代表我的窗体不做任何方面的修改,而如果用桌面Canvas的话,留下的空间就更大了些,反之,如果以窗体作为Canvas的话,那么基本就没有什么空间而言了,再者,桌面和窗体有一个前后的次序。以后的程序中,我不需对桌面进行操作,但可以对窗体进行操作,但是,这儿的桌面风格还是统一的。呵呵......
    我的API很弱......惭愧中......蒲石兄难得如此直言,真的很感谢。----------------
    沉沦中..........
      

  17.   

    嗬嗬,Api之类的问题,我也不太行!所以我正在挖一个SDK的高手来我们公司。他玩SDK简直神了。我们正需要这样的人才!==========================================to  zwjchina(蒲石)  :)你难道不想进研发组?????????????==========================================不想才怪,就比如不想元帅的士兵不是好士兵一样。但是,我需要的是把下达给我的任务做好。而不是做任务的时候讨论研发组的模板有没有问题。
      

  18.   

    http://expert.csdn.net/Expert/topic/1863/1863813.xml
      

  19.   

    超时连接具体在设置ConnectionString -> 数据链接属性 -> 高级 ->连接超时设定
    好像默认的是120S,记不很清楚了。----------------
    沉沦中..........
      

  20.   

    EEEEEEEEEEEEEEE,刚睡醒……上来看看师姐弄得咋样了。
      

  21.   

    首先,谢谢爱翔将这个贴子提了起来。然而,决定是星期五结贴的。
    以下给出我写的一部分代码,在一定的程序上实现的UI分离和规则的的分离,部分地方给以说明希有用:unit Term001Unt;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, Grids, DBGrids, StdCtrls, ExtCtrls, Buttons, ToolWin,ADODB,
      DB,DataModuleUnt;type
      TTerm001Frm = class(TForm)
        ToolBar1: TToolBar;
        SpeedButton7: TSpeedButton;
        SpeedButton6: TSpeedButton;
        SpeedButton5: TSpeedButton;
        SpeedButton4: TSpeedButton;
        SpeedButton3: TSpeedButton;
        SpeedButton9: TSpeedButton;
        SpeedButton8: TSpeedButton;
        SpeedButton1: TSpeedButton;
        SpeedButton12: TSpeedButton;
        SpeedButton11: TSpeedButton;
        SpeedButton10: TSpeedButton;
        SpeedButton2: TSpeedButton;
        Panel1: TPanel;
        Panel2: TPanel;
        StatusBar1: TStatusBar;
        DBGrid1: TDBGrid;
        procedure SpeedButton7Click(Sender: TObject);
        procedure SpeedButton6Click(Sender: TObject);
        procedure SpeedButton5Click(Sender: TObject);
        procedure SpeedButton4Click(Sender: TObject);
        procedure SpeedButton3Click(Sender: TObject);
        procedure SpeedButton9Click(Sender: TObject);
        procedure SpeedButton8Click(Sender: TObject);
        procedure SpeedButton1Click(Sender: TObject);
        procedure SpeedButton12Click(Sender: TObject);
        procedure SpeedButton2Click(Sender: TObject);
        procedure DBGrid1CellClick(Column: TColumn);
        procedure FormCreate(Sender: TObject);
        procedure FormShow(Sender: TObject); { }
      private
        { Private declarations }
        procedure EnterToTab(var Msg:TMsg;var Handled:Boolean);
        Procedure DataShow ;virtual;
        Procedure InitInf;
        Procedure SaveData;virtual;
        Procedure EditData;virtual;
      public
        {Public declarations }
        FADOQuery : TADOQuery;
    {这儿为什么要这样处理?它将具体的实现与具体的控件进行分离,此处甚至可以是数据引擎的无关性。}
        FSQLStr : String;
      Published
      end;var
      Term001Frm: TTerm001Frm;implementation
    {$R *.dfm}{ TTerm001Frm }
    procedure TTerm001Frm.SpeedButton7Click(Sender: TObject);
    begin
      if (FADOQuery.State <> dsInsert) and
        (FADOQuery.State <> dsEdit) and
        (FADOQuery.Active)  then
      begin
        FADOQuery.Append;
      end;
    end;procedure TTerm001Frm.SpeedButton6Click(Sender: TObject);
    begin
      if (FADOQuery.State <> dsInsert) and
        (FADOQuery.State <> dsEdit) and
        (FADOQuery.Active) and
        (Not FADOQuery.IsEmpty) then
      begin
        FADOQuery.Edit;
      end;
    end;procedure TTerm001Frm.SpeedButton5Click(Sender: TObject);
    begin
      if (FADOQuery.State <> dsInsert) and
        (FADOQuery.State <> dsEdit) and
        (FADOQuery.Active) and
        (Not FADOQuery.IsEmpty) then
      begin
        if Application.MessageBox('您确定要删除当前记录吗?','提示',
          MB_OKCANCEL + MB_ICONINFORMATION) = MROK then
          FADOQuery.Delete;
      end;
      StatusBar1.Panels[1].Text := '现有数据量:' + IntToStr(FADOQuery.RecordCount) + ' 条';
    end;procedure TTerm001Frm.SpeedButton4Click(Sender: TObject);
    begin
      if (FADOQuery.State = dsInsert) or
        (FADOQuery.State = dsEdit) then
      begin
        FADOQuery.Cancel;
        DataShow;
      end;
    end;procedure TTerm001Frm.SpeedButton3Click(Sender: TObject);
    begin
      if (FADOQuery.State = dsInsert) or
        (FADOQuery.State = dsEdit) then
      begin
        {这儿我删除了一段语句,其实现的是操作检查,然而可能理解起来不是很好,所以删除掉了。}
        with FADOQuery do
        begin
          Case FADOQuery.State of
            dsInsert : Begin
                         SaveData;
                       end;
            dsEdit   : Begin
                         EditData;
                       end;
          end;
          Try
            Post;
          Except
            Application.MessageBox('对不起,数据操作失败,请重新再试','提示',
              MB_OK + MB_ICONINFORMATION);
            Exit;
          end;
        end;
      end else
        Exit;
      Application.MessageBox('恭喜您,数据操作成功,点确定返回','提示',
         MB_OK + MB_ICONINFORMATION);
      DataShow;
      StatusBar1.Panels[1].Text := '现有数据量:' + IntToStr(FADOQuery.RecordCount) + ' 条';
    end;procedure TTerm001Frm.SpeedButton9Click(Sender: TObject);
    begin
      if (FADOQuery.State <> dsInsert) and
        (FADOQuery.State <> dsEdit) and
        (FADOQuery.Active) and
        (Not FADOQuery.IsEmpty) then
      begin
        FADOQuery.First;
        DataShow;
      end;
    end;procedure TTerm001Frm.SpeedButton8Click(Sender: TObject);
    begin
      if (FADOQuery.State <> dsInsert) and
        (FADOQuery.State <> dsEdit) and
        (FADOQuery.Active) and
        (Not FADOQuery.IsEmpty) then
      begin
        FADOQuery.Prior;
        DataShow;
      end;
    end;procedure TTerm001Frm.SpeedButton1Click(Sender: TObject);
    begin
      if (FADOQuery.State <> dsInsert) and
        (FADOQuery.State <> dsEdit) and
        (FADOQuery.Active) and
        (Not FADOQuery.IsEmpty) then
      begin
        FADOQuery.Next;
        DataShow;
      end;
    end;procedure TTerm001Frm.SpeedButton12Click(Sender: TObject);
    begin
      if (FADOQuery.State <> dsInsert) and
        (FADOQuery.State <> dsEdit) and
        (FADOQuery.Active) and
        (Not FADOQuery.IsEmpty) then
      begin
        FADOQuery.Last;
        DataShow;
      end;
    end;procedure TTerm001Frm.SpeedButton2Click(Sender: TObject);
    begin
      Close;
    end;procedure TTerm001Frm.DataShow;
    begin
      {可以写一些公用窗体的默认处理过程,当然,也可以不写,其它继承的窗口只需要写自己的处理方法便可}
    end;procedure TTerm001Frm.EditData;
    begin
      {可以写一些公用窗体的默认处理过程,当然,也可以不写,其它继承的窗口只需要写自己的处理方法便可}
    end;procedure TTerm001Frm.InitInf;
    begin
      {在这儿,我的初始化仅仅作到这几步,可以根据自己的需求来进行始初化,它是影响到所有的了窗体的}
      with FADOQuery do
      begin
        if Active then
          Active := False;
        SQL.Clear;
        SQL.Add(FSQLStr);
        if DataModuleFrm.dq <> '....' then  //此处将作为一个条件判断值来让模板灵活
          SQL.Add(' where dq = ''' + DataModuleFrm.dq + '''');
        Prepared;
        Open;
      end;
    end;procedure TTerm001Frm.SaveData;
    begin
      {可以写一些公用窗体的默认处理过程,当然,也可以不写,其它继承的窗口只需要写自己的处理方法便可}
    end;
    procedure TTerm001Frm.DBGrid1CellClick(Column: TColumn);
    begin
      DataShow;
    end;procedure TTerm001Frm.FormCreate(Sender: TObject);
    begin
      {在这儿,我的初始化仅仅作到这几步,可以根据自己的需求来进行始初化,它是影响到所有的了窗体的}
      Self.BorderStyle := bsSingle;
      Self.BorderIcons := [biSystemMenu,biminimize];
      Application.OnMessage := EnterToTab;
    end;procedure TTerm001Frm.FormShow(Sender: TObject);
    begin
      InitInf;
      StatusBar1.Panels[0].Text :=  DataModuleFrm.user;
      StatusBar1.Panels[1].Text := '现有数据量:' + IntToStr(FADOQuery.RecordCount) + ' 条';
    end;procedure TTerm001Frm.EnterToTab(var Msg: TMsg; var Handled: Boolean);
    begin
      if Msg.message=WM_KeyDown then
        if Msg.WParam=VK_Return then
          Keybd_Event(VK_Tab,0,0,0);
    end;end.
    ----------------
    沉沦中..........
      

  22.   

    引用:
    unit jjdy_czcgsInfUnt;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Term001Unt, ComCtrls, Grids, DBGrids, ExtCtrls, Buttons, ToolWin,
      StdCtrls;type
      Tjjdy_czcgsInfFrm = class(TTerm001Frm)
        ComboBox1: TComboBox;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure DBGrid1CellClick(Column: TColumn);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        Procedure DataShow ;override;
        Procedure SaveData; override;
        Procedure EditData;override;
        Procedure ComponentsInit;
        Procedure Temp;      
      end;var
      jjdy_czcgsInfFrm: Tjjdy_czcgsInfFrm;implementation
    Uses
      DataModuleUnt;{$R *.dfm}{ Tjjdy_czcgsInfFrm }procedure Tjjdy_czcgsInfFrm.ComponentsInit;
    var
      vIndex : Integer;
    begin
      for vIndex := 0 to Panel2.ControlCount - 1 do
      begin
        if Panel2.Controls[vIndex] Is TEdit then
          if Trim(TEdit(Panel2.Controls[vIndex]).Text) = '' then
            TEdit(Panel2.Controls[vIndex]).Text := '0';
      end;
    end;procedure Tjjdy_czcgsInfFrm.DataShow;
    begin
      inherited;
      with FADOQuery do
      begin
        ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(FieldByName('Dq').AsString);
        Edit1.Text := FieldByName('LTDName').AsString;
        Edit2.Text := FieldByName('clsl').AsString;
      end;
      ComponentsInit;
    end;procedure Tjjdy_czcgsInfFrm.EditData;
    begin
      inherited;
      Temp;
    end;procedure Tjjdy_czcgsInfFrm.SaveData;
    begin
      inherited;
      FADOQuery.FieldByName('DQ').AsString := ComboBox1.Text;
      Temp;
    end;procedure Tjjdy_czcgsInfFrm.Temp;
    begin
      ComponentsInit;
      with FADOQuery do
      begin
        FieldByName('LTDName').AsString := Edit1.Text;
        FieldByName('clsl').AsString := Edit2.Text;
      end;
    end;procedure Tjjdy_czcgsInfFrm.DBGrid1CellClick(Column: TColumn);
    begin
      inherited;
      DataShow;
    end;procedure Tjjdy_czcgsInfFrm.FormCreate(Sender: TObject);
    begin
      inherited;
      FSQLStr := 'Select * From zhbgs_jjdy_czcgsInf';
      FADOQuery := DataModuleFrm.jjdy_czcgsInfADOQuery;
      DBGrid1.DataSource := DataModuleFrm.jjdy_czcgsInfDataSource;
    end;end.
    ////////////////////我已经将一些规则处理直接写到这个单元本身了,如:
    procedure TPublicClass.KJ_Time(Sender: Tobject; var Key: Char);
    begin
      if Length(TEdit(Sender).Text) = 10 then
      begin
        Key := #0;
        Key := #13;
      end;
      if Key=#8 then
      begin
        TEdit(Sender).Clear;
        Key:=#0;
        Exit;
      end;
      if Not (Key In ['0'..'9',#13,'-'] ) then
      begin
        Key:=#0;
        Exit;
      end;
      if Length(TEdit(Sender).Text) = 4 then
      begin
        Try
          if Yearof(Now) < StrToInt(TEdit(Sender).Text ) then
          begin
            Key := #0;
            Exit;
          end;
          TEdit(Sender).Text := TEdit(Sender).Text + '-';
          TEdit(Sender).SelStart := 5;
        Except
          ;
        end;
      end;
      if Length(TEdit(Sender).Text) = 4 then
      begin
        if Yearof(Now) < StrToInt(TEdit(Sender).Text) then
        begin
          Key := #0;
          Exit;
        end;
        TEdit(Sender).Text := TEdit(Sender).Text + '-';
        TEdit(Sender).SelStart := 5;
      end;
      if Length(TEdit(Sender).Text) = 7 then
      begin
        TEdit(Sender).Text := TEdit(Sender).Text + '-';
        TEdit(Sender).SelStart := 8;
      end;
      If Key = #13 then
      begin
        if Length(TEdit(Sender).Text) < 4 then
        begin
          Application.MessageBox('对不起,您没有正确的添加时间格式' + #13 + '例如' +
                                  '正确的时间格式是:2002-10-03','操作提示'
                                 ,MB_OK + MB_ICONINFORMATION);
          Key := #0;
          Exit;
        end;
        Try
          StrToDateTime(TEdit(Sender).Text);
        Except
          Application.MessageBox('对不起,您没有正确的添加时间格式' + #13 + '例如' +
                                  '正确的时间格式是:2002-10-03','操作提示'
                                 ,MB_OK + MB_ICONINFORMATION);
          Key := #0;
          Exit;
        end;
      end;   
     if Length(TEdit(Sender).Text) = 5 then
      begin
        begin
          if StrToInt(Key )> 1 then
          begin
            TEdit(Sender).SelStart:=3;
            TEdit(Sender).Text := TEdit(Sender).Text + '0';
            TEdit(Sender).SelStart:=8;
            Exit;
          end;
        end ;
      end;
      if Length(TEdit(Sender).Text) = 1 then
        if StrToInt(TEdit(Sender).Text) = 0 then
          begin
            TEdit(Sender).SelStart:=3;
            TEdit(Sender).Text := '20' + copy(TEdit(Sender).Text,1,2);//+copy(TEdit(Sender).text,6,1);//'-';
            TEdit(Sender).SelStart:=3;
            Exit;
          end;
    end;
    function TPublicClass.InsertValueFH(var StrValue: String;
      TableNameValue: String; FieldList, FieldValue,
      TypeValue: array of String): Boolean;
    var
      AIndex : Integer;
      AStr : String;
    begin
      //..
      Result := True;
      if ( High(FieldList) - Low(FieldList)) <> (High(FieldValue) - Low(FieldValue)) then
      begin
        StrValue := '';
        Result := False;
        Exit;
      end;
      StrValue := 'Insert Into ' + TableNameValue + '(';
      AStr := ' Values(';
      For AIndex := Low(FieldList) to High(FieldList) do
      begin
        if AIndex <> High(FieldList) then
        begin
          StrValue := StrValue + FieldList[AIndex] + ' , ';
          if TypeValue[AIndex] = 'Str' then
            AStr := AStr + #39 + FieldValue[AIndex] + #39 + ' , ' else
            AStr := AStr + FieldValue[AIndex] + ' , ';
        end else
        begin
          StrValue := StrValue + FieldList[AIndex] + ') ';
          if TypeValue[AIndex] = 'Str' then
            AStr := AStr + #39 + FieldValue[AIndex] + #39 + ')' else
            AStr := AStr + FieldValue[AIndex] + ' ) ';
        end;
      end;
      StrValue := StrValue + AStr;
    end;----------------
    沉沦中..........
      

  23.   

    新窗口(新功能) 调用 模板,创建新窗口的参数(从模板override),然后再调用业务逻辑单元(本单元封装了很多业务逻辑)小小老师,你给指点指点?
      

  24.   

    新窗口(新功能) 调用 模板,创建新窗口的参数(从模板override),然后再调用业务逻辑单元(本单元封装了很多业务逻辑)小小老师,你给指点指点?
      

  25.   

    To feng93017(Edge) 
    还需要说什么呢?偶的两个学生都不在......----------------
    沉沦中..........