我想创建一个播放列表控件.我有很多信息要显示在TStringList中.我想将记录分配给TStringGrid.Objects而不是对象,因为这么多对象可能需要一段时间才能创建/销毁.它也需要大量的RAM.
记录将更快更轻薄.我怎样才能做到这一点?
TYPE
AMyRec= packed record
FullName : string[255];
RelativePath : boolean;
IsInvalid : boolean;
InCache : boolean;
etc
end;
Run Code Online (Sandbox Code Playgroud) 如何从Delphi压缩文件(设置'c'属性)?我说的是NTFS下可用的"压缩内容以节省磁盘空间"功能.
似乎FileSetAttr不允许我为文件设置'c'属性.
在过去,我不得不使用大文件,大约在0.1-3GB范围内.并非所有"列"都需要,因此可以将剩余数据放入RAM中.现在我必须处理1-20GB范围内的文件,它们可能会随着时间的推移而增长.这完全不同,因为您无法再将数据放入RAM中.
我的文件包含数百万个"条目"(我找到了一个有30个条目的条目).入口包含大约10个"列":一个字符串(50-1000个unicode字符)和几个数字.我必须按"列"对数据进行排序并显示它.对于用户,只有顶部条目(1-30%)是相关的,其余的是低质量数据.
所以,我需要一些关于朝哪个方向发展的建议.我绝对不希望将数据放入数据库中,因为它们很难为非计算机精通人员安装和配置.我喜欢提供一个单一的程序.
显示数据并不困难.但排序......无需在RAM中加载数据,在常规PC(2-6GB RAM)上......将会耗费一些时间.
我看了一下MMF(内存映射文件),但丹尼索普的这篇文章表明它可能不合适:http://dannythorpe.com/2004/03/19/the-hidden-costs-of-memory-映射出的文件/
所以,我在考虑只加载必须在ram中排序的列中的数据和指向'entry'的地址(到磁盘文件中)的指针.我对"列"进行排序,然后使用指针找到与每个列单元格对应的条目并恢复该条目."恢复"将直接写入磁盘,因此不需要额外的RAM.
PS:我正在寻找一种适用于Lazarus和Delphi的解决方案,因为Lazarus(实际上是FPC)对Mac有64位支持.64位表示可用RAM更多=排序更快.
Result:= b8;
Result:= Result+ (b7 SHL 8);
Result:= Result+ (b6 SHL 16);
Result:= Result+ (b5 SHL 24);
Result:= Result+ (b4 SHL 32);
Result:= Result+ (b3 SHL 40); <------ here
Result:= Result+ (b2 SHL 48);
Result:= Result+ (MSB SHL 56);
Run Code Online (Sandbox Code Playgroud)
(结果为int64,b1-b8为字节).
但是编译器抱怨"常量exp违反了子范围".然后我发现了这个警告"编译器将拒绝超过32的硬编码移位权限值,除非数据类型是Int64.对于网站上的Shl"也是如此.Delphi Help对此一无所知.为什么有限制?我可以阻止它吗?也许编译器指令或什么?我可以使用乘法来克服它,但速度会慢一些.有更快的方法吗?
编辑:我也想创建两个红衣主教,因为我可以在红衣主教上使用SHL,然后将红衣主教合并在一起.这只需要一次乘法.还有其他想法吗?
编辑2:代码是算法的一部分,该算法将数字形式基数255转换为基数256(反之亦然).我这样做了5亿次; 所以速度很重要.
我在这里遇到了类似的问题:Delphi XE - 我应该使用String还是AnsiString?.在确定在我的(大)库中使用ANSI字符串是正确的之后,我意识到我实际上可以使用RawByteString而不是ANSI.因为我将UNICODE字符串与ANSI字符串混合在一起,所以我的代码现在几乎没有在它们之间进行转换的地方.但是,看起来如果我使用RawByteString我摆脱了那些转换.
请让我知道您对此的看法.
谢谢.
更新:
这似乎令人失望.看起来编译器仍然从RawByteString转换为字符串.
procedure TForm1.FormCreate(Sender: TObject);
var x1, x2: RawByteString;
s: string;
begin
x1:= 'a';
x2:= 'b';
x1:= x1+ x2;
s:= x1; { <------- Implicit string cast from 'RawByteString' to 'string' }
end;
Run Code Online (Sandbox Code Playgroud)
我认为它做了一些内部工作(比如复制数据),我的代码也不会快得多,我仍然需要在我的代码中添加大量的类型转换才能使编译器静音.
我在Delphi 7程序中有这个常量.他们没有在Delphi XE下编译.
TYPE
TSingleChar= AnsiChar;
CONST
noData: TSingleChar= '.';
Ambiguity= ['x'];
DNA_Ambig= ['x', noData]+ Ambiguity;
Run Code Online (Sandbox Code Playgroud)
[DCC错误] E2026预期的常量表达式.
我已将旧项目从Delphi 7升级到Delphi XE.该项目(以及其他)有一些THOTKey控件.在Delphi 7下,THOTKey控件正常工作.但在Delphi XE下他们就像残疾人一样.这意味着即使为它们分配了快捷方式(例如Alt + A),它们也没有显示任何内容,我无法编辑它们.
还有其他人有这个问题吗?
更新:
我删除了所有控件和该项目的所有代码.现在我只有主窗体和一个THOTKey控件.基本上,删除所有控件后,我的项目就像一个全新创建的项目,没有一行代码.但是THOTKey仍然不能在Delphi XE下工作,仍然可以在D7下运行.
下面的演示试图在窗体的画布上绘制GIF.它不起作用.图像不会前进.如何使它工作?
procedure TForm1.FormCreate(Sender: TObject);
begin
GIF := TGIFImage.Create;
GIF.LoadFromFile('c:\2.gif');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
GIF.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
VAR i: Integer;
begin
REPEAT
for i:= 0 to GIF.Images.Count-1 DO
begin
DisplayGifFrame(i);
Sleep(30);
end;
UNTIL FALSE;
end;
procedure TForm1.DisplayGifFrame(AIndex: Integer);
VAR
Renderer: TGIFRenderer;
begin
Renderer := TGIFRenderer.Create(GIF);
TRY
Renderer.Animate := TRUE;
Renderer.FrameIndex := AIndex;
Renderer.Draw(Canvas, Canvas.ClipRect);
{save frame in a bitmap here. save bitmap to disk}
// xxx
FINALLY
Renderer.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我想要实现的目标:
我想从GIF中提取所有帧并将每个帧放入一个UNIQUE位图.
更新:
续此处:无法在动态创建的TBitmap上绘制GIF
Delphi-WebP是一个为Google 的 libWebP.dll提供 Delphi 绑定的项目,它加载 WebP 图像,但该项目没有提供特定于 Delphi 的图像代码。
如何将 WebP 图像加载到 TImage 或 TBitmap 中?
在Windows 7下使用Delphi XE时遇到了一个大问题.活动PAS文件(Delphi IDE编辑器)选项卡的颜色几乎与非活动选项卡的颜色相同.所以你无法确定哪个是活动标签.你们中的任何人都有同样的问题吗?如何解决这个问题?