标签: delphi-10-seattle

为什么断点是绿色的,不起作用?

我试图在我的代码上运行调试,但不知何故它停止工作.这是一个片段和它显示的绿线:

片段

  • 我试图右键单击我的项目和clean它.
  • 试图删除临时文件,如.stat.dcu.
  • 来回切换ReleaseDebug模式,重建,重新编译它们.
  • 下面的Debugging选项Project -> Options -> Delphi compiling都设置为true.
  • 检查中是否没有重复文件search paths.
  • 其他项目正常运作.
  • 也试过咒骂.

我究竟做错了什么?

delphi delphi-10-seattle

5
推荐指数
1
解决办法
3371
查看次数

MessageDlg不发出声音

我有以下代码:

IF MessageDlg('Delete?',mtConfirmation,[mbYes,mbNo],0) = MrYes THEN
Begin
///Do Something;
End
Else
Begin
///Do Something;
End;
Run Code Online (Sandbox Code Playgroud)

如果StyleWindowsMessageDlg功能播放声音,但如果我改StyleWindows 10了为例,然后声音不工作.

  • 选择a时为什么声音不存在Style

  • 我该如何解决这个问题?

注意:我正在使用Delphi 10 Seattle.

更新:

我试着MessageBeep(MB_ICONQUESTION);David Heffernan在他的答案中建议的那样,但这也不会发出声音.

delphi delphi-10-seattle

5
推荐指数
1
解决办法
451
查看次数

除了“编译”选项以外,还有什么可以更改64位的代码生成?

介绍

我在我们的一个应用程序中遇到了货币问题。我在Win32和Win64中得到了不同的结果。我在这里找到了显示类似问题的文章,但该文章已在XE6中修复。我尝试做的第一件事是创建一个MCVE来复制该问题。那是车轮掉下来的地方。与应用程序相比,看起来像MCVE中的相同代码会产生不同的结果。生成的代码64位不同。因此,我的问题变成了为什么它们不同,一旦我弄清楚了,便可以创建合适的MCVE。

我有一种计算总数的方法。此方法调用另一个方法来获取需要添加到总计中的值。该方法返回单个。我将单个值分配给变量,然后将其添加到总计(货币)中。在我的主应用程序中,稍后将使用合计值,但将其添加到MCVE不会改变行为。我确保编译器选项相同。

在我的主应用程序中,计算的结果在Win32中为$ 2469.6001,在Win64中为2469.6,但是我无法在MCVE中重复。“编译选项”页面上的所有内容都相同,并且优化被禁用。

尝试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 delphi-10-seattle

5
推荐指数
1
解决办法
113
查看次数

Delphi FMX TMainMenu第一个菜单项在OSX中不显示,OK在WIndows中显示

我在Delphi Seattle中创建了一个多设备应用程序,并添加了一个带有MenuItem1和MenuItem2的TMainMenu(没有别的).构建和运行OSX,只有MenuItem2显示.构建和运行Windows,两个菜单项都显示.我没有区别对待这两个菜单项.两者都只是添加而不是以任何方式定制.还有其他人经历过吗?

windows delphi macos firemonkey delphi-10-seattle

4
推荐指数
1
解决办法
714
查看次数

NumbersOnly TEdit Delphi提示不起作用

我正在使用Delphi Seattle,主题是Windows 10,为Windows Desktop创建程序.
TEditif活动NumbersOnly属性中,当您尝试键入单词时,您会看到标准的Windows提示.
如果我离开没有主题的程序,则提示正确显示,并显示消息说明您只能输入数字.但如果活动主题消息不可读.

任何人都知道我可以在哪里更改这个,因为我正在查看内部Vcl.StdCtrls.pas并且找不到向用户生成此消息的时间.

正确提示:

在此输入图像描述

错误提示: 在此输入图像描述

delphi vcl-styles delphi-10-seattle

4
推荐指数
1
解决办法
684
查看次数

"未使用的值"更改为"变量未初始化"

如果我编译下面的代码,它会在第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)

delphi compiler-warnings delphi-10-seattle

4
推荐指数
1
解决办法
215
查看次数

有没有办法从共享驱动器上的大型exe执行单元中的代码?

我承认我在这个问题中处于肮脏的技巧领域.

问题:exe部署在共享文件夹上(我从现在开始称之为ShaExe),而不是以某种方式改变部署规则我想在本地缓存文件(我从现在称之为LocExe)并且在启动ShaExe时我终于运行了LocExe.每次修改ShaExe(=更新)时,必须更新LocExe(从ShaExe复制).

不知怎的,我正在研究的是设置这样的东西:

先决条件:LocExe路径是用户\ AppData\Local\MyApp编码路径,因此ShaExe知道LocExe的位置.

  1. ShaExe推出

  2. ShaExe将其大小与LocExe的大小进行比较,如果不同,它会将ShaExe复制到LocExe上

  3. ShaExe使用-skiplauncher命令行参数执行LocExe

  4. 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 exe delphi-10-seattle

4
推荐指数
1
解决办法
150
查看次数

什么是System.String完全在Delphi中?

我维护了一些在特定单元中使用的非常旧的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)

乍一看似乎EmptyStrEmptyString过去只使用所以他们莫名其妙地弃用所以最好使用''直接在重新定义它们的应用程序或定义常量.

现在升级第三方组件后,我意识到这EmptyString已不再解决了.

我的问题是:究竟是System.String什么?为什么rtl中没有相应的.pas文件?

我用Google搜索没有成功.

谢谢.

delphi delphi-10-seattle

4
推荐指数
1
解决办法
200
查看次数

在Delphi中以空终止为整数的BYTE数组(BYTE [])等效于什么?

我陷入了编译器说的麻烦:

不兼容的类型:“ 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)

sockets arrays delphi delphi-10-seattle

4
推荐指数
1
解决办法
167
查看次数

如何通过递归复制文件夹而不在dest文件夹中包含源文件夹标签?

我使用下面的代码通过递归复制文件夹。工作正常,但至少对我来说还是存在问题,因为复制后源文件夹标签也包含在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)

delphi delphi-10-seattle

4
推荐指数
1
解决办法
107
查看次数