我需要将我的C++代码迁移到Delphi.有许多检查来检查C++代码中是否有给定句柄(HANDLE)NULL.可以在Delphi中使用的等效常量是多少?似乎null在Delphi中与NULLC++ 不同.
我正在分析.XLSX文件中的syles.xml并找到相同的格式ID = 14,在文档https://xlsxwriter.readthedocs.org/en/latest/format.html#format-set-num-format中,它是"m/d/yy",但在OOXML规范ECMA-376第1版第3部分,第147页中.,它变为"mm-dd-yy",当我尝试在Excel 2003中文版中将单元格设置为数字格式ID = 14时,实际显示的字符串在"yyyy-mm-dd"中.由于FormatCode字符串在Excel的区域设置和版本各不相同,如何根据本地版本上安装的Excel的给定numFmtID获取正确的FormatCode字符串?有没有办法调用自动化来获取它?
谢谢
艾伦
在我的Visual C++应用程序中,我知道要分配的总对象(CMyObject)是16728064,每个对象是64字节,因此要分配的总内存是1GB.内存将在开始时分配,在应用程序的整个生命周期中使用,并在最后发布.
在这种情况下,分配内存的最佳方法是什么?
当前我尝试在开头分配内存,如下所示:
CMyObject *p = new CMyObject[16728064];
// Perform tasks.
delete [] p;
Run Code Online (Sandbox Code Playgroud)
但是大部分时间配置都会失败.现在我想做如下:
CMyObject *p[10];
p[0] = new CMyObject[1672806];
p[1] = new CMyObject[1672806];
…
// Perform tasks
Delete [] p[0];
….
Run Code Online (Sandbox Code Playgroud)
这似乎有一段时间了.
因此,我应该将分配分成尽可能小的部分吗?或者对于这种情况有什么好的解决方案吗?
谢谢
最近,在使用Delphi数组时,我遇到了一些问题,这些问题使我对其进行了更仔细的考虑。
我写了一个测试函数:
procedure TForm1.Button2Click(Sender: TObject);
var
MyArray1: array[0..0] of UInt64;
MyArray2: array of UInt64;
Value1, Value2: UInt64;
begin
SetLength(MyArray2, 1);
MyArray1[0] := 100;
MyArray2[0] := 100;
Value1 := PUInt64(@MyArray1)^;
Value2 := PUInt64(@MyArray2)^;
Value1 := PUInt64(@MyArray1[0])^;
Value2 := PUInt64(@MyArray2[0])^;
//Value1 := PUInt64(MyArray1)^;
Value2 := PUInt64(MyArray2)^;
end;
Run Code Online (Sandbox Code Playgroud)
以我的理解,静态数组存储第一个元素,第二个元素等的值。而动态数组存储数组的地址。
因此,PUInt64(@ MyArray2)^实际上将包含64位计算机中阵列的地址,而其中一半包含32位计算机中的地址。
但是,为什么PUInt64(MyArray1)^是无效的强制转换?
而且似乎PUInt64(@ MyArray2 [0])^是最安全的转换,因为它可同时用于静态和动态数组。那是对的吗?
我正在使用Delphi开发一个单线程应用程序,这将执行一个耗时的任务,如下所示:
// time-consuming loop
For I := 0 to 1024 * 65536 do
Begin
DoTask();
End;
Run Code Online (Sandbox Code Playgroud)
循环启动时,应用程序将丢失对最终用户的响应.那不是很好.由于其复杂性,我也不想将其转换为多线程应用程序,因此我相应地添加了Application.ProcessMessages,
// time-consuming loop
For I := 0 to 1024 * 65536 do
Begin
DoTask();
Application.ProcessMessages;
End;
Run Code Online (Sandbox Code Playgroud)
但是,这次虽然应用程序将响应用户操作,但循环中消耗的时间远远大于原始循环,大约10倍.
有没有一种解决方案可以确保应用程序不会丢失响应而不会过多地增加消耗时间?
我正在使用 Delphi XE3。在项目的版本信息中,我看到有一个“Auto Increment Build Number”和一个“Auto Generate Build Number”选项。这两者之间有什么区别,我已经阅读了手册,但找不到任何区别。我认为每次我为项目调用构建命令时,它们都会将构建号增加 1,对吗?
过去,我使用CT2W和CT2A在 Unicode 和 Ansi 之间转换字符串。现在看来,CStringW也CStringA可以完成同样的任务。
我编写以下代码片段:
CString str = _T("Abc");
CStringW str1;
CStringA str2;
CT2W str3(str);
CT2A str4(str);
str1 = str;
str2 = str;
Run Code Online (Sandbox Code Playgroud)
当我分配给它们时,它似乎CStringW也CStringA通过使用来执行转换。WideCharToMultibytestr
CT2W那么,使用/CT2A代替CStringW/的优点是什么CStringA,因为我从未听说过后一对。两位 MS 均不建议使用后一对进行转换。
我正在使用Delphi XE3.在研究了Delphi之后 - 维护对象的自引用之后,我理解类类型的变量实际上是引用对象的指针.
因此,我编写以下代码来测试它,如下所示:
TMyClass = class
public
constructor Create(Name: string);
destructor Destroy;
function GetName: string;
private
FName: string;
end;
PMyClass = ^TMyClass;
constructor TMyClass.Create(Name: string);
begin
FName := Name;
end;
destructor TMyClass.Destroy;
begin
end;
function TMyClass.GetName: string;
begin
Result := FName;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Item: TMyClass;
P: PMyClass;
begin
Item := TMyClass.Create('Jim');
P := PMyClass(Item);
OutputDebugString(PWideChar(Format('Address of object: %x; Address of variable Item: %x; Value of P: %x;',
[Integer(Item), Integer(@Item), Integer(P)])));
OutputDebugString(PWideChar(Format('Name is %s', …Run Code Online (Sandbox Code Playgroud) 我尝试在 Delphi 中使用 TXMLDocument 来枚举 XML 文件。但是每当我退出 ProcessFile 过程时,就会出现“访问冲突”异常。
我将 XMLFile 声明为接口对象 IXMLDocument,而不是 TXMLDocument,并且不手动调用 free 它。
下面是代码:
// Invoke ProcessFile in the main app
ProcessFile('C:\Myfile.xlf', True);
// Process the node recursively
procedure ProcessNode1(Node: IXMLNode);
var
Index: Integer;
begin
if (Node.NodeName = 'trans-unit') then
begin
// Process 'trans-unit'
end
else
for Index := 0 to Node.ChildNodes.Count - 1 do
ProcessNode1(Node.ChildNodes[Index]);
end;
procedure ProcessFile(const SrcFileName: string; const FixMode: Boolean);
var
XmlFile: IXMLDocument;
MainNode, FileNode: IXMLNode;
OriginalFileName, SrcLang, DstLang: string;
begin
// Initialize …Run Code Online (Sandbox Code Playgroud)