为什么点击“新建”按钮后,数据集状态不改变?
我在父窗口中,写了一个自定义事件,目的是根据数据集状态(dsInsert,dsEdit、dsBrowse)改变父窗体及子窗体中TEdit、TButton组件的状态(比如dsInsert时,“修改、退出”按钮Enabled为False,“保存、取消”按钮Enabled为True等)。可是运行后,点击“新建”按钮后,数据集状态好像就没有改变,子窗体中所有组件的状态没有发生任何改变。代码如下:
父窗口代码:
public
{ Public declarations }
procedure SetComponentStatus;
function CheckEditValue:Boolean;
end;
var
F_Base_HiddenBase: TF_Base_HiddenBase;
implementation
uses untDataModule;
{$R *.dfm}
procedure TF_Base_HiddenBase.SetComponentStatus;
Var ComCount: Integer;
begin
IF F_DataModule.dsBaseDataSet.DataSet = nil Then
begin
showmessage('空');
exit;
end;
sbtnFirst.Enabled := (F_DataModule.dsBaseDataSet.DataSet.State = dsBrowse) And
(Not F_DataModule.dsBaseDataSet.DataSet.Bof);
sbtnPrior.Enabled := (F_DataModule.dsBaseDataSet.DataSet.State = dsBrowse) And
(Not F_DataModule.dsBaseDataSet.DataSet.Bof);
sbtnNext.Enabled := (F_DataModule.dsBaseDataSet.DataSet.State = dsBrowse) And
(Not F_DataModule.dsBaseDataSet.DataSet.Eof);
sbtnLast.Enabled := (F_DataModule.dsBaseDataSet.DataSet.State = dsBrowse) And
(Not F_DataModule.dsBaseDataSet.DataSet.Eof);
sbtnNew.Enabled := F_DataModule.dsBaseDataSet.DataSet.State = dsBrowse;
sbtnEdit.Enabled := (F_DataModule.dsBaseDataSet.DataSet.State = dsBrowse) And
(Not F_DataModule.dsBaseDataSet.DataSet.Bof) Or
(Not F_DataModule.dsBaseDataSet.DataSet.Eof);
sbtnDelete.Enabled := (F_DataModule.dsBaseDataSet.DataSet.State = dsBrowse) And
(Not F_DataModule.dsBaseDataSet.DataSet.Bof) Or
(Not F_DataModule.dsBaseDataSet.DataSet.Eof);
sbtnSave.Enabled := F_DataModule.dsBaseDataSet.DataSet.State In [dsInsert, dsEdit];
sbtnCancel.Enabled := F_DataModule.dsBaseDataSet.DataSet.State In [dsInsert, dsEdit];
sbtnExit.Enabled := F_DataModule.dsBaseDataSet.DataSet.State = dsBrowse;
For ComCount := 0 To gboxDataSet.ControlCount -1 Do
begin
IF gboxDataSet.Controls[ComCount] IS TEdit Then
begin
(gboxDataSet.Controls[ComCount] AS TEdit).ReadOnly :=
F_DataModule.dsBaseDataSet.DataSet.State = dsBrowse;
end;
end; //不起作用,为什么?
//未完成,未设置TDBGrid在浏览状态时,不能插入/修改数据的功能。
end;
function TF_Base_HiddenBase.CheckEditValue: Boolean;
begin
IF (edtCodeSet.Text = '') OR (edtDataSet.Text = '') Then
begin
MessageBox(0,'对不起,您输入的信息不完整,请重新输入!' + #13#10 + #13#10 +
'本次操作将被取消!','提示:关闭窗口', mb_OK + mb_IconExclaMation);
Abort;
Result := True;
end
ELSE
Result := False;
end;
procedure TF_Base_HiddenBase.sbtnFirstClick(Sender: TObject);
begin
inherited;
F_DataModule.dsBaseDataSet.DataSet.First;
end;
procedure TF_Base_HiddenBase.sbtnPriorClick(Sender: TObject);
begin
inherited;
F_DataModule.dsBaseDataSet.DataSet.Prior;
end;
procedure TF_Base_HiddenBase.sbtnNextClick(Sender: TObject);
begin
inherited;
F_DataModule.dsBaseDataSet.DataSet.Next;
end;
procedure TF_Base_HiddenBase.sbtnLastClick(Sender: TObject);
begin
inherited;
F_DataModule.dsBaseDataSet.DataSet.Last;
end;
procedure TF_Base_HiddenBase.sbtnNewClick(Sender: TObject);
begin
inherited;
F_DataModule.dsBaseDataSet.DataSet.Append;
end;
procedure TF_Base_HiddenBase.sbtnEditClick(Sender: TObject);
begin
inherited;
IF MessageBox(0, '您确定要修改这项数据吗?', '系统询问:修改数据',
mb_YesNo + MB_ICONQUESTION + MB_DEFBUTTON2) = ID_No Then
Abort
Else
F_DataModule.dsBaseDataSet.DataSet.Edit;
end;
procedure TF_Base_HiddenBase.sbtnDeleteClick(Sender: TObject);
begin
inherited;
F_DataModule.dsBaseDataSet.DataSet.Delete;
end;
procedure TF_Base_HiddenBase.sbtnCancelClick(Sender: TObject);
begin
inherited;
F_DataModule.dsBaseDataSet.DataSet.Cancel;
end;
procedure TF_Base_HiddenBase.sbtnExitClick(Sender: TObject);
begin
inherited;
Close;
end;
procedure TF_Base_HiddenBase.edtCodeSetKeyPress(Sender: TObject;
var Key: Char);
begin
inherited;
IF not (key in ['0'..'9',#8]) then
begin
Key:=#0;
MessageBeep(1);
end;
end;
end.
子窗口代码:
{$R *.dfm}
procedure TF_Base_HiddenBase_ForUnitSet.FormCreate(Sender: TObject);
begin
inherited;
With F_DataModule.ADOqyBaseDataSet Do
begin
Close;
SQL.Clear;
SQL.Add('Select * From ForUnitSet Order By ForUnitCode');
Open;
end;
// F_DataModule.dsBaseDataSet.DataSet := F_DataModule.ADOqyBaseDataSet;
SetComponentStatus;
end;
procedure TF_Base_HiddenBase_ForUnitSet.sbtnSaveClick(Sender: TObject);
begin
inherited;
IF Not (CheckEditValue) Then
begin
With F_DataModule.dsBaseDataSet.DataSet Do
begin
FieldByName('ForUnitCode').AsInteger := StrToInt(edtCodeSet.Text);
FieldByName('ForUnit').AsString := edtDataSet.Text;
end;
end;
end;
end.
DataModule代码:
{$R *.dfm}
procedure TF_DataModule.DataModuleCreate(Sender: TObject);
const
sConnBegin = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
sConnEnd = ';Persist Security Info= False';
var
sPathDir: string;
sConn: string;
begin
sPathDir := ExtractFileDir(ParamStr(0));
sConn := sConnBegin + sPathDir + '\DataBase\DataBase.mdb' + sConnEnd;
With ADOConnect Do
begin
Close;
ConnectionString := sConn;
Open;
end;
// dsBaseDataSet.DataSet:=ADOqyBaseDataSet;
end;
procedure TF_DataModule.dsBaseDataSetStateChange(Sender: TObject);
begin
F_Base_HiddenBase.SetComponentStatus;
end;
procedure TF_DataModule.ADOqyBaseDataSetAfterScroll(DataSet: TDataSet);
begin
F_Base_HiddenBase.SetComponentStatus;
end;
end.
说明,自定义事件“SetComponentStatus”分别在子窗口的OnCreate事件、ADOQuery的AfterScroll、DataSource的DataStateChange中调用。
为什么会这样?
分不多,大家帮帮忙。
[解决办法]
断点跟踪是最好的办法
学会使用Ctrl+F5,F7和F8三个键吧!
[解决办法]
断点跟踪是最好的办法
学会使用Ctrl+F5,F7和F8三个键吧!
[解决办法]
IF gboxDataSet.Controls[ComCount] IS TEdit Then
估计是没有执行到,条件不满足,
gboxDataSet是什么类型的?