我试图在我的代码上运行调试,但不知何故它停止工作.这是一个片段和它显示的绿线:
clean它..stat和.dcu.Release和Debug模式,重建,重新编译它们.Debugging选项Project -> Options -> Delphi compiling都设置为true.search paths.我究竟做错了什么?
我有以下代码:
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在他的答案中建议的那样,但这也不会发出声音.
我在我们的一个应用程序中遇到了货币问题。我在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) 我在Delphi Seattle中创建了一个多设备应用程序,并添加了一个带有MenuItem1和MenuItem2的TMainMenu(没有别的).构建和运行OSX,只有MenuItem2显示.构建和运行Windows,两个菜单项都显示.我没有区别对待这两个菜单项.两者都只是添加而不是以任何方式定制.还有其他人经历过吗?
我正在使用Delphi Seattle,主题是Windows 10,为Windows Desktop创建程序.
在TEditif活动NumbersOnly属性中,当您尝试键入单词时,您会看到标准的Windows提示.
如果我离开没有主题的程序,则提示正确显示,并显示消息说明您只能输入数字.但如果活动主题消息不可读.
任何人都知道我可以在哪里更改这个,因为我正在查看内部Vcl.StdCtrls.pas并且找不到向用户生成此消息的时间.
正确提示:
如果我编译下面的代码,它会在第1行给出警告:
分配给lTime的值从未使用*
但是,如果我删除该行,我会在第2行收到不同的警告:
变量lTime可能尚未初始化
编译器缺少某些东西,还是我?
procedure TFormWebServices.RemoveOldReports;
var
TSR : TSearchRec;
I : Integer;
lCutOff,
lTime : Int64;
TSToDelete: TStringList;
S,Msg : String;
E : Exception;
begin
lCutOff := DelphiToJavaDateTime(Now - cDefReportLifeMins/1440);
I := FindFirst(FReportDir + '*.pdf',0,TSR);
TSToDelete := TStringList.Create;
while I = 0 do
begin
if (TSR.Attr and faDirectory) = 0 then
begin
lTime := lCutOff; // Line 1
try
lTime := StrToInt64(Copy(TSR.Name,1,pos('.',TSR.Name)-1));
except
on E:Exception do lTime := lCutOff;
end;
if lTime < lCutOff then // Line 2 …Run Code Online (Sandbox Code Playgroud) 我承认我在这个问题中处于肮脏的技巧领域.
问题:exe部署在共享文件夹上(我从现在开始称之为ShaExe),而不是以某种方式改变部署规则我想在本地缓存文件(我从现在称之为LocExe)并且在启动ShaExe时我终于运行了LocExe.每次修改ShaExe(=更新)时,必须更新LocExe(从ShaExe复制).
不知怎的,我正在研究的是设置这样的东西:
先决条件:LocExe路径是用户\ AppData\Local\MyApp编码路径,因此ShaExe知道LocExe的位置.
ShaExe推出
ShaExe将其大小与LocExe的大小进行比较,如果不同,它会将ShaExe复制到LocExe上
ShaExe使用-skiplauncher命令行参数执行LocExe
ShaExe自行终止
何时-skiplauncher使用上述列表中的2 2 4点未执行(这是为了避免执行LocExe和终止应用程序的无限循环)
现在这种方法有效,但瓶颈是(1)因为ShaExe大小是110MB所以不知何故从共享路径启动exe需要时间(即使我不使用该标志{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP}).
我试图准备一个非常小的版本的ShaExe(基本上没有单位但只有启动器逻辑,最终只有6MB的exe).
对于这个"轻而无用的ShaExe",整个过程更快.
我希望(2)(3)和(4)立即执行,这可能与Windows有关吗?
我完全清楚最好的做法是在本地手动复制文件并运行它,或者创建一个简单的启动程序exe,它可以在必要时运行LocExe来执行缓存,但我有一个非常大的客户需要我做这没有改变部署过程.
这就是我在这里寻求专家建议的原因.
这是我的代码(当然简化了,而不是Unit1想象100个单位):
//this is the dpr
program MYProgram;
uses
Vcl.Forms,
execache in 'execache.pas',
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
RunCachedExe;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
//this is the execache unit
unit execache;
interface
uses
Vcl.Forms,
Windows,
ShellAPi,
sysutils,
dialogs,
system.IOUtils;
procedure RunCachedExe;
implementation
procedure RunCachedExe;
function GetFileSize(const aFilename: String): Int64;
var
info: …Run Code Online (Sandbox Code Playgroud) 我维护了一些在特定单元中使用的非常旧的Delphi代码EmptyString.
编译器将其解析为
costant EmptyString ='' - 来自System.string
现在我的硬盘中没有System.string.pas文件,或.dcu,所以我无法了解更多相关信息.
我找到了
C:\Program Files (x86)\Embarcadero\Studio\17.0\source\rtl\sys\system.SysUtils.pas
Run Code Online (Sandbox Code Playgroud)
另一个类似常数:
{ Empty string and null string pointer. These constants are provided for
backwards compatibility only. }
EmptyStr: string = '';
{$IFNDEF NEXTGEN}
NullStr: PString = @EmptyStr;
Run Code Online (Sandbox Code Playgroud)
乍一看似乎EmptyStr和EmptyString过去只使用所以他们莫名其妙地弃用所以最好使用''直接在重新定义它们的应用程序或定义常量.
现在升级第三方组件后,我意识到这EmptyString已不再解决了.
我的问题是:究竟是System.String什么?为什么rtl中没有相应的.pas文件?
我用Google搜索没有成功.
谢谢.
我陷入了编译器说的麻烦:
不兼容的类型:“ AnsiChar”和“ Integer”
到AnsiChar数组的最后一个元素,它是一个整数,它是一个空终止。如何解决?
C ++代码:
static const BYTE myarray[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 0 };
SOCKET s;
// Usage example:
if(Send(s, (char *) myarray, sizeof(myarray), 0) <= 0)
return;
Run Code Online (Sandbox Code Playgroud)
我在Delphi中的尝试:
var
MyArray: array [0 .. MAX_PATH] of AnsiChar = ( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 0 );
S: TSocket;
// Usage example:
send(S, MyArray, Length(MyArray), 0);
Run Code Online (Sandbox Code Playgroud) 我使用下面的代码通过递归复制文件夹。工作正常,但至少对我来说还是存在问题,因为复制后源文件夹标签也包含在dest文件夹中,我不想要它。在这一刻发生了什么:
SRC文件夹:
C:\MyTest
-firstfolder
-secondfolder
-- secondfolderFile
Run Code Online (Sandbox Code Playgroud)
DEST文件夹(复制后):
C:\NewTest
-MyTest
-firstfolder
-secondfolder
-- secondfolderFile
Run Code Online (Sandbox Code Playgroud)
然后我需要在dest文件夹中仅保留:
C:\NewTest
-firstfolder
-secondfolder
-- secondfolderFile
Run Code Online (Sandbox Code Playgroud)
如何使用以下代码做到这一点?
program testCopyRecursion;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Windows,
ShellAPI,
SysUtils;
function CopyFolder(const SrcFolder, DestFolder: String; iFileOp: Integer;
OverWrite: Boolean; ShowDialog: Boolean): Boolean;
var
MyFOStruct: TSHFileOpStruct;
Src, Dest: String;
ResultVal: Integer;
begin
Result := False;
Src := SrcFolder;
Dest := DestFolder;
if not DirectoryExists(Dest) then
ForceDirectories(Dest);
if (Src = '') or ((iFileOp <> FO_DELETE) and (Dest = '')) or
(CompareText(Src, …Run Code Online (Sandbox Code Playgroud)