我试图在我的代码上运行调试,但不知何故它停止工作.这是一个片段和它显示的绿线:
clean它..stat和.dcu.Release和Debug模式,重建,重新编译它们.Debugging选项Project -> Options -> Delphi compiling都设置为true.search paths.我究竟做错了什么?
在C++ Builder Seattle 10 Update 1安装结束时,Embarcadero的主要设置启动了一个名为Microsoft Windows 10 SDK Installer的附加嵌入式安装程序.这就是它的样子,万一你忘记了:
然后,此安装程序开始安装原始RTM Windows 10 SDK,如下所示:
为什么C++ Builder会安装它?C++ Builder如何与SDK链接 - 它究竟使用了什么?如果我安装一个较新的Windows SDK(例如2015年11月发布的那个),它会起作用吗?(很难想象如何,因为在IDE中设置所有内容以使用文件C:\Program Files (x86)\Embarcadero\Studio\17.0\include\windows\sdk,这些文件包括Embarcadero对SDK所做的更改,例如特殊的bcc32 pragma语句.)
我已经分析了RAD Studio的安装文件,试图弄清楚发生了什么,但我没有一个很好的答案为什么他们正在做他们做的事情:
setup.res文件; 打开里面的7-Zip也.setup.res你会发现MSSDKInstall.exe你在上面第一个截图中看到的内容.在7-Zip内打开它.MSSDKInstall.msi:如果你用Orca打开它,你会发现这是一个非常简单的安装程序,它将一些蓝牙头文件安装到Embarcadero include目录中.OFFLINE目录:包含显然使用了微星8个不同的Windows SDK头文件:BluetoothAPIs.h,bluetoothleapis.h,bthdef.h,bthledef.h,bthsdpdef.h,no_sal2.h,winapifamily.h,ws2bth.h.另外看来,这个单独的安装程序与主要的RAD Studio安装程序冲突.主安装程序还会安装这些相同的头文件.然后运行此安装程序,并替换这些文件.然后它出于某种未知原因启动官方Microsoft Windows 10 SDK安装程序.如果卸载Embarcadero SDK安装程序包,则会完全删除这8个头文件(因此会发生冲突).
所以:(1)为什么他们不在主安装中只包含那8个头文件 - 这一切的重点是什么,(2)为什么他们启动官方的Microsoft Windows 10 …
当我将我的IOS应用程序部署到我的Mac时,IPA文件大小为87.3mb - 在我将应用程序发布到iStore之后,Apple向我发出警告告诉我,在他们做了一些东西后,它将大于100mb并且只允许用户通过Wi-Fi下载.对我来说,我的应用程序保持在100mb以下是非常必要的,以便用户可以通过移动连接下载它
现在 - 我已经做了一些在我看来应该减少应用程序大小但没有真正有用的东西
APK文件大小为43 MB,远远低于google想要的最大50mb
任何帮助或建议将Apple IOS IPA文件缩小都会很棒
编辑
按照@Robotic Cat在评论中的建议进一步检查我发现Unix可执行文件是罪魁祸首......这绝对与delphi如何构建和链接包
结束编辑有关

