属性编辑器设计中的问题!(30分)

  • 主题发起人 燕岛秋潮
  • 开始时间

燕岛秋潮

Unregistered / Unconfirmed
GUEST, unregistred user!
在设计一个控件时,我需要利用属性编辑器为这个控件增加两个属性。其中Cube属性需要根据
catalog的值进行选择。为了方便操作,我增加了一个单元变量slxg,通过这个变量来实现在不
同类的内部进行操作。下面的代码是一个简单的例子。但是出现了一个问题,在注册这个控件
之后,在form上放置两个TlxgTest控件,如lxgTest1和lxgTest2,当点击lxgTest1的catalog
属性进行选择的时候,可以看到(通过showmessage(slxg.Name);)showmessage出来的名称
是lxgTest2,也就是说此时lxgTest1中的单元变量slxg已经变成了lxgTest2中的slxg,难道新增的
属性编辑器只能保持一个(即以最后一个为准?)?
请高手指点迷津!谢谢!

unit lxgTest;

interface

uses
Windows, Messages, SysUtils, Classes,DesignEditors,DesignIntf,dialogs;
type TCataProperty = class(TStringProperty)
public
function GetAttributes:TPropertyAttributes;override;
function GetValue:string;override;
procedure SetValue(const Value:string);override;
procedure GetValues (proc:TGetStrProc);override;
end;
type TCubeProperty = class(TStringProperty)
public
function GetAttributes:TPropertyAttributes;override;
function GetValue:string;override;
procedure SetValue(const Value:string);override;
procedure GetValues (proc:TGetStrProc);override;
end;
type
TlxgTest = class(TComponent)
private
FCataProperty : string;
FCubeProperty:string;
procedure SetCatalog(const Value:string);
procedure SetCube(const Value:string);
public
constructor Create(AOwner:TComponent);override;
published
property Catalog:string read FCataProperty write SetCatalog stored true;
property Cube:string read FCubeProperty write SetCube stored true;
end;

procedure Register;

implementation
var
sTemp:string;
slxg:TlxgTest;
procedure Register;
begin
RegisterComponents('HDC4', [TlxgTest]);
RegisterPropertyEditor(TypeInfo(string),TlxgTest,'Catalog',TCataProperty);
RegisterPropertyEditor(TypeInfo(string),TlxgTest,'Cube',TCubeProperty);
end;

{ TCataProperty }

function TCataProperty.GetAttributes: TPropertyAttributes;
begin
result := [paValueList];
end;

function TCataProperty.GetValue: string;
begin
sTemp := GetStrValue;
result := GetStrValue;
end;

procedure TCataProperty.GetValues(proc: TGetStrProc);
var
i:integer;
begin
showmessage(slxg.Name);
for I := 0 to 4 do
if Assigned(Proc)
then Proc(IntToStr(I));
end;

procedure TCataProperty.SetValue(const Value: string);
begin
SetStrValue(Value);
end;

{ TCubeProperty }

function TCubeProperty.GetAttributes: TPropertyAttributes;
begin
result := [paValueList];
end;

function TCubeProperty.GetValue: string;
begin
result := GetStrValue;
end;

procedure TCubeProperty.GetValues(proc: TGetStrProc);
begin

if (sTemp = '1') then
proc('this is 1');
if (sTemp = '2') then
proc('this is 2');
if (sTemp = '3') then
proc('this is 3');
if (sTemp = '4') then
proc('this is 4');
if (sTemp = '5') then
proc('this is 5');
end;

procedure TCubeProperty.SetValue(const Value: string);
begin
SetStrValue(Value);
end;


{ TlxgTest }
constructor TlxgTest.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
slxg := self;
end;

procedure TlxgTest.SetCatalog(const Value: string);
begin
FCataProperty := Value;
end;

procedure TlxgTest.SetCube(const Value: string);
begin
FCubeProperty := Value;
end;



end.
 
问题出在你的公用变量上面。
你可以参考DesignerEditors 中的TPropertyEditor定义。
里面有一个函数: GetComponent 可以用下面的方式改写函数:
你试试,如果不行可以再问:
procedure TCataProperty.GetValues(proc: TGetStrProc);
var
i:integer;
begin
showmessage(GetComponent(0).Name);
for I := 0 to 4 do
if Assigned(Proc)
then Proc(IntToStr(I));
end;

 
接受答案了.
 
顶部