小编WeG*_*ars的帖子

我想为TStringList.Objects分配一条记录

我想创建一个播放列表控件.我有很多信息要显示在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

8
推荐指数
2
解决办法
6707
查看次数

如何在Delphi中设置文件的压缩属性?

如何从Delphi压缩文件(设置'c'属性)?我说的是NTFS下可用的"压缩内容以节省磁盘空间"功能.

似乎FileSetAttr不允许我为文件设置'c'属性.

compression delphi ntfs

8
推荐指数
3
解决办法
1417
查看次数

排序20GB的数据

在过去,我不得不使用大文件,大约在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更多=排序更快.

delphi lazarus delphi-xe

8
推荐指数
2
解决办法
1419
查看次数

我不能使用带有int64变量的SHL(向左移位)

 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

7
推荐指数
3
解决办法
3057
查看次数

Delphi XE - RawByteString vs AnsiString

我在这里遇到了类似的问题: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 delphi-unicode

7
推荐指数
2
解决办法
1万
查看次数

Delphi中的集合XE与它们在D7中的工作方式不同

我在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预期的常量表达式.

  1. XE中我的旧代码无法编译的内容是什么?
  2. 我认为代码本身被解释为Unicode.我对么?

delphi delphi-7 delphi-xe

7
推荐指数
2
解决办法
578
查看次数

在Delphi XE下,THOTKey不再起作用了

我已将旧项目从Delphi 7升级到Delphi XE.该项目(以及其他)有一些THOTKey控件.在Delphi 7下,THOTKey控件正常工作.但在Delphi XE下他们就像残疾人一样.这意味着即使为它们分配了快捷方式(例如Alt + A),它们也没有显示任何内容,我无法编辑它们.

还有其他人有这个问题吗?


更新:
我删除了所有控件和该项目的所有代码.现在我只有主窗体和一个THOTKey控件.基本上,删除所有控件后,我的项目就像一个全新创建的项目,没有一行代码.但是THOTKey仍然不能在Delphi XE下工作,仍然可以在D7下运行.

delphi delphi-7 delphi-xe

7
推荐指数
1
解决办法
390
查看次数

如何从TGifImage中提取帧到位图?

下面的演示试图在窗体的画布上绘制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 gif

7
推荐指数
1
解决办法
877
查看次数

如何在 TImage 或 TBitmap 中显示 WebP 图像?

Delphi-WebP是一个为Google 的 libWebP.dll提供 Delphi 绑定的项目,它加载 WebP 图像,但该项目没有提供特定于 Delphi 的图像代码。
如何将 WebP 图像加载到 TImage 或 TBitmap 中?

delphi webp

7
推荐指数
1
解决办法
3616
查看次数

如何提高Delphi IDE中当前选项卡的可见性?

在Windows 7下使用Delphi XE时遇到了一个大问题.活动PAS文件(Delphi IDE编辑器)选项卡的颜色几乎与非活动选项卡的颜色相同.所以你无法确定哪个是活动标签.你们中的任何人都有同样的问题吗?如何解决这个问题?

delphi

7
推荐指数
1
解决办法
267
查看次数

标签 统计

delphi ×10

delphi-xe ×3

delphi-7 ×2

compression ×1

delphi-unicode ×1

gif ×1

lazarus ×1

ntfs ×1

webp ×1