- 浏览: 14778 次
- 性别:
- 来自: 大连
最新评论
自定义通用查询组件
- 博客分类:
- 技术杂绘
1、 设计通用查询窗口,严格的说这是一个目前只适合数据库表中字符串类型或相似类型的查询窗口,数字类型不支持,不过稍加修改(增加一个类型选择,判断处理即可)就可支持。窗体的界面如下:
相关代码如下: unit GenQueryBox; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, ComCtrls, Buttons, StdCtrls, DB, ADODB; type TGenQueryBoxFrm = class(TForm) Panel1: TPanel; Panel2: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; cbFieldName: TComboBox; cbSymbol: TComboBox; cbValue: TComboBox; Label4: TLabel; btnInit: TSpeedButton; btnAnd: TSpeedButton; btnOr: TSpeedButton; btnClear: TSpeedButton; btnResult: TSpeedButton; btnGiveup: TSpeedButton; ADOQuery1: TADOQuery; Panel3: TPanel; Panel4: TPanel; mCon: TMemo; ADOConnection1: TADOConnection; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormActivate(Sender: TObject); procedure btnInitClick(Sender: TObject); procedure btnAndClick(Sender: TObject); procedure btnOrClick(Sender: TObject); procedure btnClearClick(Sender: TObject); procedure btnResultClick(Sender: TObject); procedure btnGiveupClick(Sender: TObject); procedure cbFieldNameChange(Sender: TObject); private { Private declarations } procedure BtnValid; //按钮互斥 procedure getParams(var qStr1, qStr2, qStr3: String); //获取串联的字符串子串 procedure getAllValues; //根据字段名获取全部的字段值 public pTableName: String; //表名 pFields: TStrings; //字段列表 isConf: Boolean; //判断是否按下缺人按钮,没按下代表放弃 filterValue: String;//过滤的条件值 end; var GenQueryBoxFrm: TGenQueryBoxFrm; implementation {$R *.dfm} { TForm1 } procedure TGenQueryBoxFrm.BtnValid; begin btnInit.Enabled := not btnInit.Enabled; btnAnd.Enabled := not btnAnd.Enabled; btnOr.Enabled := not btnOr.Enabled; btnClear.Enabled := not btnClear.Enabled; btnResult.Enabled := not btnResult.Enabled; btnGiveup.Enabled := not btnGiveup.Enabled; end; procedure TGenQueryBoxFrm.FormCreate(Sender: TObject); begin pFields := TStringList.Create; isConf := False; self.cbSymbol.Items.Clear; self.cbSymbol.Items.Add('='); self.cbSymbol.Items.Add('>'); self.cbSymbol.Items.Add('>='); self.cbSymbol.Items.Add(''); self.cbSymbol.Items.Add('like'); self.cbSymbol.ItemIndex := -1; end; procedure TGenQueryBoxFrm.FormClose(Sender: TObject; var Action: TCloseAction); begin pFields.Free; end; procedure TGenQueryBoxFrm.FormActivate(Sender: TObject); begin self.cbFieldName.Items.AddStrings(pFields); self.cbFieldName.SetFocus; end; procedure TGenQueryBoxFrm.btnInitClick(Sender: TObject); var qStr1, qStr2, qStr3: String; begin if Trim(self.cbFieldName.Text) = '' then begin MessageBox(Handle, '字段名不能为空!', '信息提示', MB_ICONWARNING + MB_OK); Exit; end; if Trim(self.cbSymbol.Text) = '' then begin MessageBox(Handle, '操作符不能为空!', '信息提示', MB_ICONWARNING + MB_OK); Exit; end; qStr1 := self.cbFieldName.Items.Strings[self.cbFieldName.It emIndex]; qStr2 := self.cbSymbol.Items.Strings[self.cbSymbol.ItemInde x]; if qStr2 'like' then qStr3 := self.cbValue.Text else qStr3 := '%' + self.cbValue.Text + '%'; filterValue := qStr1 + ' ' + qStr2 + ' ''' + qStr3 + ''' '; self.mCon.Lines.Add(qStr1 + ' ' + qStr2 + ' ' + self.cbValue.Text); btnValid; self.cbFieldName.ItemIndex := -1; self.cbSymbol.ItemIndex := -1; self.cbValue.Text := ''; end; procedure TGenQueryBoxFrm.getParams(var qStr1, qStr2, qStr3: String); begin qStr1 := ''; qStr2 := ''; qStr3 := ''; if Trim(self.cbFieldName.Text) = '' then begin MessageBox(Handle, '字段名不能为空!', '信息提示', MB_ICONWARNING + MB_OK); Exit; end; if Trim(self.cbSymbol.Text) = '' then begin MessageBox(Handle, '操作符不能为空!', '信息提示', MB_ICONWARNING + MB_OK); Exit; end; qStr1 := self.cbFieldName.Items.Strings[self.cbFieldName.It emIndex]; qStr2 := self.cbSymbol.Items.Strings[self.cbSymbol.ItemInde x]; if qStr2 'like' then qStr3 := self.cbValue.Text else qStr3 := '%' + self.cbValue.Text + '%'; end; procedure TGenQueryBoxFrm.btnAndClick(Sender: TObject); var qStr1, qStr2, qStr3: String; begin getParams(qStr1, qStr2, qStr3); if (qStr1 '') and (qStr2 '') then begin filterValue := filterValue + ' and ' + qStr1 + ' ' + qStr2 + ' ''' + qStr3 + ''' '; self.mCon.Lines.Add('并且 ' + qStr1 + ' ' + qStr2 + ' ' + self.cbValue.Text); //btnValid; end; end; procedure TGenQueryBoxFrm.btnOrClick(Sender: TObject); var qStr1, qStr2, qStr3: String; begin getParams(qStr1, qStr2, qStr3); if (qStr1 '') and (qStr2 '') then begin filterValue := filterValue + ' or ' + qStr1 + ' ' + qStr2 + ' ''' + qStr3 + ''' '; self.mCon.Lines.Add('或者 ' + qStr1 + ' ' + qStr2 + ' ' + self.cbValue.Text); //btnValid; end; end; procedure TGenQueryBoxFrm.btnClearClick(Sender: TObject); begin self.mCon.Lines.Clear; self.cbFieldName.SetFocus; btnValid; end; procedure TGenQueryBoxFrm.btnResultClick(Sender: TObject); begin isConf := True; Close; end; procedure TGenQueryBoxFrm.btnGiveupClick(Sender: TObject); begin Close; end; procedure TGenQueryBoxFrm.cbFieldNameChange(Sender: TObject); begin self.cbValue.Items.Clear; getAllValues; self.cbValue.Text := ''; end; procedure TGenQueryBoxFrm.getAllValues; var sField: String; begin self.cbValue.Items.Clear; if self.cbFieldName.ItemIndex 组件
Delphi->Component->New Component创建一个组件单元,并填选好相关信息,参考如下图:
保存后,编写代码如下: unit GenQ; interface uses SysUtils, Classes, GenQueryBox, ADODB, Forms; type TGenQ = class(TComponent) private FConString: String; //数据库连接字符串 FTableName: String; //表名 FFieldsStrings: TStrings; //字段名列表 procedure SetFieldsStrings(Value: TStrings); //设置字段名列表方法 protected { Protected declarations } public FSqlFilterValue: String; constructor Create(AOwner: TComponent); override; destructor Destroy; override; function Execute: Boolean; //调用通用查询窗体方法 published property ConString: String read FConString write FConString; property TableName: String read FTableName write FTableName; property FieldsStrings: TStrings read FFieldsStrings write SetFieldsStrings; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TGenQ]); end; { TGenQ } constructor TGenQ.Create(AOwner: TComponent); begin inherited Create(AOwner); FFieldsStrings := TStringList.Create; end; destructor TGenQ.Destroy; begin FFieldsStrings.Free; inherited Destroy; end; function TGenQ.Execute: Boolean; var GenQBoxFrm: TGenQueryBoxFrm; bFlag: Boolean; begin bFlag := False; GenQBoxFrm := TGenQueryBoxFrm.Create(nil); GenQBoxFrm.pTableName := FTableName; GenQBoxFrm.ADOConnection1.ConnectionString := ConString; GenQBoxFrm.ADOConnection1.Connected := True; GenQBoxFrm.pFields.Assign(FFieldsStrings); // := FFieldsStrings; 注意多单元对象传递的释放问题 try GenQBoxFrm.ShowModal; bFlag := GenQBoxFrm.isConf; FSqlFilterValue := GenQBoxFrm.filterValue; finally GenQBoxFrm.Free; end; result := bFlag; end; procedure TGenQ.SetFieldsStrings(Value: TStrings); begin if Assigned(Value) then FFieldsStrings.Assign(Value); end; end. 注意,引用上一步设计好的GenQueryBox,这样就完成了封装;完成这步在注册组件之间,最好先建一个工程调用测试一下,没问题了再进行后续的注册。
3、 为组件增加自定义图标
Delphi->Tools->Image Editor,新建一个dcr文件,名字要与组件单元名相同GenQ.dcr,并保存在同一目录;Contens右键new一个Bitmap(24 * 24),这个位图名字必须与组件的类名相同并大写,比例为TGENQ,这样安装组件后自定义的图标就显示出来了。
注意如果不像自己设计Bitmap,可拷贝其他的好看的bmp文件,但Image Editor不能直接打开256色的图片,你可以用windows的画图工具打开再拷贝过来即可。
4、 注册组件 Delphi->Component->Install Component,出现如下组件安装对话框:
点击OK后完成编译安装,另外这块编译成功后原以为会出现PGenQ.dpk,但却找不到,只有PGenQ.dcu,此处还有点疑问。
5、组件使用
好了,去体验一下成果吧,注意那个小图标
就是自定义的组件,如下图:
调用代码如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, GenQ, StdCtrls, DB, Grids, DBGrids, ADODB; type TForm1 = class(TForm) GenQ1: TGenQ; ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; DBGrid1: TDBGrid; DataSource1: TDataSource; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin self.GenQ1.Execute; self.ADOQuery1.Close; self.ADOQuery1.Filter := self.GenQ1.FSqlFilterValue; self.ADOQuery1.Filtered := True; self.ADOQuery1.Open; end; end.
发表评论
-
第二章:字符串和字符串处理
2012-07-06 09:51 7411. char(表示8位ANSI),wchar_t(表示1 ... -
Python中正则表达式对中文的匹配问题
2012-07-06 09:45 718今天在用python匹配中文的时候出了问题,要么匹配不到, ... -
有限状态机实现正则表达式
2012-07-06 09:37 2040最近在写语法分析 ... -
jsp页面换行输出
2012-07-06 09:30 1147if(skins != null){ Iterator i ... -
js注册验证
2012-07-05 20:44 572function getFocus() //设置用户名文本 ... -
Flex 数据易犯错误: 常见误用和错误
2012-07-02 10:23 516在某些情形下,绑定操作似乎不能正常工作,此时你可能非常懊恼 ... -
Flex3 做界面与 VC交互
2012-07-02 10:22 670Flex3 代码 width="400&quo ... -
页面中嵌入FLEX应用-传参
2012-07-02 10:22 611项目需要在页面的某div中动态展现图表数据,最终选用FLE ... -
engine introduce
2012-07-02 09:43 476... -
Flex Spring整合包
2012-07-01 09:41 695Adobe Flex是一套创建富客户端应用(RIAs)的框 ... -
Flex 导出文件通用处理
2012-07-01 09:41 859本文 ... -
myeclipse6.5+flex 3 + tomcat6.0 + ds-console.war环境搭建
2012-07-01 09:41 372安装环境:myeclipse6 ... -
The architecture of Flex and Java applications two (Flex 和 Java 应用程序架构 2)
2012-07-01 09:41 508Flex and Java application ... -
Flex4+Spring3+Hibernate3+BlazeDS整合笔记
2012-07-01 09:41 556普通Java Web工程流行使用ssh框架,而当前台使用F ... -
PHP发送邮件乱码的具体解决方法
2012-06-30 17:57 835【转自】http://doc.chinaunix.net/ ... -
ASP.NET 使用alert弹出对话框后,CSS样式失效,字体变大的解决方法
2012-06-30 17:57 984ASP.NET 使用alert弹出对话框后,CSS样式 ... -
windows 7 下安装Oracle 9i 解决方法
2012-06-30 17:57 1249这里首先申明下,windows7下安装oracle9i 9 ... -
sql server 2000的一些问题解决方法
2012-06-30 17:57 567我机器上SQL Server 2000的sa密码因为长时间 ...
相关推荐
用户可以自定义查询条件,可以适合任何一种表的查询
自定义查询,可以嵌到自己的软件中,目前只支持对ADOQuery进行查询,注意,每个数据集组件必须和数据库中的表同名
主要介绍了百度小程序自定义通用toast组件,百度小程序的toast仅支持在页中展示,不能自定义位置、字体大小、在单个文本中增加icon等需求;因此自定义一个全局可通用的Toast,需要的朋友可以参考下
仿K3通用查询组件,只要设置几个参数就可以实现高级查询,可以自定义查询条件,并且可以保存查询方案,非常好用
微信小程序 F2 自定义图表组件
通用上传组件(功能强大,界面美观) 功能强大,界面美观的.net通用上传组件(强烈推荐!) 功能特点: 1、自定义上传文件类型、浏览资源管理器窗口标题; 2、根据登陆的用户session不同,自动上传至该用户名的目录下...
博文参考:http://blog.csdn.net/geniuseoe2012/article/details/8723702 android仿web风格的spinner下拉框实现demo,实现更通用
很通用的Flex 分页组件,经过本人测试,可以应用到项目中,很方便
这是我对网上一些分页组件改编而成的,它主要的特色是支持三种传值方式(JAVASCRIPT,POST,GET),它还支持各种自定义样式,很方便呐!
有了查询视图,可扩展自定义报表功能,些功能把到2.0版本开发。 组件用到:jquery.jseasyui.js,way.js,artTemplate.js。 本组件可以完成脱离任何平台,只需修改一下就可以在Java,C#,PHP等平台使用。 1.本组件的...
左边一个减少的按钮,右边一个增加的按钮,中间是输入框。 做成通用的组件,可以公用
全局直接使用js调用 this.$confirmation() 调用通用提示弹窗可二次封装 点击确认取消后 会有相应的回调 利用的Promise封装的
ReactNative 跨平台通用 Tabbar,实现了官方所欠缺的 Android 与 iOS 兼容 Tabbar 组件。包含底部 BAR 文字与图片排版显示,任何页面控制隐藏显示,跳转至任意路由等 API。兼容自定义 STYLE。Get StartedDEMOtoggle ...
通用自定义查询 (D6SQL2000) 目前只支持对ADOQuery进行查询,注意,每个数据集组件必须和数据库中的表同名 在Delphi6+MSSQL2000下调试通过
除了jQueryUI外,又一JavaScript移动应用UI库使用教程支持OS 4.3+版本UI设计可自定义主题类原生转换配置自动管理导航堆栈内置通用用例组件
目前只支持对ADOQuery进行查询,注意,每个数据集组件必须和数据库中的表同名。在Delphi6+MSSQL2000下调试通过,tuchaoqian@126.com,QQ:28416179。
微信小程序自定义某些常用组件: 自定义日期选择控件 自定义城市选择控件 滑动悬浮tab 横向滚动tab 折线图 柱状图 双折线图 柱状折线图 双柱状图 刻度盘 日,周,月,季度,自定义选择器 list分页加载组件和音频api...
Tasks由一组相互关联的组件、动作组成,并可以展现最后的结果,如QueryAttributeTask执行空间数据属性查询,结果返回到Results控件中,开发中我们既可以使用.Net Web ADF已有的Tasks控件,也可以自定义Tasks,构建...
Android自定义控件--下拉刷新的实现,直接在项目中可用,可访问博客:http://blog.csdn.net/qq_20889581/article/details/51008917 进行详细浏览,欢迎留下宝贵意见!