小编Ala*_*ark的帖子

如何在Delphi中禁用VCL样式

我在Delphi XE2中使用新的VCL样式系统.它工作得很好,但是我想为一个特定的表单禁用它,它上面有许多图像(一个启动/关于表单).问题是我似乎无法找到将其与特定样式相关联的表单属性,因此不能仅为该表单禁用它.似乎只有全局TStyleManager类似乎是静态的.

考虑到这一点,是否只有这样才能实现调用TStyleManager.TrySetStyle('Windows'),显示表单,然后在表单关闭时将其设置回原始样式?

delphi skinning delphi-xe2 vcl-styles

19
推荐指数
1
解决办法
7056
查看次数

Delphi通用的TInterfaceList是否可行?

在Delphi 2010中,我定义了一个通用的TInterfaceList,如下所示:

type

TInterfaceList<I: IInterface> = class(TInterfaceList)
  function GetI(index: Integer): I;
  procedure PutI(index: Integer; const Item: I);
  property Items[index: Integer]: I read GetI write PutI; default;
end;

implementation

function TInterfaceList<I>.GetI(index: Integer): I;
begin
  result := I(inherited Get(Index));
end;

procedure TInterfaceList<I>.PutI(index: Integer; const Item: I);
begin
  inherited Add(Item);
end;
Run Code Online (Sandbox Code Playgroud)

我还没有遇到任何问题,但这样做有什么本质上的风险吗?是否可以向其添加枚举器以允许..in循环对其进行操作?如果它没有任何问题,我想知道为什么在RTL中还没有定义类似的东西.

delphi delphi-2010

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

Delphi禁用警告失败

我在Delphi 2007应用程序中有以下代码:

function TBaseCriteriaObject.RecursiveCount(
  ObjType: TBaseCriteriaObjectClass): integer;
var    
  CurObj: TBaseCriteriaObject;
begin
  result := 0;
{$WARNINGS OFF}
  for CurObj in RecursiveChildren(ObjType) do
    Inc(Result);
{$WARNINGS ON}
end;
Run Code Online (Sandbox Code Playgroud)

产生此警告:

[DCC Warning] BaseCriteriaObject.pas(255): H2077 Value assigned to 'CurObj' never used
Run Code Online (Sandbox Code Playgroud)

我理解警告但不想更改代码,所以我如何摆脱警告因为{$ WARNINGS OFF}在这种情况下似乎不起作用?

delphi compiler-warnings

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

如何从Delphi中的格式化float中删除exponent

给定像1.00500000274996E-8这样的双重值,如何将其转换为非科学格式,小数点后面的最大位数 - 在这种情况下,8位数将是1.00500000?

转换不应该用零填充,所以2007年将出现在2007年,2012.33和2012.33.

我已经尝试了很多使用Format,FormatFloat,FloatToStrF的组合,但似乎无法获得累积奖金.非常感谢任何帮助.

编辑:我应该澄清我试图将它转换为字符串表示,没有指数(E)部分.

delphi

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

在Delphi中初始化单元之前添加代码

有没有可以添加将在单元初始化之前执行的代码的地方?

我想要这样做的原因是我需要更改DecimalSeparator,这必须在某些单元初始化之前完成.我把它放在项目源代码中,在Application.Initialize之前,但到时候已经太晚了.

我认为它唯一的选择是将它放在需要更改DecimalSeparator的单元的初始化中,是这种情况吗?

提前感谢任何建议.

delphi

4
推荐指数
1
解决办法
2138
查看次数

如何在Delphi中获取RichEdit的文本范围

有没有人知道如何在TRichEdit控件中获取文本的宽度和高度,就像在TCanvas上使用TextWidth和TextHeight一样?

我需要知道这样做的原因是我在一个不可见的表单上有一个RichEdit,我使用Richedit.Perform(EM_FORMATRANGE,...)将内容复制到画布.问题是EM_FORMATRANGE需要一个TFormatRange类型的参数,其中指定了目标rect,但我不知道rect应该是什么,因为我事先并不知道RichEdit中内容的大小.希望有道理.

