在线等待,请问高手,如何在自己的控件中加入一个Tstrings类的属性(100分)

  • 主题发起人 主题发起人 guchenyi
  • 开始时间 开始时间
G

guchenyi

Unregistered / Unconfirmed
GUEST, unregistred user!
我已经添加此属性,但是在编译后,在object inspector 里面点击“...”这个按钮,照例应该
弹出编辑界面,可 每次报错:"cannot assign nil to a TRichEditSTring"
代码如下:
type
TMyCustomStringGrid = class(TStringGrid)
private
FColumncheck: TStrings;
FColNeedChecked: boolean;
procedure SetColCheck(Value: TStrings);
procedure GetChecked;
procedure SetChecked(checked: boolean);
{ Private declarations }
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent);
destructor Destroy;
{ Public declarations }
published
property ColCheck: TStrings read FColumncheck write SetColCheck;
property NeedChecked: boolean read FColNeedChecked write SetChecked;
{ Published declarations }
end;

procedure Register;

implementation

constructor TMyCustomStringGrid.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FColumncheck := TStringList.Create;
end;

destructor TMyCustomStringGrid.Destroy;
begin
inherited Destroy;
FColumncheck.Free;
end;

procedure TMyCustomStringGrid.GetChecked;
begin
NeedChecked := FColNeedChecked;
end;

procedure TMyCustomStringGrid.SetChecked(checked: boolean);
begin
FColNeedChecked := checked;
end;

procedure TMyCustomStringGrid.SetColCheck(Value: TStrings);
begin
FColumncheck.Assign(Value);
end;
 
可能是你应该注册属性编辑器
至于如何注册,我具体调试一下再告诉你!
 
我认为应该编写一个继承TStrings的类,实现所有TStringS的抽象方法。
并保持控件显示文本的同步。代码结构大致如下:
type
TCustomcontrol = class(...)
private
FStrings: TStrings;
procedure SetStrings(const Value: TStrings);
public
constructor Create(AOwner: TComponent); override;
{实现代码
inherited;
FStrings := TLMStrings.Create;
TLMStrings(FStrings).fcontrol:= Self;
}
destructor Destroy; override;
published
property Strings :TStrings read FStrings Write SetStrings;
end;

TLMStrings = class(TStrings)
private
fcontrol:TCustomcontrol; //关联的控件
protected
function Get(Index: Integer): string; override;
function GetCount: Integer; override;
public
procedure Clear; override;
procedure Delete(Index: Integer); override;
procedure Insert(Index: Integer; const S: string); override;
end;
 
你修改一下这句话
procedure TMyCustomStringGrid.SetColCheck(Value: TStrings);
begin
FColumncheck.Assign(Value);
end;
改为
procedure TMyCustomStringGrid.SetColCheck(Value: TStrings);
begin
FColumncheck.Text := Value.Text;
end;
试试看,应该没有问题了
 
我成功了,谢谢各位,其实我的代码是对的,不过出了点小问题。
不过最后那位,你这么说是不对的,TString是个类,同普通的变量不一样的,所以用:=可能有问题
我是用对象复制的。
 
多人接受答案了。
 
后退
顶部