★控件高手请进!通过控件本身的SQL属性,制作下拉字段属性★(100分)

  • 主题发起人 主题发起人 summer_core99
  • 开始时间 开始时间
S

summer_core99

Unregistered / Unconfirmed
GUEST, unregistred user!
做了一个控件,里面有SQL,DataSource属性,以前都是通过控件本身的DataSource属性,去获取外面的TADOQuery,然后通过TADOQuery的SQL获取字段,再建立属性编辑器,显示下拉字段。现在我想直接通过控件本身的SQL属性的SQL语句,而不是连接到外面的TADOQuery,做一个有下拉显示字段的属性,要怎么写?

(一旦提示正确了,马上给分!)
 
参考一下TADOQuery之类控件的实现嘛,一般可在内部自己创建一个数据源
 
不错,思路很对,我也是想在内部建一数据集的,不过老是不成功
 
路过者,请提一下建议,谢谢~
 
这个控件,也不难,以前电脑报上有发过文章..
当然你可以参考DELPHI中的控件写法,不过我看了,感觉里面的都是动态建立ADOQUERY,制作完下拉,或者数控件后,ADOQUERY.FREE,就完了.
 
一定是要动态创建ADOQuery的,然后再把SQL值传入ADOQuery,下面的这一段都是通过DataSource到外面的ADOQuery取值的
{ TSelectDataFieldProperty }

function TSelectFieldProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paValueList, paSortList, paMultiSelect];
end;

function TSelectFieldProperty.GetDataSourcePropName: string;
begin
Result := 'DataSource'; //指定字段下拉列表到什么属性里取值
end;

procedure TSelectFieldProperty.GetValueList(List: Tstrings);
var
DataSource: TDataSource;
begin
DataSource := GetPropertyValue(GetComponent(0), GetDataSourcePropName) as TDataSource;
if (DataSource <> nil) and (DataSource.DataSet <> nil) then
DataSource.DataSet.GetFieldNames(List);
end;

procedure TSelectFieldProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
Values: TStringList;
begin
inherited;
//用来显示列表
Values := TStringList.Create;
try
GetValueList(Values);
for I := 0 to Values.Count - 1 do Proc(Values);
finally
Values.Free;
end;
end;

{ Utility function}
function TSelectFieldProperty.GetPropertyValue(Instance: TPersistent; const PropName: string): TPersistent;
var
PropInfo: PPropInfo;
begin
Result := nil;
PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, PropName);
if (PropInfo <> nil) and (PropInfo^.PropType^.Kind = tkClass) then
Result := TObject(GetOrdProp(Instance, PropInfo)) as TPersistent;
end;
 
其实这种用法很实用的,大伙儿一起来学习讨论一下吧,[:)]
 
如果有谁想出来了,控件源码可以公开~
 
没有脚印[:(],大伙进来了,好歹也留个脚印呀~
 
电脑报,baidu.
自定义组件查询,都有.
 
就连全文检索DFW,都没这方面的,寒~
 
to 蓝叶菱;
在哪期的电脑报呀?不难?
我觉得非常之麻烦;麻烦在何处呢:
1、要在创建成控件进动态创建一个ADO组件变量;并且要在控件Destory时要Free;
2、如果是这样那不是要加入ADOConnection属性,并且直连ADOConnection组件?
3、还是要从TDatalink类继承,否则自己写数据读取,累死了;
4、sql语句写好之后在何时去找字段;是属性下拉时?还是加个Active属性?
这种我刚学写控件时写过一个没有成功;后来加了Datasource属性,超简单;
我相信应该是都做得出来,只是时间的问题;不过做出来了是否稳定呢?
因为:设计时直连的ADOConnection,加的SQL语句,那么运行时不是要在控件级,
去控制内部动态创建的ADO组件吗?如果不控制内部的ADO组件只是做个死属性,那么如
此灵活性的控件有必要做吗?
 
清新空气说得很对,动态创建了ADOQuery还要指定Connection或ConnectionString(可以使用控件本身的DataSource去获取),这使得要在控件类与属性编辑器类中传递参数(类对接),也不知道要什么时候开始创建ADOQuery!

这段代码是直接使用控件本身的DataSource属性连接到外面的TADOQuery的,而不是直接通过本身的SQL属性来获取字段:

function TSelectFieldProperty.GetDataSourcePropName: string;
begin
Result := 'DataSource'; //指定字段下拉列表到什么属性里取值
end;

procedure TSelectFieldProperty.GetValueList(List: Tstrings);
var
DataSource: TDataSource;
begin
DataSource := GetPropertyValue(GetComponent(0), GetDataSourcePropName) as TDataSource;
if (DataSource <> nil) and (DataSource.DataSet <> nil) then
DataSource.DataSet.GetFieldNames(List);
end;
 
你不能直接将一个ADOQuery传入吗:
property Param_ADOQuery: TADOQuery Read ADOQuerySource write SetADOQuery;
使用时直接对这个Param_ADOQuery操作岂不是方便
 
dey-999,你的方法很不错,但我是做控件,不可能叫使用者还要去程序外面添加东西后控件才能使用。现在问题是不知何时要创建,在Create创建也不行,再者,不知要如何引用外面的连接属性?
 
豁出去了!~哪位朋友可以解答,在回答后面附上E-Mail,源码相赠,绝对有质量~
 
留下你的Email,我发给你
 
好的
summercore@163.com
 
本着有答必给分,答对速加分的原则,望各位高抬贵脑,多多相助!~
 
后退
顶部