delphi richedit

3
推荐指数
1
解决办法
3418
查看次数

如何在Delphi(Win32)中找到硬错误的接口转换

我试图在应用程序中找到一些神秘的错误,并且相信原因可能是接口上的一些硬件.例如,这种演员表在Delphi中是不安全的

ISomeInterface(CurrentObj)
Run Code Online (Sandbox Code Playgroud)

应该是

CurrentObj as ISomeInterface
Run Code Online (Sandbox Code Playgroud)

鉴于缺乏编译器警告,我认为应该为强硬派投射,我的问题是如何在代码库中轻松找到这些演员?某种类型的正则表达式grep搜索也许?代码库很大,需要手动搜索它.

regex delphi

3
推荐指数
1
解决办法
253
查看次数

Delphi TreeView DestroyWnd/CreateWnd很慢

我们有一个TTreeView有很多节点 - 通常有20,000个节点甚至更多.这TTreeView用于停靠接口(DevExpress Docking Library).当应用程序中的任何表单停靠或取消停靠时,可停靠表单的句柄将被更改.这在转弯结果DestroyWndCreateWnd过程的所有窗体和控件被调用.

在a的情况下TTreeView,DestroyWnd将节点保存到流并CreateWnd重新加载它们.在我们的具有非常大的树视图的应用程序中,这导致节点在流出和返回时的长延迟.

我的问题:如何防止这种延迟?我听说很多人都高度评价Virtual TreeView,我认为它不是后代TTreeView,它是否避免了这个问题?我们尝试过Developer Express TcxTreeView,但它来自TTreeview,所以它遇到了同样的问题.

delphi treeview vcl virtualtreeview

3
推荐指数
1
解决办法
514
查看次数

内存映射文件可选写可能吗?

使用内存映射文件时,它似乎是只读的或只写的。我的意思是,您不能:

  • 有一个开放供写作,后来决定不保存它
  • 开放阅读,以后决定保存

我们的应用程序使用可写的内存映射文件来保存数据文件,但是由于用户可能想退出而不保存更改,因此我们必须使用用户实际编辑的临时文件。当用户选择保存更改时,原始文件将被临时文件覆盖,因此具有最新更改。这很麻烦,因为文件可能很大(> 1GB),并且复制它们需要很长时间。

我已经尝试了用于创建文件映射的标志的多种组合,但是似乎没有一种组合可以灵活地按需保存。任何人都可以确认这种情况吗?我们的应用程序是用Delphi编写的,但在本例中,它使用标准的Windows API创建映射。

FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, 2 * 65536, nil);
FBasePointer := MapViewOfFile(FileMapHandle, FILE_MAP_WRITE, FileOffsetHigh,
FileOffsetLow, NumBytes);
Run Code Online (Sandbox Code Playgroud)

memory windows delphi winapi memory-mapped-files

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

防止异步代码中的if()快捷方式

我有一组返回a的方法Task<boolean>,它们必须按顺序运行.我想知道任何任务是否都返回true.无论先前任务的结果如何,都必须运行所有任务.

我不能用a)

var success =  (await TaskMethod1() || await TaskMethod2() //etc);  
Run Code Online (Sandbox Code Playgroud)

因为TaskMethod2()可能因为If优化而无法执行; 或b)

var success = await Task.WhenAll(new[] { TaskMethod(), TaskMethod2() //etc});  
Run Code Online (Sandbox Code Playgroud)

因为它们必须按顺序运行.

这导致了以下笨拙和冗长的代码

var success = await TaskMethod1();
if (await TaskMethod2()) 
  success = true; // Repeated for all tasks
Run Code Online (Sandbox Code Playgroud)

有没有人知道更优雅的方式,也许使用ContinueWith?

c#

0
推荐指数
1
解决办法
62
查看次数