Questions tagged «delphi»

Delphi是一种通过使用对象Pascal快速开发本机Windows,macOS,Linux,iOS和Android应用程序的语言。该名称指的是Delphi语言及其库,编译器和IDE,用于帮助编辑和调试Delphi项目。

1
如何影响Android / ARM目标的Delphi XEx代码生成?
更新2017-05-17。我不再为产生此问题的公司工作,也无法访问Delphi XEx。在我在那里的时候,通过迁移到混合FPC + GCC(Pascal + C)来解决问题,对于某些例程,NEON内在函数有所作为。(强烈建议使用FPC + GCC,因为它可以使用标准工具,尤其是Valgrind。)如果有人可以通过可靠的示例演示他们实际上如何从Delphi XEx生成优化的ARM代码,我很乐意接受答案。 Embarcadero的Delphi编译器使用LLVM后端为Android设备生成本机ARM代码。我有大量Pascal代码,需要将这些代码编译到Android应用程序中,并且我想知道如何使Delphi生成更有效的代码。现在,我什至没有在谈论诸如自动SIMD优化之类的高级功能,而只是在生成合理的代码。当然必须有一种方法可以将参数传递给LLVM端,否则会影响结果?通常,任何编译器都会有很多选择来影响代码的编译和优化,但是Delphi的ARM目标似乎仅仅是“优化开/关”,仅此而已。 LLVM应该能够生成合理的紧致和明智的代码,但是Delphi似乎在以奇怪的方式使用其功能。Delphi希望非常大量地使用堆栈,并且通常只将处理器的寄存器r0-r3用作临时变量。也许最疯狂的是,它似乎正在将正常的32位整数作为四个1字节的加载操作进行加载。如何使Delphi产生更好的ARM代码,而又没有它为Android带来的逐字节麻烦呢? 起初,我认为逐字节加载是为了交换big-endian的字节顺序,但事实并非如此,它实际上只是加载具有4个单字节加载的32位数字。*可能是加载完整的32位,而不会产生未对齐的字大小的存储器负载。(是否应该避免那是另一回事,这暗示整个事情都是编译器错误)* 让我们看一下这个简单的函数: function ReadInteger(APInteger : PInteger) : Integer; begin Result := APInteger^; end; 即使启用了优化,带有更新包1的Delphi XE7以及XE6也会为该功能生成以下ARM汇编代码: Disassembly of section .text._ZN16Uarmcodetestform11ReadIntegerEPi: 00000000 <_ZN16Uarmcodetestform11ReadIntegerEPi>: 0: b580 push {r7, lr} 2: 466f mov r7, sp 4: b083 sub sp, #12 6: 9002 str …

2
始终禁用Delphi XE自定义生成目标
我已经.targets通过IDE 创建了一个自定义MSBuild 文件,该文件已包含在Delphi XE项目中,并从项目管理器的上下文菜单中启用了该文件。尽管该文件可以验证,但是在我重新保存项目文件后,它总是被禁用。 这是目标文件的简化版本,名为Custom.targets。 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="Hello"> <Message Text="Hello from custom target"/> </Target> </Project> 作为独立文件,它可以按预期工作:键入... MSBuild Custom.target /t:Hello ...在命令行中给出了预期的消息。 Custom.targets通过IDE 添加到Delphi项目中,将在项目管理器中按预期显示该文件,并且该.dproj文件现在包含以下行: <TargetsFile Include="Custom.targets"/> 我在IDE的项目管理器中右键单击该文件,然后选择Enable。但是,在构建项目时,将Build显示消息窗口: [MSBuild警告] Custom.targets(1):忽略禁用的导入: PathToProjectSource\\Custom.targets 在项目管理器中再次右键单击仍会显示该Enable选项,而不是预期的Disable。 在命令行上MSBuild ProjectName.dproj /t:Hello也失败。 我试图破解.dproj文件以添加行... <Import Project="Custom.targets"/> MSBuild ProjectName.dproj /t:Hello现在可以输入。但是下次我从IDE保存项目文件时,该<Import>语句将被删除。 任何人都知道发生了什么事吗?


17
应用程序无法正确启动(0xc000007b)
我有一个正在单台PC上开发的客户端/服务器应用程序。现在它需要两个串行端口,所以我从朋友那里借了一台PC。 当我构建应用程序并尝试运行或调试它时(无论是在Delphi IDE中还是从Windows文件管理器中),它都会出现错误“应用程序无法正确启动(0xc000007b)”。 谷歌搜索并没有带来太多,但是似乎表明这与Delphi无关,并且在其他应用程序中也会发生。这似乎是由于从64位应用程序调用32位DLL引起的,反之亦然。 两台PC均为Windows 7、64位 两者都具有只能处理32位的Delphi Xe2入门版 该应用程序可以在我的PC上正常运行,但不能在我朋友的PC上运行 其他Delphi应用程序在两台PC上都可以正常运行 谁能给我一个关于如何追踪的提示?
159 windows  delphi  64-bit 