我工作TStringList有TMemeorySteam很多在我的项目.
msTmp := TMemoryStream.Create;
try
lTemp.SaveToStream(msTmp, TEncoding.Unicode);
finally
msTmp.Free;
end;
.....
lTemp := TStringList.Create;
try
lTemp.LoadFromFile(msTmp, TEncoding.Unicode);
finally
lTemp.Free;
end;
Run Code Online (Sandbox Code Playgroud)
我如何能够 在我的项目中告知LoadFromStream()并且SaveToStream()默认情况下流是UTF-16编码的,而不包括每次调用中的编码类型.所以我只能打电话LoadFromStream(msTmp),它将加载UTF-16编码.
每个人都知道为什么在Form.shate之前调用Form.show,如果属性Form.visible = true.
我在Delphi XE7和Delphi 10 Seattle(为Windows编译的Fmx表单)中测试过
例如:
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
//break point here is called before if form.visible = false
i := 0;
end;
procedure TForm1.FormShow(Sender: TObject);
var
i : integer;
begin
//break point here is called before if form.visible = true
i := 0;
end;
Run Code Online (Sandbox Code Playgroud)
我想将地图文件添加为资源,然后在每次执行系统时提取文件,以确保地图文件始终正确,并使支持的生命更容易.在Delphi 7中,我可以使用map文件作为资源来编译项目,但是映射是错误的,因为当引发异常时,调用堆栈是错误的.在Delphi Seattle中,我甚至无法编译,因为它会在生成映射之前尝试添加资源.我知道我可以在后编译thask中添加该文件,但有没有办法在编译/构建时间中执行此操作?对不起,如果我不是很具体,这是我的第一个问题.谢谢.
UPDATE
在我读了一些答案之后,我做了一些研究.我在我的项目中已经使用了JEDI异常单元,但我不知道JEDI Debug专家.它完全符合我的要求和更多.JEDI Debug专家将.map文件转换为.jdbg文件,这是一个加密的map文件(map只是一个文本文件).此外,jdbg文件比地图小约12%.它还具有将jdbg插入二进制(exe)的选项.为此,我启用了选项:
项目 - > JCL调试专家 - >生成.jdbg文件 - >为此项目启用
项目 - > JCL调试专家 - >将jdbg数据插入二进制 - >为此项目启用
项目 - > JCL调试专家 - >转换后删除地图文件 - >启用此项目(如果要删除文件,当然)
要在IDE外部使用此工具,例如Jenkins,我必须在JEDI\jcl\examples\windows\debug\tools\MakeJclDbg.dpr中构建项目.构建之后,它将在jcl的bin目录中生成exe文件.如何使用:
MakeJclDbg -J -E -M map_filename
J - 创建.JDBG文件
E - 将调试数据插入可执行文件
M - 转换后删除MAP文件
可执行文件必须与MAP文件位于同一目录中.这将创建jdbg文件(基于映射文件),插入exe并删除映射.有了这个(以及JEDI的异常单元),当引发异常时,它可用于堆栈跟踪,系统使用的所有dll的版本,操作系统信息等,并且还将所有这些发送到电子邮件.
我意识到Embarcadero也有他们的bpl的jdbg文件,所以我认为他们也使用JCL工具.
我有以下代码:
IF MessageDlg('Delete?',mtConfirmation,[mbYes,mbNo],0) = MrYes THEN
Begin
///Do Something;
End
Else
Begin
///Do Something;
End;
Run Code Online (Sandbox Code Playgroud)
如果Style是Windows在MessageDlg功能播放声音,但如果我改Style到Windows 10了为例,然后声音不工作.
选择a时为什么声音不存在Style?
我该如何解决这个问题?
注意:我正在使用Delphi 10 Seattle.
更新:
我试着MessageBeep(MB_ICONQUESTION);像David Heffernan在他的答案中建议的那样,但这也不会发出声音.
当我尝试在类中使用数组常量时,我得到以下错误:
[dcc32 Error] TestConstants.dpr(14): E2086 Type 'TArray<T>' is not yet completely defined
当我将它用作全局常量或使用array of string而不是TArray 时,相同的代码编译得很好.有这个工作的诀窍吗?
program Project98;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
TMyTestClass = class
strict private
const
TEST_CLASS_CONSTANT: TArray<String> = ['1','2']; // <-- Error here
TEST_CLASS_CONSTANT2: array of string = ['1','2']; // <-- No error
end;
const
TEST_GLOABL_CONSTANT: TArray<String> = ['3','4']; // <-- No error
TEST_GLOBAL_CONSTANT2: array of string = ['3','4']; // <-- No error
begin
end.
Run Code Online (Sandbox Code Playgroud) 几年前,我C0000006 external exception在一些特定局域网上从共享文件夹运行一个大型(100 + MB)exe时偶然发现了.所以我开始使用这个问题中描述的编译器标志.
在数百个网络中的数百个客户多年成功"执行exe"后,我开始遇到PE标志的问题(不知何故,exe在同一台PC上启动时崩溃,一次排除一个原因,我根据经验发现评论这些标志工作).
不知怎的,我找到的解决方法是两次构建我的exe(并让客户选择部署哪一个),第一个用这些:
{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP}
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}
Run Code Online (Sandbox Code Playgroud)
第二个评论那些.
这个建筑开销很烦人,我想避免它.我不认为有办法,但我要求专家建议:有没有办法"在运行时激活那些标志?" 例如,传递命令行参数?
我想到的另一个解决方法是在exe开始时本地复制exe,这样它总是从本地机器执行,但我担心我需要面对的场景,即使从技术上讲它很简单.
谢谢.
我在我们的一个应用程序中遇到了货币问题。我在Win32和Win64中得到了不同的结果。我在这里找到了显示类似问题的文章,但该文章已在XE6中修复。我尝试做的第一件事是创建一个MCVE来复制该问题。那是车轮掉下来的地方。与应用程序相比,看起来像MCVE中的相同代码会产生不同的结果。生成的代码64位不同。因此,我的问题变成了为什么它们不同,一旦我弄清楚了,便可以创建合适的MCVE。
我有一种计算总数的方法。此方法调用另一个方法来获取需要添加到总计中的值。该方法返回单个。我将单个值分配给变量,然后将其添加到总计(货币)中。在我的主应用程序中,稍后将使用合计值,但将其添加到MCVE不会改变行为。我确保编译器选项相同。
在我的主应用程序中,计算的结果在Win32中为$ 2469.6001,在Win64中为2469.6,但是我无法在MCVE中重复。“编译选项”页面上的所有内容都相同,并且优化被禁用。
这是我尝试的MCVE的代码。这模仿了原始应用程序中的动作。
program Project4;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
TTestClass = class
strict private
FMyCurrency: Currency;
function GetTheValue: Single;
public
procedure Calculate;
property MyCurrency: Currency read FMyCurrency write FMyCurrency;
end;
procedure TTestClass.Calculate;
var
myValue: Single;
begin
FMyCurrency := 0.0;
myValue := GetTheValue;
FMyCurrency := FMyCurrency + myValue;
end;
function TTestClass.GetTheValue: Single;
var
myValueExact: Int32;
begin
myValueExact := 1159354778; // 2469.60009765625;
Result := PSingle(@myValueExact)^;
end;
var
testClass: TTestClass;
begin
testClass := TTestClass.Create;
try
testClass.Calculate; …Run Code Online (Sandbox Code Playgroud)