Delphi 复合组件的错误

Delphi 复合组件的错误,delphi,delphi-7,delphi-2010,vcl,Delphi,Delphi 7,Delphi 2010,Vcl,我正在尝试创建一个复合组件,该组件上有一个TScrollBox,我可以在其上创建多个Tpanel。Tpanel将对其进行控制,但最重要的是TImages。Columns属性确定何时放置到新行。请参阅下面的代码。目前,我可以添加一个TPanel,但当我添加另一个TPanel时,会出现StackOverflow错误 面板是通过图像属性(TStringList)添加的。Stringlists ListChanged事件清除panela dn并重新更新它 从应用程序中,我可以对图像进行如下广告: if

我正在尝试创建一个复合组件,该组件上有一个TScrollBox,我可以在其上创建多个Tpanel。Tpanel将对其进行控制,但最重要的是TImages。Columns属性确定何时放置到新行。请参阅下面的代码。目前,我可以添加一个TPanel,但当我添加另一个TPanel时,会出现StackOverflow错误

面板是通过图像属性(TStringList)添加的。Stringlists ListChanged事件清除panela dn并重新更新它

从应用程序中,我可以对图像进行如下广告:

if OpenPictureDialog1.Execute then
 TViewer1.Images.Add(OpenPictureDialog1.FileName)
我不熟悉组件,所以请对我放松:)

unittviewer;
类型
TViewer=类别(TCustomPanel)
私有的
{私有声明}
fScrollBox:TScrollBox;
fColumns:整数;
图像:t字符串;
宽度:整数;
高度:整数;
过程设置列(值:整数);
程序设置图像(值:t字符串);
过程SetThumbWidth(值:整数);
过程SetThumbHeight(值:整数);
函数GetColumns:整数;
函数宽度:整数;
函数高度:整数;
受保护的
{受保护的声明}
程序行更改(发送方:TObject);
程序更新浏览器;
程序ClearViewer;
公众的
{公开声明}
构造函数创建(AOwner:TComponent);推翻
毁灭者毁灭;推翻
出版
{已发布声明}
属性对齐;
属性列:整数读取GetColumns写入SetColumns默认值5;
属性图像:TStrings读取fImages写入SetImages;
属性ThumbHeight:整数读取GetThumbHeight写入SetThumbHeight默认值100;
属性ThumbWidth:整数读取GetThumbWidth写入SetThumbWidth默认值100;
结束;
程序登记册;
实施
程序TViewer.ClearViewer;
变量
I:整数;
开始
对于I:=fScrollBox.ComponentCount-1向下至0 do
TPanel(自身组件[I])免费;
结束;
程序TViewer.UpdateViewer;
变量
一、 X,Y,C,D:整数;
拇指:TPanel;
img:TImage;
开始
ClearViewer;
//更新thumnails
X:=0;
Y:=0;
C:=0;
D:=5;
拇指:=零;
对于I:=0到fimages。计数-1 do
开始
如果文件存在(fimages[I]),则
开始
//创建一个面板
Thumb:=TPanel.Create(fScrollBox);
Thumb.Parent:=fScrollBox;
拇指。标题:='';
拇指左:=X+D;
拇指顶部:=Y+D;
拇指宽度:=拇指宽度;
拇指高度:=fThumbHeight;
//创造形象
img:=TImage.Create(拇指);
img.Parent:=拇指;
img.Align:=alClient;
img.Stretch:=真;
img.Picture.LoadFromFile(fImages[I]);
结束;
X:=X+拇指宽度+D;
如果C=fColumns,则
开始
X:=0;
Y:=Y+拇指高度+D;
结束;
公司(C);
结束;
结束;
程序TViewer.SetImages(值:t字符串);
开始
f图像。赋值(值);
//更新查看器
更新浏览器;
结束;
过程TViewer.SetColumns(值:整数);
开始
如果fColumns值,则
fColumns:=值;
结束;
程序TViewer.SetThumbWidth(值:整数);
开始
如果是宽度值,则
fThumbWidth:=值;
结束;
程序TViewer.SetThumbHeight(值:整数);
开始
如果是高度值,则
FTH高度:=数值;
结束;
函数TViewer.GetColumns:整数;
开始
结果:=fColumns;
结束;
函数TViewer.GetThumbWidth:整数;
开始
结果:=宽度;
结束;
函数TViewer.GetThumbHeight:整数;
开始
结果:=身高;
结束;
程序TViewer.LinesChanged(发送方:TObject);
开始
//更新查看器
更新浏览器;
结束;
构造函数TViewer.Create(所有者:TComponent);
开始
继承的创建(AOOwner);
ControlStyle:=ControlStyle-[csSetCaption];
fImages:=TStringList.Create;
TStringList(fImages).OnChange:=行更改;
高度:=100;
宽度:=100;
f列:=5;
//添加滚动条
fScrollBox:=TScrollBox.Create(self);
fScrollBox.Parent:=self;
fScrollBox.Align:=alClient;
fScrollBox.VertScrollBar.Visible:=True;
fScrollBox.horzcrollbar.Visible:=True;
结束;
毁灭者TViewer.毁灭;
开始
免费的;
继承;
结束;
程序登记册;
开始
注册表组件('自定义',[TViewer]);
结束;
结束。

您在
ClearViewer()
中变异了错误的列表,
Self
不是
fScrollBox

for I := fScrollBox.ComponentCount-1 downTo 0 do
  TPanel(self.Components[I]).Free;

我将从<代码> TSCRelbox Box 中获得这样的组件,而不是在代码上使用Turbo框来滚动它。我不希望所有的TSCRoBOX组件属性都暴露在使用TScRoBOX代替TSueTeCube时,错误实际上消失了。为什么?你怎么知道有多少人。滚动框的组件是否与属于
Self
的组件相同?因此,我应该在ClearViewer方法中进行哪些更改以使其不会出错?
for I := fScrollBox.ComponentCount-1 downTo 0 do
  TPanel(self.Components[I]).Free;