到目前为止,我觉得我的失败在于搜索术语,因为有关此的信息必须非常普遍.基本上我正在寻找在调整表单大小时对多个组件执行调整大小时的常见解决方案和最佳实践.
我有一个基于组件的表单TScrollBox.ScrollBox包含在运行时动态添加的行.它们基本上是一个子组件.每个人左边都有一个图像,右边有一个备忘录.基于图像的宽度和纵横比设置高度.在调整滚动框的大小时,循环设置触发行自身内部调整大小的行的宽度.如果高度发生变化,循环也会设置相对顶部位置.
截屏:
大约16行表现良好.我的目标是接近32排,非常不稳定,并且可以在100%使用时固定核心.
我试过了:
我想允许在调整大小期间进行行调整大小,以预览图像在行中的大小.这消除了一个明显的解决方案,在某些应用中是可接受的损失.
现在,行内部的调整大小代码是完全动态的,并且基于每个图像的尺寸.我计划尝试的下一件事是基本上根据集合中的最大图像指定宽高比,最大宽度/高度.这应该减少每行的数学量.但似乎问题更多的是调整大小事件和循环本身?
组件的完整单元代码:
unit rPBSSVIEW;
interface
uses
Classes, Controls, Forms, ExtCtrls, StdCtrls, Graphics, SysUtils, rPBSSROW, Windows, Messages;
type
TPBSSView = class(TScrollBox)
private
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ResizeRows(Sender: TObject);
procedure AddRow(FileName: String);
procedure FillRow(Row: Integer; ImageStream: TMemoryStream);
end;
var
PBSSrow: Array of TPBSSRow;
Resizingn: Boolean;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Standard', [TScrollBox]);
end;
procedure TPBSSView.AddRow(FileName: String);
begin
SetLength(PBSSrow,(Length(PBSSrow) + 1));
PBSSrow[Length(PBSSrow)-1] := TPBSSRow.create(self);
With …Run Code Online (Sandbox Code Playgroud) 我正在测试这个Q&A 组件创建的例子 - 将组件连接在一起?了解如何创建自定义/复合组件.
虽然示例中安装的组件可以拖动到表单,但我似乎无法在运行时创建它.
procedure TForm1.Button1Click(Sender: TObject);
var
MyPanel2 : TMyPanel;
begin
MyPanel2 := TMyPanel.Create(Form1);
With MyPanel2 do
begin
Left := 10;
Top := 10;
Width := 400;
Height := 400;
Visible := True;
Image.Picture.LoadFromFile('C:\test.png');
end;
end;
Run Code Online (Sandbox Code Playgroud)
我尝试了自己和Form1作为所有者.使用面板和图像的属性.
只是不确定我做错了什么.没有错误,除非我忘记添加pngimage到我的用途.完成代码的步骤很好,运行时创建没有任何可视化.
我在我的一个测试应用程序中注意到,在向TScrollBox添加了这么多TPanel之后,我遇到了一些超出一定数量的问题.我在绘制之前禁用了滚动框,并且在绘制之前总是清除它,因此没有相对位置问题.最初我想也许我已经遇到了某种最大高度的油漆.所以你知道排列是宽度占据面板垂直堆叠.
因此,我创建了一个新项目来尝试识别和解决问题,并揭示了问题的其他细节.当我在家时,我可以提供示例和视频,但我现在将介绍.制作一个带有TScrollBox spinedit的表单,用于指定按钮在循环中创建面板的面板数量,以及用于释放面板并清空阵列以进行另一次尝试的按钮.我将标题设置为循环中的数字以进行识别.
我尝试了两种堆叠方式,看看是否有点重要.一个是设置位置I乘以高度,所以如果高度为200则i*202给它一个2px的空间.我尝试的新方法是使用对齐顶部.效果可能略有不同,但问题一般来说仍然是一样的.
新问题在于滚动范围.完成循环并启用滚动框后,向下滚动到最后编号面板的底部停止.但它不合适的地方可能是它的200个面板的169以下.然后滚动条调整范围让我到达底部只看到最后一个面板198的旁边.我相信这是使用对齐顶部方法,因为它从未在我的应用程序中发生.我会进一步测试.
底部面板没有放在一边我认为该问题的解决方案是手动计算和设置范围.
设置位置而不是使用对齐顶部时,我的应用程序中出现的主要问题是,在一定数量的面板之后,它们都位于同一位置的末端.在一定数量之前它的罚款说50或100,但在这么多之后它会发生.我知道200次200是一个非常小的整数但可能有一个地址限制?
我将继续测试我仍然需要检查面板高度是否加入其中.但认为这必须是一个已知的问题.顺便提一下Delphi 2009.
现在我使用2个数组,其中一个是TI,另一个是TMemo,用于在滚动框内的一行一行后面的文本数据旁边绘制一个图像.
我希望用Panel上的几个组件替换TMemo.所以可能是一些静态文本按钮和一些标签.但是我现在这样做的方式似乎会变得混乱.
没有编写组件或类,是否有更好的方法来解决这个问题.我应该使用某种多维数组,还是可以使用记录结构来声明组件并拥有一个数组呢?