新建一个项目pruject1,做好一个form1(上边包括几个form的公用控件及其代码),然后file\new\other在new items对话框中选择pruject1项,然后再选择form1,按ok,这样你就建立了继承form1的一个新form.很简单,我是菜鸟,不会用代码,不过这个方法很有效。

解决方案 »

  1.   

    窗体继承是Delphi开发中应用最普遍,最简单的一种,对于整个系统的界面风格一致性有很大帮助,但基类窗体也不宜太细微化,否则他的后代就丧失了灵活性,反倒失去了继承的优势。
      

  2.   

    代码来了:
    unit untBFrm;interfaceuses
      untInit, untBasicServices, Grids, DBGrids,
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ExtCtrls, DBCtrls,DB;//type TDispType=(dtNormal, dtWarning, dtError ,dtInformation, dtConfirmation, dtCustom);type
      TfrmBase = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure ClearText(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);virtual;
        procedure TitleClick(Column: TColumn);virtual;
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
      private//    FGetUserNo: String;
    //    FGetSysDate: TDateTime;
        function GetSysDate:TDateTime;
        function GetUserNo:String;//    procedure ourDeleted(ANavigator: TDBNavigator; Button: TNavigateBtn;
    //      ADeleteFieldName, AValue: string);
      public
    {    bLogicDelete:boolean;   //逻辑删除还是物理删除,True时Status='D'
        
        procedure ANavigatorBeforeAction(Sender: TObject; Button: TNavigateBtn;
          AFieldName, Avalue: string);   }    procedure DispMsg(MsgId:String; const DispType:TDispType=dtNormal; Showed:Boolean=True);
        property SysDate: TDateTime read GetSysDate;
        property UserNo: String read GetUserNo;
      end;var
      frmBase: TfrmBase;implementation{$R *.DFM}{
    // 在Navigator的BeforeAction中调用
    procedure TfrmBase.ANavigatorBeforeAction(Sender: TObject;
      Button: TNavigateBtn; AFieldName, Avalue: string);
    begin
      case Button of
        nbFirst  : ;
        nbPrior  : ;
        nbNext   : ;
        nbLast   : ;
        nbInsert : ;
        nbDelete :
          begin
            if bLogicDelete then
            begin
              ourDeleted(TDBNavigator(Sender), Button, AFieldName, Avalue);
              abort;
            end;
          end;
        nbEdit   : ;
        nbPost   : ;
        nbCancel : ;
        nbRefresh: ;
      end;end;// 使用 TDBNavigator 上的删除时要调用本函数
    // ADeleteFieldName-->一般是状态栏位,AValue-->标记为删除的值
    procedure TfrmBase.ourDeleted(ANavigator: TDBNavigator;
      Button: TNavigateBtn; ADeleteFieldName, AValue: string);
    var deleteField:TField;
        strOld,strNow:string;
    begin
      deleteField:=ANavigator.DataSource.DataSet.FindField(ADeleteFieldName);
      if deleteField=nil then
      begin
        showmessage(ADeleteFieldName+' is not exist !');
        Exit;
      end;
      strNow:=UpperCase(trim(AValue));
      strOld:=UpperCase(trim(deleteField.AsString));
      if strOld<>strNow then
      begin
        ANavigator.DataSource.DataSet.Edit;
        if deleteField.ReadOnly then
          deleteField.ReadOnly:=False;
        deleteField.AsString:=strNow;
        ANavigator.DataSource.DataSet.Post;
      end;
    end;     }
    function TfrmBase.GetSysDate;
    begin
      //Result:=frmLogin.SysDate; //This should be gotten after system login
      Result:=now;
    end;function TfrmBase.GetUserNo;
    begin
      //Result:=frmLogin.UserNo; //This should be gotten after system login
      Result:='User1';  
    end;procedure TfrmBase.DispMsg(MsgId:String; const DispType:TDispType=dtNormal; Showed:Boolean=True);
    var
      MsgText: string;
    begin
      MsgText:=frmLogin.GetMsg(MsgId, Showed);
      if DispType=dtNormal then
        Application.MessageBox(PChar(MsgText),PChar(Screen.ActiveForm.Caption),MB_OK)
      else if DispType=dtError then
        MessageDlg(MsgText,mtError,[mbok],0)
      else if DispType=dtWarning then
        MessageDlg(MsgText,mtWarning,[mbok],0)
      else
        Exception.Create('Invalid DispType');
    end;procedure TfrmBase.FormCreate(Sender: TObject);
    begin
      //CheckRights(self, UserInfor);
    end;procedure TfrmBase.ClearText(Sender: TObject);
    var
      i:integer;
      aParent:TWinControl;
    begin
      aParent:=TWinControl(Sender).Parent;
      if aParent=nil then Exit;  for i := 0 to aParent.ControlCount-1 do
        if aParent.Controls[I] is TEdit then
          TEdit(aParent.Controls[I]).Clear
    {    else if aParent.Controls[I] is TComboBox then
          TComboBox(aParent.Controls[I]).Text:='';   }
        else if (aParent.Controls[I] is TComboBox)then
          if trim(TComboBox(aParent.Controls[I]).Items[0])='' then
            TComboBox(aParent.Controls[I]).ItemIndex:=0
          else
            TComboBox(aParent.Controls[I]).Text:='';  
    end;procedure TfrmBase.FormShow(Sender: TObject);
    var
      i:integer;
    begin
      for i := 0 to ComponentCount-1 do
        if components[i] is TDateTimePicker then
          TDateTimePicker(components[I]).Date:=date;  
    end;procedure TfrmBase.DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
      if gdSelected in State then Exit;
      if (TDBGrid(Sender).DataSource = nil) or (TDBGrid(Sender).DataSource.DataSet = nil) then Exit;  if TDBGrid(Sender).DataSource.DataSet.RecNo mod 2 = 0 then
        TDBGrid(Sender).Canvas.Brush.Color := clInfoBk
      else
        TDBGrid(Sender).Canvas.Brush.Color := RGB(191, 255, 223);  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);  TDBGrid(Sender).Canvas.Pen.Color := $00C08000;
      TDBGrid(Sender).Canvas.MoveTo(Rect.Left, Rect.Bottom);
      TDBGrid(Sender).Canvas.LineTo(Rect.Right, Rect.Bottom);
      TDBGrid(Sender).Canvas.LineTo(Rect.Right, Rect.Top);
    end;procedure TfrmBase.TitleClick(Column: TColumn);
    begin
      untBasicServices.DBGridTitleSort(Column);
    end;procedure TfrmBase.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    var
      i:integer;
      bfalg:Boolean;
      DataSource:TDataSource;
    begin
      inherited;
      bfalg:=False;
      for i := 0 to ComponentCount-1 do
        if Components[i] is TDBEdit then
        begin
          DataSource:=TDBEdit(Components[I]).DataSource;
          if DataSource=nil then Continue;
          bfalg:=(DataSource.State in [dsEdit,dsInsert]);
          break;
        end
        else
        if Components[i] is TDBComboBox then
        begin
          DataSource:=TDBComboBox(Components[I]).DataSource;
          if DataSource=nil then Continue;
          bfalg:=(DataSource.State in [dsEdit,dsInsert]);
          break;
        end
        else
        if Components[i] is TDBMemo then
        begin
          DataSource:=TDBMemo(Components[I]).DataSource;
          if DataSource=nil then Continue;
          bfalg:=(DataSource.State in [dsEdit,dsInsert]);
          break;
        end;  if bfalg then
      begin
        MessageDlg('You are Editting data, please Save or Cancel Before Exit!',
                   mtWarning,[mbOk], 0);
        CanClose:=False;
      end
      else CanClose:=True;end;end.
      

  3.   

    这个是继承上一个的。现在感觉这样作也有不好的地方,想改用FRAME作这些可能
    会好点unit untNFrm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      UNTBFRM, ExtCtrls, ImgList, ComCtrls, Menus, ToolWin, ActnList, StdCtrls,
      Buttons;type
      TfrmNormal = class(TfrmBase)
        stb1: TStatusBar;
        iml1: TImageList;
        acl1: TActionList;
        pnl1: TPanel;
        spd1: TSpeedButton;
        tmr1: TTimer;
        procedure spd1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmNormal: TfrmNormal;implementation{$R *.DFM}procedure TfrmNormal.spd1Click(Sender: TObject);
    begin
      inherited;
      self.Close;
    end;end.