开发复合组件TLabel + TwwDBLookupCombo

老鸟跳过。。。。。。。。本文只是为小白准备的

--------------

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的状态等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值