⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comedit.pas

📁 delphi作得信息业进销存源码.功能全面,运行稳定.
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit ComEdit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
	StdCtrls, Buttons, Mask, DBCtrls, ExtCtrls, DB, DBClient, Common, Variants;

type
	TfrmComEdit = class(TForm)
		Bevel1: TBevel;
    btnInsert: TBitBtn;
    btnOk: TBitBtn;
    btnCancel: TBitBtn;
		Label1: TLabel;
    DBEdit1: TDBEdit;
    DBNavigator1: TDBNavigator;
    procedure FormShow(Sender: TObject);virtual;
    procedure btnInsertClick(Sender: TObject);virtual;
		procedure btnOkClick(Sender: TObject);virtual;
		procedure btnCancelClick(Sender: TObject);virtual;
		procedure FormKeyDown(Sender: TObject; var Key: Word;
			Shift: TShiftState);virtual;
		procedure FormClose(Sender: TObject; var Action: TCloseAction);virtual;
		procedure dsOnNewRecord(DataSet: TDataSet);virtual;
		procedure dsAfterInsert(DataSet: TDataSet);virtual;
		procedure dsBeforeEdit(DataSet: TDataSet);virtual;
		procedure dsBeforePost(DataSet: TDataSet);virtual;
		procedure dsAfterPost(DataSet: TDataSet);virtual;
		procedure dsBeforeScroll(DataSet: TDataSet);virtual;
		procedure dsAfterScroll(DataSet: TDataSet);virtual;
    procedure dsAfterApplyUpdates(Sender: TObject;
      var OwnerData: OleVariant);virtual;
		procedure sDataChange(Sender: TObject; Field: TField);virtual;
		procedure DBNavigator1BeforeAction(Sender: TObject;
			Button: TNavigateBtn);virtual;
    procedure MyAfterApplyUpdates;virtual;
    function OldValue(FileName: string): Variant;virtual;
	private
		{ Private declarations }
		cdsEve: cdsEventsArray;
		IsActive: boolean;
  public
    { Public declarations }
    strState: string;
    dsEdits: TClientDataSet;
    strKeyFields: string;
    blnSetID: boolean;
    dsNew: TDataSource;
    arrEdits: Variant;
	end;

var
  frmComEdit: TfrmComEdit;

implementation

uses Main, Dm, Select, SetDate, SetCal;

{$R *.DFM}

//Form.Show
procedure TfrmComEdit.FormShow(Sender: TObject);
var
  i: integer;
  dsOld: TDataSource;
begin
  screen.Cursor := crHourGlass;
  self.Top := frmMain.Top + frmMain.Height - self.Height - 4;
  self.left := frmMain.Width - self.Width - 8;
  dsOld := DBEdit1.DataSource;
  if dsNew = nil then
    dsNew := dsOld;
  for i := 0 to ComponentCount - 1 do
  begin
    if (Components[i] is TEdit) then
    begin
  		if (TEdit(self.Components[i]).ReadOnly) or not (TEdit(self.Components[i]).Enabled) then
      begin
				TEdit(self.Components[i]).Color := cl3DLight;
				TEdit(self.Components[i]).TabStop := False;
      end;
    end else
    if (Components[i] is TDBEdit) then
    begin
      if (TDBEdit(Components[i]).DataSource = nil) or
         (TDBEdit(Components[i]).DataSource = dsOld) then
        TDBEdit(self.Components[i]).DataSource := dsNew;
  		if (TDBEdit(self.Components[i]).ReadOnly) or not (TDBEdit(self.Components[i]).Enabled) then
      begin
				TDBEdit(self.Components[i]).Color := cl3DLight;
				TDBEdit(self.Components[i]).TabStop := False;
      end;
    end else
    if (Components[i] is TDBText) then
    begin
      if (TDBText(Components[i]).DataSource = nil) or
         (TDBText(Components[i]).DataSource = dsOld) then
        TDBText(self.Components[i]).DataSource := dsNew;
    end else
    if (Components[i] is TDBComboBox) then
    begin
      if (TDBComboBox(Components[i]).DataSource = nil) or
         (TDBComboBox(Components[i]).DataSource = dsOld) then
        TDBComboBox(self.Components[i]).DataSource := dsNew;
    end else
    if (Components[i] is TDBRadioGroup) then
    begin
      with TDBRadioGroup(Components[i]) do
        ItemIndex := Values.IndexOf(Field.AsString);
    end;
  end;
  dsEdits := TClientdataset(DBEdit1.DataSource.DataSet);
  IsActive := false;
  if not ( dsEdits.Active ) then
    dsEdits.Open
  else
    IsActive := true;
 	arrEdits := VarArrayCreate([0, dsEdits.FieldCount - 1], varVariant);
  if strKeyFields = null then
    strKeyFields := ''
  else
    strKeyFields := UpperCase(strKeyFields);
  if strKeyFields <> '' then
    strKeyFields := strKeyFields + ';';
  if (strState = 'A') or (strState = 'I') then
  begin
    if Self.Caption <> Self.Name then
      self.Caption := self.Caption + '资料增加'
    else
      self.Caption := '资料增加';
    self.btnInsert.Visible := True;
		self.DBNavigator1.Visible := False;
    if strState = 'A' then
      dsEdits.Append
    else
			dsEdits.Insert;
    frmMain.ilsSub.GetIcon(3, self.Icon);
	end else
	begin
    if Self.Caption <> Self.Name then
      self.Caption := self.Caption + '资料修改'
    else
      self.Caption := '资料修改';
		self.btnInsert.Visible := False;
		DBNavigator1.DataSource := DBEdit1.DataSource;
		self.DBNavigator1.Visible := True;
		frmMain.ilsSub.GetIcon(4, self.Icon);
	end;
	cdsEve := SaveCDSEvents(dsEdits);
	dsEdits.OnNewRecord := dsOnNewRecord;
	dsEdits.AfterInsert := dsAfterInsert;
	dsEdits.BeforeEdit := dsBeforeEdit;
	dsEdits.BeforePost := dsBeforePost;
	dsEdits.AfterPost := dsAfterPost;
	dsEdits.BeforeScroll := dsBeforeScroll;
	dsEdits.AfterScroll := dsAfterScroll;
	dsEdits.AfterApplyUpdates := dsAfterApplyUpdates;
	DBEdit1.DataSource.OnDataChange := sDataChange;
	if (strState = 'A') or (strState = 'I') then
		dsOnNewRecord(dsEdits);
  if DBEdit1.Visible then
    DBEdit1.SetFocus;
  screen.Cursor := crDefault;