1
用于Delphi XE的SOAP服务器和客户端应用程序VCL + indy演示?
Delphi曾经包括用于Web服务的demos文件夹,但似乎不再包括它。 我只是尝试了Delphi 7演示项目(SOAPDMServerWAD一个完全没有UI的服务器,并且SOAPDMClient),但即使在Delphi 7中也无法使其正常运行。 如果有人曾经在Delphi XE或Delphi 2010中进行过类似的演示工作SOAPDMServerWAD+SoapDMClient,而与在Delphi XE中进行工作的旧演示相同,并且至少具有来自Delphi SOAP Server应用程序向导的最小UI,那将是完美的。 更新:该演示在Delphi 2010之前一直出现,但是使用了已经过时的WAD(web-app-debugger),我试图将其移植到新的Indy上runtime/web-app-development-harnessing-code,但是我似乎无法使其正常工作。该演示已运行,但该服务器没有用户界面,并且似乎没有运行任何HTTP服务器(已通过http://localhost:port/url 使用常规Web浏览器进行了测试。顺便说一下,尝试谷歌搜索一个演示,此URL出现,并且我不到一个小时前问,谷歌,这真是吓人。 Update2请参阅下面的我自己的答案,有关工作代码的链接即将发布。

2
如何在Firemonkey中创建“不激活”表单
在XCode中,通过将以下方法添加到您的NSView子类中可以防止在单击窗口时激活该窗口: - (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent )theEvent { return YES; } - (BOOL)acceptsFirstMouse:(NSEvent )theEvent { return YES; } - (void)mouseDown:(NSEvent )theEvent { [[[NSApp]] preventWindowOrdering]; } 在Windows平台上,可以通过以下简单代码完成: HWND hWnd = FindWindowW((String("FM") + fmxForm->ClassName()).c_str(), fmxForm->Caption.c_str()); SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE); 如何在单击NSView时将其子类化,以防止其激活? 如何在firemonkey中创建“ 不激活 ”表单?

8
在Delphi中EProgrammerNotFound异常?
在Delphi 2009中,SysUtils.pas在425行中包含以下内容: EProgrammerNotFound = class(Exception); 这仅仅是一个 复活节彩蛋还是严重的事情? 什么时候应该提出这个例外? 它是否也存在于Delphi Prism和/或Free Pascal中? 问:此异常类是否仍在Delphi(当前为XE7)中声明?答:是的,甚至有文件记载! 指示软件故障的非标准方式。 您可以使用EProgrammerNotFound作为替代,以指示在运行时检测到软件故障。

8
找出什么程序注册了全局热键?(Windows API)
据我所知,Windows没有提供API函数来告诉哪个应用程序已经注册了全局热键(通过RegisterHotkey)。我只能发现如果RegisterHotkey返回false,而不是谁“拥有”该热键,则该热键已注册。 在没有直接API的情况下,是否会有回旋路?Windows维护与每个已注册热键关联的句柄-有点令人发疯的是,应该无法获取此信息。 可能不起作用的示例:发送(模拟)已注册的热键,然后拦截Windows将发送给已注册热键的进程的热键消息。首先,我认为拦截消息不会显示目标窗口句柄。其次,即使有可能,也将是一件坏事,因为发送热键会触发各种程序的各种潜在有害活动。 并不是很关键,但是我经常看到对此类功能的要求,并且我自己是注册热键的应用程序的受害者,甚至没有在UI或文档中的任何位置公开它。 (请在Delphi中工作,并且只不过是WinAPI的学徒,请客气。)

