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

Description of your first forum.

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

帖子nhuangjr » 星期日, 2004年2月15日 12:01


我想做一个组件。该组件继承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('东西') 的话没有显示请高手指教该怎么改啊!!!
 
 
 

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

帖子lb_icesea79 » 星期日, 2004年2月15日 12:12


procedure TTestPanel.SetPanelText(Value: TStrings);
begin
FPanelText.BeginUpdate;
 FPanelText.Assign(Value);
FPanelText.EndUpdate;
end;
 
 
 

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

帖子nhuangjr » 星期日, 2004年2月15日 12:25


FPanelText 根本就没有 BeginUpdate 和 EndUpdate 函数啊
 
 
 

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

帖子apw » 星期日, 2004年2月15日 12:41


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

你更新的是你的成员变量,而基类(TbsSkinPanel)并不了解你对FPanelText进行过设置.
我对你的TbsSkinTextLabel和TbsSkinPanel不了解,只是猜测该控件的文字应放在Caption中.
 
 
 

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

帖子nhuangjr » 星期日, 2004年2月15日 13:12


我不是想把内容在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 的话,用我的代码注册一个控件试试就很清楚我的意思了。



 
 
 

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

帖子nhuangjr » 星期一, 2004年2月16日 08:55


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

 
 
 

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

帖子Kingron » 星期一, 2004年2月16日 09:07


你的代码会有内存泄露……
 
 
 

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

帖子陈晨 » 星期一, 2004年2月16日 09:43


kingron:详细说一下,我也学习学习。大师应该有大师的风范。不要总见首不见尾的
哈哈,谢谢
 
 
 

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

帖子Kingron » 星期一, 2004年2月16日 11:12


赫赫,看错了,没有~~~~~~~~Sorry。
 
 
 

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

帖子nhuangjr » 星期一, 2004年4月19日 11:31


多人接受答案了。