老鸟跳过。。。。。。。。本文只是为小白准备的
--------------
TwwDBLookupCombo 组件是老牌控件包的 Inofpower 中的一个组件。Inofpower 很久也没有更新了,只是作了新版DELPHI的适配,组件的功能从D2007那些开始到现在,可以说几乎没有任何的改变;
可以官方觉得够用了吧。
我个人就非常喜欢这套组件包,它的DBGrid(TwwDBGrid)的例可以绑入twwdbedit,twwcombobox,twwLookupcombo,twwButton 等等组件包内的其它很多自身的组件,有人说 DevExpress 也可以。虽然看上去效果差不多,但是原理是不同的。相对于DevExpress那个壮硕的体积,这个可谓即小巧又灵活。使用还相当简单方便。(感觉想是在作广告,其实就是表达我确定挺喜欢的)
本文主要就是记录一下自己的心得。
从 TCustomControl 继承,如:
TJoeDBLookupCombo = class(TCustomControl)
具体的过程就不赘述了。说说我踩坑(其实不算坑,只是我太菜水平有限遇到的困难,花了不小时间才解决的)
大部分的属性或者事件,都可以简单的 get、set解决;这里要记录的就是我觉得插重要的,又不能简单Get/Set能解决的;
1、在设计期,双击 TwwDBLookupCombo 会弹出一个设置窗口(如下图:
如果想要在自己的组件控件中也这样。需要自己写一个类并编写(应该是抄)一些代码;
TDBLookupDisplayComponentEditor = class(TwwComponentEditor)
procedure Edit; override;
end;
TDBLookupDisplayProperty = class(TPropertyEditor)
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
end;
{ TDBLookupDisplayComponentEditor }
procedure TDBLookupDisplayComponentEditor.Edit;
var
listHandle: TStrings;
dataSet: TDataSet;
useTFields: boolean;
SelectedPropertyType: TwwSelectedPropertyType;
begin
listHandle := (Component as TJoeDBLookupCombo).LookupCombo.Selected;
dataSet := (Component as TJoeDBLookupCombo).LookupCombo.LookupTable;
SelectedPropertyType := sptNone;
useTFields := TJoeDBLookupCombo(Component).LookupCombo.useTFields;
if (EditSelectedFieldsProperty(TJoeDBLookupCombo(Component).LookupCombo, listHandle, dataSet, Designer, False, useTFields, SelectedPropertyType)) then begin
TJoeDBLookupCombo(Component).LookupCombo.useTFields := useTFields;
(TJoeDBLookupCombo(Component).LookupCombo as TwwDBLookupCombo).refreshDisplay;
end
end;
{ TDBLookupDisplayProperty }
procedure TDBLookupDisplayProperty.Edit;
var
listHandle: TStrings;
dataSet: TDataSet;
component: TComponent;
useTFields: boolean;
SelectedPropertyType: TwwSelectedPropertyType;
begin
component:= GetComponent(0) as TComponent;
listHandle := (component as TJoeDBLookupCombo).LookupCombo.Selected;
dataSet := (component as TJoeDBLookupCombo).LookupCombo.LookupTable;
SelectedPropertyType := sptNone;
useTFields := TJoeDBLookupCombo(component).LookupCombo.useTFields;
if (EditSelectedFieldsProperty(TJoeDBLookupCombo(component).LookupCombo, listHandle, dataSet, Designer, False, useTFields, SelectedPropertyType)) then begin
TJoeDBLookupCombo(component).LookupCombo.useTFields := useTFields;
(TJoeDBLookupCombo(component).LookupCombo as TwwDBLookupCombo).refreshDisplay;
end
end;
function TDBLookupDisplayProperty.GetAttributes: TPropertyAttributes;
begin
result:= [paDialog];
end;
function TDBLookupDisplayProperty.GetValue: string;
var
listHandle: TStrings;
component: TComponent;
begin
{(*}
component := GetComponent(0) as TComponent;
listHandle := (component as TJoeDBLookupCombo).LookupCombo.Selected;
if listHandle.count > 0 then
result := listHandle[0] else result := '';
{*)}
end;
然后注册它
procedure Register;
RegisterComponents('JoeDBComponents',[TJoeDBLookupCombo]);
RegisterComponentEditor(TJoeDBLookupCombo, TDBLookupDisplayComponentEditor);
RegisterPropertyEditor(TypeInfo(TStrings), TJoeDBLookupCombo, 'Selected', TDBLookupDisplayProperty);
end;
这个才能在双击这个复合组件(或在属性设置中双击 Selected 属性)时,弹出那个设置窗口;
当然,在 published 中,要将 Selected 显示出来
TJoeDBLookupCombo = class(TCustomControl)
private
FLookupCombo : TwwDBLookupCombo;
//..... 其它的代码省略
published
property Selected : TStrings read getSelectedFields write setSelectedFields;
//..... 其它的代码省略
end;
//传递一下相关的设置
function TJoeDBLookupCombo.getSelectedFields: TStrings;
begin
Result := FLookupCombo.Selected;
end;
procedure TJoeDBLookupCombo.setSelectedFields(const Value: TStrings);
begin
FLookupCombo.Selected := Value;
end;
---
下一篇说说 twwCheckBox + TwwLookupCombobo
感觉跟 TLabel + TwwDBLookupCombo 差不多,其实也还真差不多。不过。仍然有需要记录的东西,比如说:wwCheckbox勾选与不勾选 wwLookupCombo的状态等。