首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

为何点击“新建”按钮后,数据集状态不改变

2012-11-04 
为什么点击“新建”按钮后,数据集状态不改变?我在父窗口中,写了一个自定义事件,目的是根据数据集状态(dsInse

为什么点击“新建”按钮后,数据集状态不改变?
我在父窗口中,写了一个自定义事件,目的是根据数据集状态(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是什么类型的?

热点排行