会的应该不难,控件里的控件属性为什么只能在设计期间能够正常显示,但运行时却不能显示 (100分)

  • 主题发起人 主题发起人 nhuangjr
  • 开始时间 开始时间
N

nhuangjr

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做一个组件。该组件继承BusinessSkin的 TbsSkinPanel 。我想在组件里添加一个TbsSkinTextLabel 属性,用来在SkinPanel 的caption 下面显示一些文字信息。我的代码如下:

unit FlashCaptionPanel;

interface

uses
SysUtils, Classes, Controls, ExtCtrls,Graphics,Types, bsSkinCtrls;

type

TTestPanel = class(TbsSkinPanel)
private
{ Private declarations }
protected
{ Protected declarations }
FPanelText: TbsSkinTextLabel;
procedure SetPanelText(Value:TbsSkinTextLabel);
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure AddPanelText;
published
{ Published declarations }
property PanelText : TbsSkinTextLabel read FPanelText write SetPanelText ;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('MyFlashPanel VCL', [TTestPanel]);
end;


constructor TTestPanel.Create;
begin
inherited Create(AOwner);
AddPanelText;
end;
destructor TTestPanel.Destroy;
begin
if FPanelText<>nil then FPanelText.Free;
inherited ;
end;
procedure TTestPanel.AddPanelText;
begin
FPanelText:=TbsSkinTextLabel.Create(self);
FPanelText.Lines.Add('');
//FPanelText.SetBounds(10,10,50,50);
FPanelText.Align:=alClient;
FPanelText.Alignment:= taCenter;
FPanelText.Parent :=self;
FPanelText.Visible :=true;
end;

procedure TTestPanel.SetPanelText ;
begin
FPanelText.Assign(Value);
end;
end.

该组件可以正常注册,但PanelText.Lines 的东西只能在设计期间能够在面板上正常显示,在运行时,给PanelText.Lines.add('东西') 的话没有显示请高手指教该怎么改啊!!!
 
procedure TTestPanel.SetPanelText(Value: TStrings);
begin
FPanelText.BeginUpdate;
FPanelText.Assign(Value);
FPanelText.EndUpdate;
end;
 
FPanelText 根本就没有 BeginUpdate 和 EndUpdate 函数啊
 
procedure TTestPanel.SetPanelText ;
begin
FPanelText.Assign(Value);
Caption := FPanelText.Caption;
end;

你更新的是你的成员变量,而基类(TbsSkinPanel)并不了解你对FPanelText进行过设置.
我对你的TbsSkinTextLabel和TbsSkinPanel不了解,只是猜测该控件的文字应放在Caption中.
 
我不是想把内容在TbsSkinPanel的caption上显示啊!!!我想把TbsSkinTextLabel放在TbsSkinPanel的Caption下面显示。

TbsSkinPanel 是一个容器,如果设置TbsSkinPanel的CaptionMode 为true的话 TbsSkinPanel的显示会分为两部分,上面是显示Caption;下面是容器,我下面这些语句就是想把TbsSkinTextLabel放在 TbsSkinPanel上面的。
FPanelText:=TbsSkinTextLabel.Create(self);
FPanelText.Lines.Add('');
//FPanelText.SetBounds(10,10,50,50);
FPanelText.Align:=alClient;
FPanelText.Alignment:= taCenter;
FPanelText.Parent :=self;
FPanelText.Visible :=true;

其实,在设计时,显示是正常的,不知道为什么运行时就不行。
我以前没有开发过控件,对这个不熟悉,希望高手帮忙看一下啊

其实,上面的代码很简单啊,如果你们有装BusinessSkin 的话,用我的代码注册一个控件试试就很清楚我的意思了。



 
我大概知道问题的原因了!!!
应该是因为放在 TbsSkinPanel 上面的 TbsSkinTextLabel 如果它的 Lines 内容改变了它不会重画自己,如果我手工帮它重画的话TbsSkinTextLabel 的内容就可以显示了。

 
你的代码会有内存泄露……
 
kingron:详细说一下,我也学习学习。大师应该有大师的风范。不要总见首不见尾的
哈哈,谢谢
 
赫赫,看错了,没有~~~~~~~~Sorry。
 
多人接受答案了。
 
后退
顶部