?? comedit.pas
字號:
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 + -