设置关联变色的Edit控件,只能设置一个关联控件,要关联多个控件时该怎么做?(200分)

F

fei_xr

Unregistered / Unconfirmed
GUEST, unregistred user!
{===============================================
问 题:我想设计一个Edit的扩展控件,在控件的属性里
设置与之关联的edit控件,(在输入带计算功能的值时有
用,可以知道当前值由哪些值计算得来)当这个控件获得
焦点里,与之关联的控件颜色发生变化,使控件者知道这
个控件的值与哪些edit有关联,我做好一个关联的,如果需
要关联多个edit应该怎么做?我想不出办法,望前辈们帮忙!!
===============================================}
unit ExEdit;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls;
type
TExEdit = class(TEdit)
private
FCEdit : TEdit;
//关联变色edit
proceduredo
Enter;
override;
proceduredo
Exit;
override;
procedure FSetCEdit(AValue: TEdit);
protected
//处理关联控件为空时
procedure Notification(AComponent: TComponent;Operation: TOperation);
override;
published
//设置关联变色的Edit控件,只能设置一个关联控件,
//要关联多个控件时该怎么做?
property Fei_CEdit: TEdit read FCEdit write FSetCEdit;
end;

procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Fei', [TExEdit]);
end;

{-------------------------------------------
以下为处理关联变色过程
-------------------------------------------}
procedure TExEdit.doExit;
begin
FCEdit.color := clWhite;
end;

procedure TExEdit.doEnter;
begin
FCEdit.color := clRed;
end;

procedure TExEdit.FSetCEdit(AValue: TEdit);
begin
FCEdit := AValue;
if AValue <> nil then
FCEdit.FreeNotification(self);
end;

procedure TExEdit.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = Fei_CEdit) then
Fei_CEdit := nil;
end;

end.
 
F

fei_xr

Unregistered / Unconfirmed
GUEST, unregistred user!
没有人回答呀,自己顶一下。
 

张辉明

Unregistered / Unconfirmed
GUEST, unregistred user!
把要关联的EDIT,用一个LIST都保存下来。不过属性编辑器要自己写的。
 
F

fei_xr

Unregistered / Unconfirmed
GUEST, unregistred user!
谁能给个源码呀!
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
完成以下定义的类,大概就能完成你需要的控件了:
type
TEditsItem = class(TCollectionItem)
private
FControl: TControl;
published
property Item: TControl read FControl write SetControl;
end;

TEdits = class(TCollection)
public
procedure SetColor(const Color: TColor);
end;

TAssignEdit = class(TEdit)
private
FCollection: TEdits;
public
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
published
property Collect: TEdits read FCollection;
end;

类的关系描述如下:
在 TAssignEdit 创建的时候创建 TEdits 实例,这样在控件属性面板上就可以出现一个收集器属性(即 TEdits)。在设计时操作这个收集器属性,就可以对收集器的项目进行添加和删除操作。根据需要,可以添加多个收集项目(即 TEditsItem)。由于这里每个收集项目都暴露了一个 TControl 的属性,所以,就可以在设计时的属性编辑器里对这个属性进行设置,你可以给这个属性设置TEdit,也可以设置为TLabel,只要是TControl继承下来的控件都可以,这样就不仅可以关联一组TEdit,还可以关联到一组TLabel或者混合关联到任意TControl类型的控件。
当这个TAssignEdit发生焦点改变或者发生鼠标 进入/离开 事件时,调用收集器的SetColor方法,这个方法遍历收集器中的全部项目,并对每个项目中的TControl类型的控件进行颜色设置,这样就完成了你需要的功能。
最后,在TAssignEdit的Destroy方法里,处理全部清除工作。
另外的意见是:假如不需要控件化,对某个工程项目来说,可以简单地在项目基类中定义一个关联方法,从而实现集合形式的或者列表形式的关联操作。如果项目仅仅是一个简单的应用,还可以直接使用一个简单的List来实现关联操作。
 
F

fei_xr

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢小雨哥,可我还是不明白程序怎么编。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
908
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部