是哪里的问题
解决方案 »
- 选择题如何存储在SQL数据库中
- 请问delphi2009 check for updates 下载时的存放目录在哪里?
- 找不到好用的Gif控件。。。。
- 为什么会出现 “Stack overflow ” ?
- DELPHI + sql server 2008主从表的排序问题?
- 如何在修改dbgrid中的值时,自动更新数据库?
- 问题!!
- 如何让16*16的image缩小显示32*32的ico文件?
- 请高手指点:如何建立起一个信息系统。
- ACCESS与SQL SERVER中的日期类型的长度
- 如何将TQuery,TTable等数据集中的数据写到已经设计好的EXCEL模板中
- 请教,股票软件的趋势图是怎么做的?
FreeLibrary?你倒是说清楚呀!
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