end;

//Form.Close
procedure TfrmComEdit.FormClose(Sender: TObject; var Action: TCloseAction);
begin
	if IsActive then
		dsEdits.Open;
	RestoreCDSEvents(dsEdits, cdsEve);
	DBEdit1.DataSource.OnDataChange := nil;
end;

//btnInsert.Click
procedure TfrmComEdit.btnInsertClick(Sender: TObject);
begin
  screen.Cursor := crHourGlass;
  try
    if dsEdits.State in [dsInsert, dsEdit] then
      dsEdits.Post;
    if dsEdits.ChangeCount > 0 Then
      if dsEdits.ApplyUpdates(0) > 0 then
        Abort;
    MyAfterApplyUpdates;
    if strState = 'A' then
      dsEdits.Append
    else
      dsEdits.Insert;
  finally
    screen.Cursor := crDefault;
    if DBEdit1.Visible then
      DBEdit1.SetFocus;
  end;
end;

//btnOk.Click
procedure TfrmComEdit.btnOkClick(Sender: TObject);
begin
  screen.Cursor := crHourGlass;
  try
    if dsEdits.State in [dsInsert,dsEdit] then
      dsEdits.Post;
    if dsEdits.ChangeCount > 0 Then
      if dsEdits.ApplyUpdates(0) > 0 then
        Abort;
    MyAfterApplyUpdates;
  finally
    screen.Cursor := crDefault;
  end;
  ModalResult := Mrok;
  Close;
end;

//btnCancel.Click
procedure TfrmComEdit.btnCancelClick(Sender: TObject);
begin
  dsEdits.Cancel;
  if dsEdits.ChangeCount > 0 then
    dsEdits.CancelUpdates;
  Close;
end;

//Form.KeyDown
procedure TfrmComEdit.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  intTop, intLeft: integer;
begin
  case Key of
    VK_RETURN:
      begin
        if Shift = [ssShift] then
          Perform(WM_NEXTDLGCTL, 1, 0)
        else
          Perform(WM_NEXTDLGCTL, 0, 0);
      end;
    VK_F4, VK_DOWN:
      if (Key = VK_F4) or ((Key = VK_DOWN) and (Shift = [ssAlt])) then
        if screen.ActiveControl is TDBEdit then
        begin
          if Assigned(TDBEdit(screen.ActiveControl).OnDblClick) then
            TDBEdit(screen.ActiveControl).Perform(WM_LBUTTONDBLCLK, 0, 0)
          else if TDBEdit(screen.ActiveControl).Field is TStringField then
          begin
            frmSelect.DataSet := TDBEdit(screen.ActiveControl).DataSource.DataSet;
            frmSelect.FieldName := TDBEdit(screen.ActiveControl).DataField;
            frmSelect.ShowModal;
          end
          else if TDBEdit(screen.ActiveControl).Field is TDateTimeField then
          begin
            intTop := screen.ActiveControl.ClientOrigin.y + screen.ActiveControl.Height;
            if intTop + frmSetDate.Height > screen.Height then
              intTop := screen.ActiveControl.ClientOrigin.y - frmSetDate.Height - 2;
            intLeft := screen.ActiveControl.ClientOrigin.x - 2;
            if intLeft + frmSetDate.Width > screen.Width then
              intLeft := screen.Width - frmSetDate.Width - 2;
            frmSetDate.Top := intTop;
            frmSetDate.Left := intLeft;
            frmSetDate.DataSet := TDBEdit(screen.ActiveControl).DataSource.DataSet;
            frmSetDate.FieldName := TDBEdit(screen.ActiveControl).DataField;
            frmSetDate.CurDate := TDBEdit(screen.ActiveControl).Field.AsDateTime;
            frmSetDate.ShowModal;
          end
          else if TDBEdit(screen.ActiveControl).Field is TNumericField then
          begin
            intTop := screen.ActiveControl.ClientOrigin.y + screen.ActiveControl.Height;
            if intTop + frmSetCal.Height > screen.Height then
              intTop := screen.ActiveControl.ClientOrigin.y - frmSetCal.Height - 2;
            intLeft := screen.ActiveControl.ClientOrigin.x - 2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -