我建了个公用检索窗体.为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''
必须是关掉,程序后,再次打开才能用,调用过一次又这样.....
各位大哥,有没有好的解决办法,救我....

解决方案 »

  1.   

    你的窗体是不是在关闭后释放了。继承的父窗体是不是在关闭的时候释放了。或者其他组件释放了。也许是Query,你自己放个断点看看
      

  2.   

    我在基类窗体上有一句
    procedure TfrmBase.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Action:=cafree;
    end;
    这个应该不会有什么影响吧
      

  3.   

    干脆你把源代码Email给我,我帮你调试算了。
    [email protected]
      

  4.   

    调试的技巧在很多的入门书上都又介绍,随便到那个书店翻一翻就知道了。F5:设置断点
    F7,F8:单步调试。
    F4:运行到光标处
    ......
    还是找本书看看先,调试是写程序的基础。
      

  5.   

    公用窗体使用频繁,关闭时不要释放。
    关闭时调用hide,显示时调用ShowModal。