unit pro_unit
 interface
  uses ...,qry_unit,..            //qry_unit 是Tquery_form窗体单元文件
type TXquery=class(TComponent)
  private
    Fquery_form:Tquery_form; //这个是查询窗体. 生成SQL条件
    //该窗件上有一个按钮的modalresult为mrok. 其它为普通按钮.      
    Fdelimiter:char;
    FSqlText:Tstrings;
    Fcaption:string;
    FtableName:string;
    FSubQuery:boolean;
    procedure setDelimiter(value:char);
    procedure setCaption(value:string);
    procedure setAdoquery(value:Tadoquery);
    procedure setTableName(value: string);
    procedure setSubQuery(value:boolean);
  public
    OutSQL:String;
    Fadoquery:TAdoquery;
    constructor Create(AOwner:Tcomponent);override;
    destructor  Destroy;override;
    function    Execute:Boolean;
  published
    property tablename:string read FTableName write Settablename;
    property adoquery:Tadoquery read Fadoquery write setAdoquery;
    property delimiter:char read Fdelimiter write setDelimiter default #39;
    property caption:string read Fcaption write setCaption ;
    property SubQuery:boolean read FSubQuery write setSubQuery default false;
  protected
    {}
  end;
  ............. 
implementation{ TXquery }...........
constructor TXquery.Create(AOwner: Tcomponent);
begin
  inherited create(AOwner);
  Fcaption:='X查询';
end;destructor TXquery.Destroy;
begin
  inherited Destroy;
end;function TXquery.Execute: Boolean;
begin
  try
    Fquery_form:=TQuery_form.create(self);
    with Fquery_form do  //初始化数据
    begin
      caption:=Fcaption;
      delimiter:=Fdelimiter;
      if not Initial(Fadoquery) then  //执行初始化操作
        messagedlg('初始化失败!',mtinformation,[mbok],0);
    end;
    if Fquery_form.ModalResult=mrok then//ERROR: //<--这句会出错
    begin
      OutSQL:=Fquery_form.WideSQL;
      result:=true;
    end else  result:=false;
  finally
    Fquery_form.free;
  end;
end;
.........
----------------------------------------------------------
unit Unit1;
interface 
  uses  ..,pro_unit,...   //引用TXquery所在单元type
  TForm1 = class(TForm)
    Button1: TButton;
    ADOQuery1: TADOQuery;
    procedure Button1Click(Sender: TObject);
  end;
var
  xquery:TXQuery;
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
  xquery:=Txquery.Create(self);
  xquery.Fadoquery := adoquery1;
  xquery.execute;  //调用Txquery的方法.
end;
end.
  当我执行xquery.execute后,弹出查询窗体。然后在查询窗体上点击 modalresult  为mrok 的按钮后就弹出错信息:
   project project1.exe raised exception class EAccessViolation
 with message 'Access violation at address 00490ff8 in module 'project1.exe'.Readof address 0000009D'.Proces stopped. Use Step   or Run to continue.
  我有跟踪过光标停在 ERROR:(上面有标识ERROR:) 处.
 为什么会出错? 应该怎么解决?

解决方案 »

  1.   

    老大,Fquery_form好像没有showmodal啊?
      

  2.   

    Tquery_form是Tform 的子类.当然有showmodal了
      

  3.   

    你的控件用来做什么我都不知道,要不然你就贴出来或者给我发送过来,我给你做一个.
    [email protected]
      

  4.   

    // 试试把
        with Fquery_form do  //初始化数据
        begin
          caption:=Fcaption;
          delimiter:=Fdelimiter;
          if not Initial(Fadoquery) then  //执行初始化操作
            messagedlg('初始化失败!',mtinformation,[mbok],0);
          if ModalResult=mrok then//ERROR: //<--这句会出错 改动这里//
          begin
            OutSQL:=Fquery_form.WideSQL;
            result:=true;
          end 
          else  result:=false;
      

  5.   

    把这句if ModalResult=mrok then 放到with do 里面
        with Fquery_form do  //初始化数据
        begin
          caption:=Fcaption;
          delimiter:=Fdelimiter;
          if not Initial(Fadoquery) then  //执行初始化操作
            messagedlg('初始化失败!',mtinformation,[mbok],0);
          if ModalResult=mrok then//ERROR: //<--这句会出错 改动这里//
          begin
            OutSQL:=Fquery_form.WideSQL;
            result:=true;
          end 
          else  result:=false;
        end; // 补上end;