我试图在Delphi XE或更高版本中使用增强的RTTI功能来读取和写入XML对象.到目前为止,我已成功使用整数,浮点数,字符串,枚举类型,集合和类,但无法正确输出或读取记录.问题似乎是获取记录属性的实例(指针).
//Outputs Properties To XML
procedure TMyBase.SaveToXML(node: TJclSimpleXMLElem);
var
child , subchild : TjclSimpleXMLElem ;
FContext : TRttiContext ;
FType : TRttiType ;
FProp : TRttiProperty ;
Value : TValue ;
MyObj : TMyBase ;
FField : TRttiField ;
FRecord : TRttiRecordType ;
Data : TValue ;
begin
FContext := TRttiContext.Create ;
FType := FContext.GetType ( self.ClassType ) ;
Child := node.Items.Add ( ClassName ) ;
for FProp in FType.GetProperties do begin
if FProp.IsWritable then begin
case FProp.PropertyType.TypeKind of …Run Code Online (Sandbox Code Playgroud) 我在Delphi中编写了一个映射程序,用户可以在后台加载我存储在内存中的光栅图像.在一个案例中,用户成功加载了44MB BMP但程序运行缓慢,当他们打印时(我平铺输出)他们得到了Out Of Resources错误.我将BMP转换为PNG(3MB),程序执行得更好,打印作业也成功.
由于PNG必须扩展到相同大小的DIB,为什么会出现性能/资源差异?如果有什么需要更多的工作和内存分配来加载PNG.我错过了什么?
由于似乎没有任何明显的答案我会写一个小的演示项目,所以我可以进一步研究.
我在Delphi中编写了一个Windows程序,它使用GetCharWidth和Em-Square非常精确地将文本放置到屏幕和打印机上.这适用于ANSI文本,您只需要检索和计算255个字符的宽度,但是当您使用65535个字符转到Unicode时,它太慢了.由于必须创建2个宽度数组,一个用于普通数组,一个用于粗体数,因此问题变得更严重.
//Setup a reference canvas for measuring purposes
RefDC := CreateCompatibleDC ( FCanvas.Handle ) ;
DPI := GetDeviceCaps ( RefDC , LOGPIXELSY ) ;
//find EmSquare
GetOutlineTextMetrics ( RefDC , sizeof(otm) , @otm[0] ) ;
EmSq := otm[0].otmEmSquare ;
//calc NORMAL char sizes
GetObject ( FCanvas.Font.Handle , SizeOf ( lf ) , @lf ) ;
lf.lfHeight := -EmSq ;
lf.lfWidth := 0 ;
lf.lfWeight := FW_NORMAL ;
hf := CreateFontIndirect ( lf ) ;
hold := SelectObject ( RefDC , …Run Code Online (Sandbox Code Playgroud) 我用动态数组写了一个32位程序来存储一个未知计数的三角形列表.我目前的策略是估计非常多的三角形,然后在创建所有三角形时修剪列表.在某些情况下,我只会在其他情况下分配一次内存,我需要添加到分配中.
对于一个非常大的数据集,当我的应用程序的内存使用量大约为1.2GB时,我的内存不足,而且由于分配步骤太大,我觉得我可能会破坏内存.
看看FastMM(内存管理器)我看到这些常量会建议其中一个是增量的好大小.
ChunkSize = 64 * 1024;
MaximumSmallBlockSize = 32752;
LargeBlockGranularity = 64 * 1024;
Run Code Online (Sandbox Code Playgroud)
其中一个是增加阵列大小的最佳尺寸吗?
最终这个程序将成为64位,但我们还没有为这一步做好准备.