3
引入/不推荐使用的Delphi语言功能和版本列表
在开始之前,我想指出的是,我已经通过Google进行了一次诚实而真诚的搜索,涉及范围很广,无法找到它。 我需要(对于我正在开发的项目)所有Delphi(从2007年到最新发布的版本,我不再支持任何早于2007年的版本)“语言功能”的列表,以及引入这些功能的版本和( (如果适用)不推荐使用,改进或删除。 我之前在Stack Overflow上已经注意到了与此类似的问题,尽管大多数问题都是以“哪个功能最好”的形式表述的,并被认为不合适。 如果有人知道这样的列表(或有足够的空闲时间来编写一个列表),我将不胜感激。 接受的答案将包含指向此类列表的链接,或者包含列表本身。

4
Windows字体缩放大于100%时如何使GUI正常运行
在Windows控制面板中选择较大的字体大小(例如125%或150%)时,每次以像素为单位进行设置时,VCL应用程序都会出现问题。 拿TStatusBar.Panel。我将其宽度设置为仅包含一个标签,现在使用大字体将标签“溢出”。其他组件也有同样的问题。 戴尔的某些新笔记本电脑已将默认设置设为125%,因此,在过去,此问题非常罕见,现在确实非常重要。 如何解决这个问题?

2
如何从Delphi程序或编译器生成的调试信息中提取局部变量信息(地址和类型)?
我的目标是: 给定Delphi编译的32或64位Windows程序中的挂起线程,可以遍历堆栈(可行) 给定堆栈条目,以枚举每种方法中的局部变量及其值。也就是说,至少要找到它们的地址和类型(整数32/64 /有符号/无符号,字符串,浮点数,记录,类...),可以将它们的组合用于查找其值。 第一个很好,这是这个问题的第二个。从高层次上讲,如何在Delphi中给定堆栈条目的情况下枚举局部变量? 从低层次看,这就是我一直在研究的内容: RTTI:未列出有关方法的此类信息。我实际上从未想到过这是一个现实的选择,但无论如何都要在此处列出。 调试信息:加载为调试版本生成的调试信息。 地图文件:即使是详细的地图文件(一种文本格式的文件!打开其中的文件并查看)也不包含局部变量信息。它基本上是地址和源文件行号的列表。非常适合地址与文件和线的关联,例如装订线中的蓝点;不太适合获得更详细的信息 远程调试信息(RSM文件)- 关于其内容或格式的未知信息。 TD32 / TDS文件:我目前的研究方向。它们包含许多其他信息中的全局和局部符号。 我在这里遇到的问题是: 没有TD32文件格式的文档(我可以找到。) 我对它们的大部分了解都来自使用它们的Jedi JCL代码(JclTD32.pas),我不确定如何使用该代码,或者不确定其中的结构是否足够广泛以显示本地var。我很确定它将处理全局符号,但是我对局部符号不确定。我定义了各种各样的常量,并且没有格式的文档,要阅读它们的含义,我在猜测。但是,这些常量及其名称必须来自某个地方。 我可以使用TDS信息找到的源无法加载或处理本地符号。 如果这是正确的方法,那么这个问题将变成“是否存在有关TDS / TD32文件格式的文档,并且是否有任何代码示例加载局部变量?” 代码示例不是必不可少的,但即使非常少也可能非常有用。

10
默认情况下,delphi变量是否使用值初始化?
我是Delphi的新手,并且已经在运行一些测试以查看默认情况下将哪些对象变量和堆栈变量初始化为: TInstanceVariables = class fBoolean: boolean; // always starts off as false fInteger: integer; // always starts off as zero fObject: TObject; // always starts off as nil end; 这是我习惯于其他语言的行为,但是我想知道在Delphi中依靠它是否安全?例如,我想知道它是否取决于编译器设置,或者在不同机器上的工作方式是否不同。依靠对象的默认初始化值是正常的,还是在构造函数中显式设置所有实例变量? 至于堆栈(过程级)变量,我的测试表明,布尔化的布尔值是真实的,整数化的是2129993264,未初始化的对象只是无效的指针(即不是nil)。我猜测规范是总是在访问它们之前设置过程级变量?

1
有没有办法以编程方式判断FastMM是否未释放特定的内存块?
我试图检测是否没有释放一块内存。当然,管理器通过对话框或日志文件告诉我,但是如果我想将结果存储在数据库中怎么办?例如,我想在数据库表中有分配给定块的例程名称。 阅读FastMM的文档后,我知道自版本4.98以来,我们可能会在发生内存分配,释放和重新分配时被管理员通知。例如,OnDebugFreeMemFinish事件正在传递给我们,PFullDebugBlockHeader其中包含有用的信息。PFullDebugBlockHeader缺少一件事-如果应用程序释放了给定的块,则该信息。 除非OnDebugFreeMemFinish仅针对未释放的块调用?这是我不知道并且想找出的。 问题在于,即使挂入OnDebugFreeMemFinish事件,我也无法确定是否释放了该块。 这是一个例子: program MemLeakTest; {$APPTYPE CONSOLE} uses FastMM4, ExceptionLog, SysUtils; procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer); begin //This is executed at the end, but how should I know that this block should be freed //by application? Unless this is executed ONLY for not freed blocks. end; procedure Leak; …

1
使用Delphi XML数据绑定向导时不存在必需的标签
我正在使用XML Data Binding Wizardin Delphi XE2。模式具有此类型的必需标记: <xs:element name="MyReport" type="MyReportType" /> <xs:complexType name="MyReportType"> <xs:all> <xs:element name="Header" type="HeaderType" /> <xs:element name="Values" type="ValuesType" /> <xs:element name="Events" type="EventsType" /> </xs:all> </xs:complexType> 问题是,如果我不向Values-group等添加任何元素,则不会有<Values>-tag,并且XML文件将无法针对进行验证XSD。如果接口提供了一种“添加” Values-tag 的方法,那么这可能不会成为问题。 是否有处理此问题的标准方法,还是我在错误地使用生成的代码? 简单地说,有没有任何办法,变通或以其它方式使用从代码Data Binding Wizard,生成以下XML(这是使用上述模式时,有没有子节点需要什么来验证),给出HeaderType,ValuesType并EventsType有复杂类型的: <MyReport> <Header /> <Values /> <Events /> </MyReport> (我知道还有其他类似的问题,例如通过<xs:sequence>在最终XML文件中不强制执行正确的顺序而生成的代码,但至少对于该问题,存在一种解决方法,只需按正确的顺序插入子代即可。我仍然认为如果Embarcadero能提供一个完整的界面,并考虑更多这些功能,那就太好了。)
99 xml  delphi  xsd  delphi-xe2 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.