是哪里的问题

解决方案 »

  1.   

    free谁呀!?
    FreeLibrary?你倒是说清楚呀!
      

  2.   

    当然是,我用断点调试,然后执行到freelibrary后就出错。
      

  3.   

    okdll工程文件:
    library LocateFind;uses
      shareMem,
      SysUtils,
      Classes,
      LocateUnit in 'LocateUnit.pas' {FrmLocate};{$R *.res}
      exports
        ShowLocate;
    beginend.locateunit文件:
    unit LocateUnit;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ImgList, DB, ADODB, StdCtrls, ExtCtrls, Buttons, ComCtrls,
      ToolWin,DBGrideh,DBGrids;type
      TFrmLocate = class(TForm)
        Splitter1: TSplitter;
        Panel1: TPanel;
        Splitter2: TSplitter;
        Panel2: TPanel;
        Panel5: TPanel;
        BtnValue: TSpeedButton;
        BtnOk: TButton;
        Panel8: TPanel;
        ListValue: TListBox;
        Panel4: TPanel;
        Panel7: TPanel;
        RadioGroup: TRadioGroup;
        ToolBar3: TToolBar;
        BtnAnd: TToolButton;
        BtnOr: TToolButton;
        Panel6: TPanel;
        ListField: TListBox;
        Panel10: TPanel;
        Label1: TLabel;
        Panel3: TPanel;
        LocateMem: TMemo;
        MemCondition: TMemo;
        EdtValue: TEdit;
        BtnClear: TButton;
        procedure FormShow(Sender: TObject);
        procedure BtnValueClick(Sender: TObject);
        procedure ListValueDblClick(Sender: TObject);
        procedure BtnOkClick(Sender: TObject);
        procedure BtnClearClick(Sender: TObject);
      private
          field:string;
          dataset:TAdoDataSet;
          //将汉字表示的运算符转变为真正的符号
          function chTosign(item:integer):string;
        public
            strSql:TStringList;
            grideh:TDBGrideh;  end;procedure ShowLocate(var sql:TStringList;AppHandle:THandle;grid:TDBGrideh);stdcall;implementation{$R *.dfm}
    procedure ShowLocate(var sql:TStringList;AppHandle:THandle;grid:TDBGrideh);stdcall;
    var frmlocate:TFrmLocate;
    begin
        Application.Handle:=AppHandle;
        frmLocate:=TFrmLocate.Create(Application);
        FrmLocate.strSql:=sql;
        frmlocate.grideh:=grid;
        frmlocate.ShowModal;
        frmlocate.Free;
    end;//将汉字表示的运算符转变为真正的符号
    function TFrmLocate.chTosign(item:integer):string;
    begin
        case item of
            0:result:='=';
            1:result:='>';
            2:result:='<';
            3:result:='like';
            4:result:='>=';
            5:result:='<=';
            6:result:='<>';
        end;
    end;
    {事件:窗体显示时发生}
    procedure TFrmLocate.FormShow(Sender: TObject);
    var icount:integer;  //网格的columns数
        str:string;
    begin
        ListField.Items.Clear;   //清除列表框中
        //显示所有相关的字段名称
        if grideh<>nil then
        //把网格的所有字段名称加进来
        begin
            for icount:=0 to grideh.Columns.count-1 do
            begin
                str:=grideh.Columns[icount].FieldName;
                ListField.Items.Add(str)
            end;
        end;    ListField.ItemIndex:=0;   //默认选中第一项
        
        field:= ListField.Items[listField.ItemIndex];
    end;{得到值}
    procedure TFrmLocate.BtnValueClick(Sender: TObject);
    var i,j:integer;
        strValue1,          //找到所有可得值
        strValue2:Tstrings; //去掉重复值后的字符串列表
        isrepeat:boolean;   //是否有重复的
    begin
        IsRepeat:=False;
        ListValue.Clear;
        field:= ListField.Items[listField.ItemIndex];
        strValue1:=TStringList.Create;
        strValue2:=TStringList.Create;
        dataset:=Tadodataset.Create(nil);
        dataset.Clone(TAdoDataset(grideh.DataSource.DataSet));
        dataset.First;
        //只显示前50项
        while (not dataset.Eof) and (strValue1.Count <=50) do
        begin
            strvalue1.Add(dataset.FieldByName(field).AsString);
            dataset.Next;
        end;
        dataset.Close;
        dataset.Free;
        strValue2.add(strValue1[0]);    {去掉重复的项}
        for i:=1 to strValue1.Count-1 do
        begin
            for j:=0 to strValue2.Count-1 do
            begin
                if strValue1[i]=strValue2[j] then
                begin
                    IsRepeat:=True;
                    break;
                end;
            end;
            if not IsRepeat then strValue2.Add(strValue1[i])    end;
        listValue.Items:=strValue2;
        strValue1.Clear;
        strValue2.Clear;
        strValue1.Free;
        strValue2.Free;
    end;{事件:双击值列表框时发生,事件:将双击的值加入值的编辑框中}
    procedure TFrmLocate.ListValueDblClick(Sender: TObject);
    begin
        EdtValue.Text:=ListValue.Items.Strings[ListValue.ItemIndex];
        try EdtValue.Setfocus  except end;
    end;
    {事件:点击确定按钮是发生,功能:得到条件语句}
    procedure TFrmLocate.BtnOkClick(Sender: TObject);
    var str:string;
        i:integer;
        strTmp:string;
    begin
        strTmp:='';
        ListValue.Clear;  //清空值的列表
        memcondition.Clear; //清空条件表
        
        if btnAnd.Down then strsql.Add(' and ');
        if btnOr.Down then strsql.Add(' or ');    str:=chTosign(radiogroup.ItemIndex );
        if str='like' then
        begin
            strSql.Add(' '+field);
            strSql.Add(str);
            strSql.Add('''%'+edtValue.Text+'%''');
        end
        else
        begin
            strSql.Add(' '+field);
            strsql.Add(str);
            strsql.Add(''''+edtValue.Text+'''');
        end;
        for i:=0 to strsql.Count-1 do
        begin
           strTmp:=strTmp+strsql[i];
        end;
        MemCondition.Lines.Add(strTmp);
    end;{事件:单击清空按钮时发生}
    procedure TFrmLocate.BtnClearClick(Sender: TObject);
    begin
        MemCondition.Clear;
        strSql.Clear;
        BtnAnd.Down:=False;
        BtnOr.Down:=False;
    end;end.调用的时候,返回值都没错,但是在调用后一释放freelibrary时就出错,你们看看
    返回的是TStringList