我建了个公用检索窗体.为BsDialog的窗体.
里面的代码如下:
.....
private
sSql,sFilter:String;
bClick:Boolean;
{ Private declarations }
public
{ Public declarations }
end;var
frmHouseDlg: TfrmHouseDlg;implementationuses DM;{$R *.dfm}
procedure TfrmHouseDlg.FormCreate(Sender: TObject);
begin
inherited;
if not qFloor.Active then qFloor.Open;
sSql:='Select fid,fCode,fNo,fName from vHouse'
end;procedure TfrmHouseDlg.btCancelClick(Sender: TObject);
begin
inherited;
bClick:=True;
ModalResult:=-1;
end;procedure TfrmHouseDlg.DBGrid1DblClick(Sender: TObject);
begin
inherited;
btOkClick(Self)
end;procedure TfrmHouseDlg.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
inherited;
CanClose:=bClick;
end;procedure TfrmHouseDlg.btOkClick(Sender: TObject);
begin
inherited;
if QHouse.Active and (QHouse.RecordCount >0) then
begin
bClick:=True;
ModalResult:=QHouse.fieldbyName('fID').AsInteger ;
end;
end;procedure TfrmHouseDlg.FormShow(Sender: TObject);
begin
inherited;
bClick:=False;
end;procedure TfrmHouseDlg.btClearClick(Sender: TObject);
begin
inherited;
lkFloor.Text:='';
edtCode.Text :='';
edtName.Text :='';
QHouse.Close ;
end;procedure TfrmHouseDlg.btFilterClick(Sender: TObject);
begin
inherited;sFilter:=' Where';
if Trim(lkFloor.Text)<>'' then
begin
sFilter:= sFilter+' fCode like '''+QFloor.fieldbyName('fCode').asString+'%''';
end;
if Trim(edtCode.Text) <> '' then
begin
if sFilter<>' Where' then sFilter := sFilter+' and';
if pos('%',EdtCode.Text)>0 then
sFilter:= sFilter+' fNo like '''+Trim(EdtCode.Text)+''''
else
sFilter:= sFilter+' fNo='''+Trim(EdtCode.text)+'''';
end;
if Trim(edtName.Text) <> '' then
begin
if sFilter<>' Where' then sFilter := sFilter+' and';
if pos('%',EdtName.Text)>0 then
sFilter:= sFilter+' fName like '''+Trim(EdtName.Text)+''''
else
sFilter:= sFilter+' fName='''+Trim(EdtName.text)+'''';
end;With QHouse do
begin
Close;
Sql.Clear ;
if sFilter<>' Where' then
Sql.Add(sSql+sFilter)
else
Sql.Add(sSql);
Open;
end;end;procedure TfrmHouseDlg.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
inherited;
// frmHouseDlg:=nil;
end;
这个窗体在工程已调用了
...
Application.CreateForm(TfrmMachFilter, frmMachFilter);
Application.Run;
...
我在另一个窗体是这样调用该公用窗体的的
procedure TfrmPeccRec.cxDBButtonEdit1Click(Sender: TObject);
var
iID: Integer;
begin
inherited;
if QBaseInfo.State in [dsInsert,dsEdit] then
begin
iID:=frmHouseDlg.ShowModal;
if iID>0 then
begin
QBaseInfo.FieldByName('fHouseID').AsInteger :=iID;
end;
end;
end;
每次运行时,第一次按下按钮可以正常调出窗体,但关闭窗体后,就不能调用,就不能调
用了.出错"Access violation at address 0000000 Read of address 000000''
必须是关掉,程序后,再次打开才能用,调用过一次又这样.....
各位大哥,有没有好的解决办法,救我....
里面的代码如下:
.....
private
sSql,sFilter:String;
bClick:Boolean;
{ Private declarations }
public
{ Public declarations }
end;var
frmHouseDlg: TfrmHouseDlg;implementationuses DM;{$R *.dfm}
procedure TfrmHouseDlg.FormCreate(Sender: TObject);
begin
inherited;
if not qFloor.Active then qFloor.Open;
sSql:='Select fid,fCode,fNo,fName from vHouse'
end;procedure TfrmHouseDlg.btCancelClick(Sender: TObject);
begin
inherited;
bClick:=True;
ModalResult:=-1;
end;procedure TfrmHouseDlg.DBGrid1DblClick(Sender: TObject);
begin
inherited;
btOkClick(Self)
end;procedure TfrmHouseDlg.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
inherited;
CanClose:=bClick;
end;procedure TfrmHouseDlg.btOkClick(Sender: TObject);
begin
inherited;
if QHouse.Active and (QHouse.RecordCount >0) then
begin
bClick:=True;
ModalResult:=QHouse.fieldbyName('fID').AsInteger ;
end;
end;procedure TfrmHouseDlg.FormShow(Sender: TObject);
begin
inherited;
bClick:=False;
end;procedure TfrmHouseDlg.btClearClick(Sender: TObject);
begin
inherited;
lkFloor.Text:='';
edtCode.Text :='';
edtName.Text :='';
QHouse.Close ;
end;procedure TfrmHouseDlg.btFilterClick(Sender: TObject);
begin
inherited;sFilter:=' Where';
if Trim(lkFloor.Text)<>'' then
begin
sFilter:= sFilter+' fCode like '''+QFloor.fieldbyName('fCode').asString+'%''';
end;
if Trim(edtCode.Text) <> '' then
begin
if sFilter<>' Where' then sFilter := sFilter+' and';
if pos('%',EdtCode.Text)>0 then
sFilter:= sFilter+' fNo like '''+Trim(EdtCode.Text)+''''
else
sFilter:= sFilter+' fNo='''+Trim(EdtCode.text)+'''';
end;
if Trim(edtName.Text) <> '' then
begin
if sFilter<>' Where' then sFilter := sFilter+' and';
if pos('%',EdtName.Text)>0 then
sFilter:= sFilter+' fName like '''+Trim(EdtName.Text)+''''
else
sFilter:= sFilter+' fName='''+Trim(EdtName.text)+'''';
end;With QHouse do
begin
Close;
Sql.Clear ;
if sFilter<>' Where' then
Sql.Add(sSql+sFilter)
else
Sql.Add(sSql);
Open;
end;end;procedure TfrmHouseDlg.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
inherited;
// frmHouseDlg:=nil;
end;
这个窗体在工程已调用了
...
Application.CreateForm(TfrmMachFilter, frmMachFilter);
Application.Run;
...
我在另一个窗体是这样调用该公用窗体的的
procedure TfrmPeccRec.cxDBButtonEdit1Click(Sender: TObject);
var
iID: Integer;
begin
inherited;
if QBaseInfo.State in [dsInsert,dsEdit] then
begin
iID:=frmHouseDlg.ShowModal;
if iID>0 then
begin
QBaseInfo.FieldByName('fHouseID').AsInteger :=iID;
end;
end;
end;
每次运行时,第一次按下按钮可以正常调出窗体,但关闭窗体后,就不能调用,就不能调
用了.出错"Access violation at address 0000000 Read of address 000000''
必须是关掉,程序后,再次打开才能用,调用过一次又这样.....
各位大哥,有没有好的解决办法,救我....
procedure TfrmBase.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=cafree;
end;
这个应该不会有什么影响吧
[email protected]
F7,F8:单步调试。
F4:运行到光标处
......
还是找本书看看先,调试是写程序的基础。
关闭时调用hide,显示时调用ShowModal。