我正在尝试构建一个自定义比较器,它允许将比较函数分配给内部字段.为了简化比较器的创建,我尝试添加一个类似构造函数的类函数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) 在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) 我使用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库为德语变音符号生成哈希?谢谢
我有一个调用,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) 有没有之间的差异TParallel.&For和TParallel.For?
两者都可以在Delphi 10 Seattle中编译.那么我应该坚持哪一个?
我有一个COM DLL项目,我能够在Delphi 2007和XE8中调试它(在断点处停止).
但是,似乎IDE无法在Delphi 10 Seattle或10.1 Berlin的断点处停止.
我的调试步骤:
更改为DEBUG(并检查勾选的那些调试选项.例如,调试信息)
regsvr32输出目录下的项目DLL
编写一个简单地创建COM对象并调用其方法的vbscript
在调试器中,为32位或64位调试设置Run命令行c:\windows\syswow64\cscript.exec:\windows\system32\cscript.exe
设置命令行参数以运行vbscript.
在调用的方法上设置断点.
点击F9
预计:在断点处停下来
在Delphi 2007和XE8中,一切都很好,但我无法在Delphi Seattle或Berlin中完成.
什么可能出错?在Delphi的最新IDE版本下,为了调试COM DLL,是否需要启用/禁用任何设置?
我偶然发现了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的所有应用程序并不是我的首选选项.如果可能的话,我更喜欢找到有问题的例程并在内存中修补它.
如果有人遇到这个问题并找到了解决方法,我将不胜感激.否则,如果我找到合适的解决方法,我会发布我的.
此外,如果问题仍然存在于柏林,请发表评论.
我正在检查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崩溃时,我试图通过GetIt下载OmniThread lib.
其他软件包下载,编译和安装都很好,所以我想这是一次性的.
现在GetIt拒绝安装OmniThread,因为它看到了部分下载,假设一切正常并开始编译.这打破了编译错误,GetIt不允许我重置状态并清理下载.
GetIt在哪里存储其下载内容以及如何清除它,以便GetIt将从头开始重新下载源代码?
我已设法将此问题减少到此:
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 …