控件的成员是通过一个TDBEDIT和一个Tlabel聚合而成的作用:label显示TDBEDIT对应字段属性DisplayLabel的值。不足之处:1.在设计阶段,TDBEDIT显示数据时,label不能显示,只有在运行时显示。
         2.运行时,当切换了TDBEDIT对应的字段时,Label也不能跟着显示
希望大虾们不吝赐教,小弟谢了   
=====================
unit DBEdit1;interfaceuses
  SysUtils, Classes, Controls, StdCtrls, Mask, DBCtrls,Messages,Windows,
  Forms;type
  TDBEdit1 = class(TDBEdit)
  private
     FLabel:TLabel;
     FSpace:Integer;
     OldOnActivate:TNotifyEvent;
     Procedure setSpace(Const Value:Integer);
     Procedure GetDisplayLabel(Sender:Tobject);
    { Private declarations }
  protected
    { Protected declarations }
    Procedure Setparent(Aparent:TWinControl);Override;
    Procedure SetBounds(Aleft:Integer;ATop:Integer;AWidth:Integer;AHeight:Integer);Override;
    Procedure Notification(AComponent:TComponent;Operation:TOperation);Override;
    procedure CMVisiblechanged(var Message: TMessage);
      message CM_VISIBLECHANGED;
    procedure CMEnabledchanged(var Message: TMessage);
      message CM_ENABLEDCHANGED;
    procedure CMBidimodechanged(var Message: TMessage);
      message CM_BIDIMODECHANGED;
    procedure CMFontchanged(var Message: TMessage);
      message CM_FONTCHANGED;
    Procedure Loaded;Override;
  public
    Constructor Create(Owner:Tcomponent);override;
    { Public declarations }
  published
    Property Space:Integer Read FSpace Write SetSpace;
    { Published declarations }
  end;procedure Register;implementationprocedure Register;
begin
  RegisterComponents('Hyp', [TDBEdit1]);
end;{ TDBEdit1 }constructor TDBEdit1.Create(Owner: Tcomponent);
begin
  inherited;
  FLabel:=TLabel.Create(Self);
  Flabel.Caption:='Test';
  Flabel.Visible:=true;
  FLabel.FreeNotification(self);
  Flabel.FocusControl:=Self;
  Flabel.Alignment:=taRightJustify;
  Flabel.AutoSize:=True;
  FSpace:=20;
end;procedure TDBEdit1.Notification(AComponent: TComponent;
  Operation: Toperation);
begin
  Inherited;
  if (AComponent=Flabel) and (Operation=opRemove) then
     Flabel:=nil;
end;procedure TDBEdit1.SetBounds(Aleft, ATop, AWidth, AHeight: Integer);
begin
   Inherited;
   if Flabel<>nil then
     Flabel.SetBounds(Aleft-Fspace-Flabel.Width,Atop,Flabel.Width,Flabel.height);
end;procedure TDBEdit1.Setparent(Aparent: TWinControl);
begin
  inherited;
  FLabel.parent:=Aparent;
end;procedure TDBEdit1.setSpace(const Value: Integer);
begin
   if Value<>Space then
      Space:=Value;
   Flabel.left:=Self.left-Space-Flabel.width;
end;procedure TDBEdit1.CMBidimodechanged(var Message: TMessage);
begin
    Inherited;
    Flabel.BiDiMode:=BiDiMode;
end;procedure TDBEdit1.CMEnabledchanged(var Message: TMessage);
begin
    Inherited;
    Flabel.Enabled:=Enabled;
end;procedure TDBEdit1.CMFontchanged(var Message: TMessage);
begin
    Inherited;
    Flabel.Font.Assign(Font);
end;procedure TDBEdit1.CMVisiblechanged(var Message: TMessage);
begin
   Inherited;
   Flabel.Visible:=Visible;
end;procedure TDBEdit1.Loaded;
begin
  inherited;
  if Owner.InheritsFrom(TForm) then
  with TForm(Owner) do
  begin
    OldOnActivate:=OnActivate;
    OnActivate:=GetDisplayLabel;
  end;
end;procedure TDBEdit1.GetDisplayLabel(Sender: Tobject);
begin
  if Assigned(OldOnActivate) then OldOnActivate(Sender);
  if Flabel<>nil then
     try
       Flabel.Caption:=Field.DisplayLabel;
     Except
     end;
end;end.

解决方案 »

  1.   

    需要重新写函数:procedure SetDataField(const Value: string);
      

  2.   

    似乎要重載這個:  protected
        procedure Change; override;
      

  3.   

    这个功能的控件我是完成过的,主要是VCL的代码屏蔽了LayoutChanged事件,
    你这个思路是没有办法完成这个功能的。你需要重载一个类:  
    TFieldDataLinkEx = class(TFieldDataLink)
      private
        FOnLayoutChanged: TNotifyEvent;
      protected
        procedure LayoutChanged; override;
      public
        property OnLayoutChanged: TNotifyEvent read FOnLayoutChanged write FOnLayoutChanged;
      end;
    然后参照数据感知控件的制作办法制作。
      

  4.   

    2.运行时,当切换了TDBEDIT对应的字段时,Label也不能跟着显示
    --------------------------------------------------------这个问题,当然也可以调用窗体的OnActivate事件,但总觉得不妥
      

  5.   

    2.运行时,当切换了TDBEDIT对应的字段时,Label也不能跟着显示---------------------------------------------
    根据aiirii(ari-求职广州中)大虾的指点可以解决了protected
        procedure Change; override;procedure TDBEdit1.change;
    begin
      inherited;
      if Flabel<>nil then
         try
           Flabel.Caption:=Field.DisplayLabel;
         Except
         end;
    end;但还有第一点呢,还希望大家指点
    我正在考虑 xthmpro_cn(安徽农民*在外打工) 兄的意见了
      

  6.   

    如果能截获LayoutChanged事件,第一点的毛病就迎刃而解了。
    如果搞不出来,请发Mail给我:
    [email protected]
      

  7.   

    zylgjl() 仁兄,可否发给我一给,最好有源代码,让小弟学学呀
    [email protected]