`
cwsot
  • 浏览: 14778 次
  • 性别: Icon_minigender_2
  • 来自: 大连
最近访客 更多访客>>
社区版块
存档分类
最新评论

自定义通用查询组件

阅读更多

  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. 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics