标签: delphi-10-seattle

为什么我不能将我的函数引用分配给匹配的变量?E2555被提升了

我正在尝试构建一个自定义比较器,它允许将比较函数分配给内部字段.为了简化比较器的创建,我尝试添加一个类似构造函数的类函数Construct来初始化比较器.

现在,如果我尝试编译以下示例,则显示编译器

[dcc32 Fehler] ConsoleDemo1.dpr(37):E2555无法跟踪符号'结果'

我有以下示例代码:

program ConsoleDemo1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  Generics.Collections, Generics.Defaults,
  System.SysUtils;

type

  TConstFunc<T1, T2, TResult> = reference to function(const Arg1: T1; const Arg2: T2): TResult;

  TDemo = class(TComparer<string>)
  private
    FVar: TConstFunc<string, string, Integer>;
    function CompareInternal(const L, R: string): Integer;
  public
    class function Construct(): TDemo;
    function Compare(const L, R: string): Integer; override;
  end;

function TDemo.Compare(const L, R: string): Integer;
begin
  Result := FVar(L, R);
end;

function TDemo.CompareInternal(const L, R: string): Integer;
begin
  Result := …
Run Code Online (Sandbox Code Playgroud)

delphi anonymous-function delphi-10-seattle

15
推荐指数
2
解决办法
1168
查看次数

可以在TQueue中存储数组吗?

在TQueue中存储数组时遇到问题.知道我哪里出错了?代码在Delphi XE 5中工作正常,但在Delphi 10 Seattle中没有.

(我无法确定这是一个错误或它应该如何工作.尝试搜索embarcadero寻找线索但失败了.)

procedure TForm1.Button1Click(Sender: TObject);
var
  FData: TQueue<TBytes>;
  FsData: TQueue<String>;

  arr: TBytes;

begin

  FData := TQueue<TBytes>.Create;
  FsData := TQueue<String>.Create;  
  try
    setlength(arr, 3);
    arr[0] := 1;
    arr[1] := 2;
    arr[2] := 3;

    FData.Enqueue(arr);
    Memo1.Lines.Add('Count, array:' + IntToStr(FData.Count));  // 0?

    FsData.Enqueue('asada');
    Memo1.Lines.Add('Count, string:' + IntToStr(FsData.Count));  // 1
  finally
    FData.Free;
    FsData.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

delphi delphi-10-seattle

13
推荐指数
1
解决办法
660
查看次数

DCPcrypt Hashing德国变形金刚

我使用DCPcrypt和SHA512来散列字符串.

我正在使用Warren Postma的版本https://bitbucket.org/wpostma/dcpcrypt2010

它工作正常.然而,它与德国的变音符号如ä,ö,ü以及其他可能的unicodes相混淆.

我正在使用这样的库:

function TForm1.genhash(str: string): string;
var
  Hash  : TDCP_sha512;
  Digest: array[0..63] of byte;
  i: integer;
  s: string;
begin
  s:= '';
  hash  := TDCP_sha512.Create(nil);
  if hash<>nil then
  begin
    try
      Hash.Init;
      Hash.UpdateStr(str);
      Hash.Final(Digest);

      for i:= 0 to length(Digest)-1 do
        s:= s + IntToHex(Digest[i],2);

    finally
      hash.free;
    end;

  end;
  Result := s;
end;
Run Code Online (Sandbox Code Playgroud)

当我输入字母时,ä我希望输出为:

64868C5784A6004E675BCF405F549369BF607CD3269C0CAC1711E21BA9F40A5ABBF0C7535856E7CF77EA55A072DD04AA89EEA361E95F497AA965309B50587157

我查看了这些网站:http : //hashgenerator.de/ http://passwordsgenerator.net/sha512-hash-generator/

但是我得到:

1A7F725BD18E062020A646D4639F264891368863160A74DF2BFC069C4DADE04E6FA854A2474166EED0914B922A9D8BE0C89858D437DDD7FBCA5C9C89FC07323A

所以我的问题是:我如何使用DCPcrypt库为德语变音符号生成哈希?谢谢

delphi delphi-10-seattle

11
推荐指数
1
解决办法
559
查看次数

为什么在Win64上调用GetDIBits会失败?

我有一个调用,GetDIBits它在32位完美工作,但在64位上失败.尽管手柄的值不同,但bitmapinfo结构的内容是相同的.

这是我可以用来重现错误的最小(至少是结构稍微)代码示例.我使用Delphi 10 Seattle Update 1进行了测试,但是即使使用其他Delphi版本,也会出现错误.

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows,
  System.SysUtils,
  Vcl.Graphics;

type
  TRGBALine = array[Word] of TRGBQuad;
  PRGBALine = ^TRGBALine;

type
  { same structure as TBitmapInfo, but adds space for two more entries in bmiColors }
  TMyBitmapInfo = record
    bmiHeader: TBitmapInfoHeader;
    bmiColors: array[0..2] of TRGBQuad;
  public
    constructor Create(AWidth, AHeight: Integer);
  end;

constructor TMyBitmapInfo.Create(AWidth, AHeight: Integer);
begin
  FillChar(bmiHeader, Sizeof(bmiHeader), 0);
  bmiHeader.biSize := SizeOf(bmiHeader);
  bmiHeader.biWidth := AWidth;
  bmiHeader.biHeight := -AHeight;  //Otherwise …
Run Code Online (Sandbox Code Playgroud)

delphi 64-bit getdibits delphi-10-seattle

10
推荐指数
1
解决办法
806
查看次数

TParallel.&For和TParallel.For之间有区别吗?

有没有之间的差异TParallel.&ForTParallel.For

两者都可以在Delphi 10 Seattle中编译.那么我应该坚持哪一个?

delphi delphi-10-seattle

9
推荐指数
1
解决办法
349
查看次数

Delphi 10 Seattle和10.1 Berlin无法调试COM DLL

我有一个COM DLL项目,我能够在Delphi 2007和XE8中调试它(在断点处停止).

但是,似乎IDE无法在Delphi 10 Seattle或10.1 Berlin的断点处停止.

我的调试步骤:

  1. 更改为DEBUG(并检查勾选的那些调试选项.例如,调试信息)

  2. regsvr32输出目录下的项目DLL

  3. 编写一个简单地创建COM对象并调用其方法的vbscript

  4. 在调试器中,为32位或64位调试设置Run命令行c:\windows\syswow64\cscript.exec:\windows\system32\cscript.exe

  5. 设置命令行参数以运行vbscript.

  6. 在调用的方法上设置断点.

  7. 点击F9

预计:在断点处停下来

在Delphi 2007和XE8中,一切都很好,但我无法在Delphi Seattle或Berlin中完成.

什么可能出错?在Delphi的最新IDE版本下,为了调试COM DLL,是否需要启用/禁用任何设置?

delphi delphi-10-seattle delphi-10.1-berlin

9
推荐指数
1
解决办法
934
查看次数

如何使用TList <_AnyDynamicArrays_>解决Delphi 10的错误?

我偶然发现了Delphi 10 Seattle Update 1中的一个错误.让我们看看以下代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
//----------We crash here----------------
  FList.Items[0] := SplitString('H:E', ':');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FList := TList<TStringDynArray>.Create;
  FList.Add(SplitString('H:E', ':'));
  FList.Items[0] := SplitString('H:E', ':');
end;
Run Code Online (Sandbox Code Playgroud)

乍一看,似乎TList<T>没有正确管理它包含的动态数组的生命周期,但是再次,如果以64位编译它就可以正常工作,它只会崩溃32位(我明白这并不意味着该错误不存在于64位...).

请注意,使用了SplitString,因为if是第一个返回动态数组的函数.遇到了遇到TList<TBookmark>同样问题的原始问题.

有可能解决错误重写过程Button1Click,如下所示:

procedure TForm1.Button1Click(Sender: TObject);
var MyArray : TStringDynArray;
begin
  MyArray := FList.Items[0];
  FList.Items[0] := SplitString('H:E', ':');
  //----------Yeah! We don't crash anymore!-----------
end;
Run Code Online (Sandbox Code Playgroud)

但是,绕过我修改它们以解决这个bug的所有应用程序并不是我的首选选项.如果可能的话,我更喜欢找到有问题的例程并在内存中修补它.

如果有人遇到这个问题并找到了解决方法,我将不胜感激.否则,如果我找到合适的解决方法,我会发布我的.

此外,如果问题仍然存在于柏林,请发表评论.

delphi delphi-10-seattle

9
推荐指数
1
解决办法
336
查看次数

在Stream.read中使用Int64大小的Longint计数是不是很危险?

我正在检查TMemoryStream课程并找到以下例程:

procedure TMemoryStream.LoadFromStream(Stream: TStream);
var
  Count: Longint;
begin
  Stream.Position := 0;
  Count := Stream.Size; // <-- assigning Int64 to Longint
  SetSize(Count);
  if Count <> 0 then Stream.ReadBuffer(FMemory^, Count);
end;
Run Code Online (Sandbox Code Playgroud)

我已经看到了很多将Int64分配给Longint的模式.

我的理解是在32位和64位Windows 中Longint是4个字节并且Int64是8个字节,所以如果我的文件大小是$1 FFFF FFFF == 8589934591 == 8 GB那么这个例程将无法读取,因为最终计数将是$ FFFF FFFF == -1.

我不明白这是如何允许的,也许不予考虑(可能没有多少人试图读取8 GB以上的文件).

delphi delphi-10-seattle

9
推荐指数
1
解决办法
284
查看次数

如何在GetIt包管理器失败时重置下载?

当Delphi崩溃时,我试图通过GetIt下载OmniThread lib.
其他软件包下载,编译和安装都很好,所以我想这是一次性的.

现在GetIt拒绝安装OmniThread,因为它看到了部分下载,假设一切正常并开始编译.这打破了编译错误,GetIt不允许我重置状态并清理下载.

GetIt在哪里存储其下载内容以及如何清除它,以便GetIt将从头开始重新下载源代码?

delphi delphi-xe8 delphi-10-seattle

8
推荐指数
1
解决办法
4377
查看次数

在嵌套方法中访问时,由闭包捕获破坏的局部变量

我已设法将此问题减少到此:

program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils, Threading;

procedure Foo(AString: string);
var
  LTask : ITask;
  capturedString : string;
  procedure Nested;
  begin
    try
      WriteLn('Nested : ' + capturedString); { ! EIntOverflow (Win32) here }
    except on E : Exception do
      WriteLn(E.Message);  
    end; 
  end;
begin
  capturedString := AString;
  WriteLn('Local : ' + capturedString);
  Nested;
  LTask := TTask.Create(
    procedure
      procedure AnonNested;
      begin
        WriteLn(capturedString); { Removing this eliminates the problem }
      end;
    begin
    end);
end;

begin
  Foo('foo');
  ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)

capturedString从嵌套方法中访问变量时,变量会被破坏.一个Win32编译加薪EIntOverflow,一个Win64的编译写出一个(腐败)空字符串-无论是构建可以挑起到AV或其他异常的一些操作,但是在所有情况下,参照本地变量进入时被破坏Nested …

delphi closures anonymous-function delphi-10-seattle

8
推荐指数
1
解决办法
179
查看次数