更新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;
Run Code Online (Sandbox Code Playgroud)
即使启用了优化,带有更新包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 r0, [sp, #8]
8: 78c1 ldrb r1, [r0, #3]
a: 7882 ldrb r2, [r0, #2]
c: ea42 2101 orr.w r1, r2, r1, lsl #8
10: 7842 ldrb r2, [r0, #1] …
Run Code Online (Sandbox Code Playgroud) 我已经创建了一个自定义的MSBuild .targets
文件,我通过IDE将其包含在Delphi XE项目中,并从项目管理器的上下文菜单中启用它.虽然文件验证,但在重新保存项目文件后它总是被禁用.
这是目标文件的简化版本,名为Custom.targets
.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Hello">
<Message Text="Hello from custom target"/>
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
作为一个独立的文件,这按预期工作:输入...
MSBuild Custom.target /t:Hello
Run Code Online (Sandbox Code Playgroud)
...在命令行中给出了预期的消息.
Custom.targets
通过IDE 添加到Delphi项目会按预期在项目管理器中显示该文件,该.dproj
文件现在包含该行...
<TargetsFile Include="Custom.targets"/>
Run Code Online (Sandbox Code Playgroud)
我在IDE的项目管理器中右键单击该文件并进行选择Enable
.但是在构建项目时,Build
消息窗口显示:
[MSBuild警告] Custom.targets(1):忽略禁用导入:
PathToProjectSource\\Custom.targets
在项目管理器中再次右键单击仍显示该Enable
选项而不是预期Disable
.
在命令行MSBuild ProjectName.dproj /t:Hello
也失败了.
我试过黑客攻击.dproj
文件添加行...
<Import Project="Custom.targets"/>
Run Code Online (Sandbox Code Playgroud)
打字MSBuild ProjectName.dproj /t:Hello
现在有效.但是下次我从IDE保存项目文件时,<Import>
语句将被删除.
有人知道出了什么问题吗?
我有一个客户端/服务器应用程序,我一直在一台PC上开发.现在它需要两个串口,所以我从朋友那里借了一台电脑.
当我构建我的应用程序并尝试运行或调试它时(无论是在Delphi IDE中还是从Windows文件管理器中),它出现错误"应用程序无法正确启动(0xc000007b)".
谷歌搜索没有带来多少,但似乎表明这不是特定于Delphi的其他应用程序.它似乎是由64位应用程序调用32位DLL引起的,反之亦然.
任何人都可以给我一个提示,如何跟踪这个?
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服务器(使用常规Web浏览器,通过http://localhost:port/
网址测试.顺便说一下,尝试使用Google搜索演示,此网址出现,并且我问不到一个小时前.那可怕,谷歌.
Update2请参阅下面的我自己的答案,工作代码即将推出一个链接.
我是Visual Studio 2010和C#的新手.如何使用快捷方式将所选文本向左/向右缩进?
在Delphi IDE中,等价物是Ctrl+ Shift+ I和Ctrl+ Shift+U
在XCode中,通过将这些方法添加到NSView子类可以防止窗口在单击时变为活动状态:
- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent )theEvent {
return YES;
}
- (BOOL)acceptsFirstMouse:(NSEvent )theEvent {
return YES;
}
- (void)mouseDown:(NSEvent )theEvent {
[[[NSApp]] preventWindowOrdering];
}
Run Code Online (Sandbox Code Playgroud)
在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);
Run Code Online (Sandbox Code Playgroud)
我怎样才能将NSView子类化以防止我的FMX TForm在点击时变为活动状态?
如何在firemonkey中创建" No Activate "表单?
在Delphi 2009中,SysUtils.pas包含第425行:
EProgrammerNotFound = class(Exception);
Run Code Online (Sandbox Code Playgroud)
问:这个异常类是否仍在Delphi中声明(目前是XE7)?答:是的,甚至有记录!
指示软件故障的非标准方式.
您可以使用EProgrammerNotFound作为替代,以指示在运行时检测到的软件故障.
在开始之前,我想指出的是,我已经通过谷歌进行了这样的事情,并且无法找到一个,我已经诚实而真实地搜索过.
我要求(对于我正在开发的项目)列出所有Delphi(2007年到最新发布的版本,我不再支持2007年以前的任何版本)"语言功能",以及它们被引入的版本和(在适用的情况下)弃用,改进或删除.
我之前已经在Stack Overflow上注意到类似的问题,尽管其中大部分是以"哪个特征最好"的形式表达的,并且被认为是不合适的.
如果有人知道这样的清单(或有足够的业余时间来编制一个清单),我将非常感激.
接受的答案将包含指向此类列表的链接或列表本身.
据我所知,Windows没有提供API函数来告诉应用程序注册了一个全局热键(通过RegisterHotkey).我只能发现如果RegisterHotkey返回false,则注册了热键,但不是"拥有"热键的人.
在没有直接API的情况下,是否会有迂回的方式?Windows维护与每个注册热键相关联的句柄 - 这有点令人抓狂,因此无法获取此信息.
可能不起作用的示例:发送(模拟)已注册的热键,然后拦截Windows将发送给注册它的进程的热键消息.首先,我不认为拦截消息会显示目标窗口句柄.其次,即使有可能,这也是一件坏事,因为发送热键会触发各种程序中各种可能不需要的活动.
这并不重要,但我已经看到了对这种功能的频繁请求,并且我自己也是注册热键的应用程序的受害者,甚至没有在UI或文档中的任何地方公开它.
(在Delphi工作,只不过是WinAPI的学徒,请善待.)
在Windows控制面板中选择大字体大小(如125%或150%)时,每次按像素设置某些内容时,VCL应用程序中都会出现问题.
拿走TStatusBar.Panel
.我已经设置了它的宽度,使它只包含一个标签,现在使用大字体标签"溢出".与其他组件相同的问题.
戴尔的一些新笔记本电脑已经默认设置为125%,因此在过去这个问题非常罕见,现在非常重要.
可以做些什么来克服这个问题?
delphi ×10
delphi-xe ×2
delphi-xe2 ×2
windows ×2
64-bit ×1
android ×1
android-ndk ×1
api ×1
arm ×1
c# ×1
c++builder ×1
delphi-2007 ×1
delphi-2009 ×1
delphi-xe7 ×1
firemonkey ×1
hotkeys ×1
indentation ×1
llvm ×1
macos ×1
msbuild ×1
soap ×1
web-services ×1
winapi ×1
windows-7 ×1