控件的成员是通过一个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.
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.
解决方案 »
- 怎样将主进程的一个Record类型传递到线程中,并且修改其值!
- 访问dbf数据库,第二条记录可以访问,但是第一条出错
- 如何解决ADOConnection连接异常断开后程序不响应的问题?
- 积分放血大放松了!!!
- 一个关于windows98的严重问题?
- 怎么样调用远程数据模块里的函数
- 我的Delphi6怎不能存档?
- 保存问题
- 急急急!!!我想做一个对指定的网页填写数据的程序,请问如何编写?如何实现?用什么原理?(高分相赠!!)
- 高手请进,一个TImage的奇怪问题,急
- 明天要考试,几个DELPHI的基础问题还忘大家指点一下!一个问题散100,急!!!
- 如何用delphi实现过滤一些局域网中的IP拒绝访问本计算机的功能?
procedure Change; override;
你这个思路是没有办法完成这个功能的。你需要重载一个类:
TFieldDataLinkEx = class(TFieldDataLink)
private
FOnLayoutChanged: TNotifyEvent;
protected
procedure LayoutChanged; override;
public
property OnLayoutChanged: TNotifyEvent read FOnLayoutChanged write FOnLayoutChanged;
end;
然后参照数据感知控件的制作办法制作。
--------------------------------------------------------这个问题,当然也可以调用窗体的OnActivate事件,但总觉得不妥
根据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(安徽农民*在外打工) 兄的意见了
如果搞不出来,请发Mail给我:
[email protected]
[email protected]