我在Delphi XE2中使用新的VCL样式系统.它工作得很好,但是我想为一个特定的表单禁用它,它上面有许多图像(一个启动/关于表单).问题是我似乎无法找到将其与特定样式相关联的表单属性,因此不能仅为该表单禁用它.似乎只有全局TStyleManager类似乎是静态的.
考虑到这一点,是否只有这样才能实现调用TStyleManager.TrySetStyle('Windows'),显示表单,然后在表单关闭时将其设置回原始样式?
在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 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}在这种情况下似乎不起作用?
给定像1.00500000274996E-8这样的双重值,如何将其转换为非科学格式,小数点后面的最大位数 - 在这种情况下,8位数将是1.00500000?
转换不应该用零填充,所以2007年将出现在2007年,2012.33和2012.33.
我已经尝试了很多使用Format,FormatFloat,FloatToStrF的组合,但似乎无法获得累积奖金.非常感谢任何帮助.
编辑:我应该澄清我试图将它转换为字符串表示,没有指数(E)部分.
有没有可以添加将在单元初始化之前执行的代码的地方?
我想要这样做的原因是我需要更改DecimalSeparator,这必须在某些单元初始化之前完成.我把它放在项目源代码中,在Application.Initialize之前,但到时候已经太晚了.
我认为它唯一的选择是将它放在需要更改DecimalSeparator的单元的初始化中,是这种情况吗?
提前感谢任何建议.
有没有人知道如何在TRichEdit控件中获取文本的宽度和高度,就像在TCanvas上使用TextWidth和TextHeight一样?
我需要知道这样做的原因是我在一个不可见的表单上有一个RichEdit,我使用Richedit.Perform(EM_FORMATRANGE,...)将内容复制到画布.问题是EM_FORMATRANGE需要一个TFormatRange类型的参数,其中指定了目标rect,但我不知道rect应该是什么,因为我事先并不知道RichEdit中内容的大小.希望有道理.
我试图在应用程序中找到一些神秘的错误,并且相信原因可能是接口上的一些硬件.例如,这种演员表在Delphi中是不安全的
ISomeInterface(CurrentObj)
Run Code Online (Sandbox Code Playgroud)
应该是
CurrentObj as ISomeInterface
Run Code Online (Sandbox Code Playgroud)
鉴于缺乏编译器警告,我认为应该为强硬派投射,我的问题是如何在代码库中轻松找到这些演员?某种类型的正则表达式grep搜索也许?代码库很大,需要手动搜索它.
我们有一个TTreeView有很多节点 - 通常有20,000个节点甚至更多.这TTreeView用于停靠接口(DevExpress Docking Library).当应用程序中的任何表单停靠或取消停靠时,可停靠表单的句柄将被更改.这在转弯结果DestroyWnd和CreateWnd过程的所有窗体和控件被调用.
在a的情况下TTreeView,DestroyWnd将节点保存到流并CreateWnd重新加载它们.在我们的具有非常大的树视图的应用程序中,这导致节点在流出和返回时的长延迟.
我的问题:如何防止这种延迟?我听说很多人都高度评价Virtual TreeView,我认为它不是后代TTreeView,它是否避免了这个问题?我们尝试过Developer Express TcxTreeView,但它来自TTreeview,所以它遇到了同样的问题.
使用内存映射文件时,它似乎是只读的或只写的。我的意思是,您不能:
我们的应用程序使用可写的内存映射文件来保存数据文件,但是由于用户可能想退出而不保存更改,因此我们必须使用用户实际编辑的临时文件。当用户选择保存更改时,原始文件将被临时文件覆盖,因此具有最新更改。这很麻烦,因为文件可能很大(> 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) 我有一组返回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?
delphi ×9
c# ×1
delphi-2010 ×1
delphi-xe2 ×1
memory ×1
regex ×1
richedit ×1
skinning ×1
treeview ×1
vcl ×1
vcl-styles ×1
winapi ×1
windows ×1