gpt4 book ai didi

delphi - DrawText 重载解析错误

转载 作者:行者123 更新时间:2023-12-03 14:48:09 27 4
gpt4 key购买 nike

将一些代码从 D2007 移植到 XE2 时,我遇到了一个我无法理解的编译器错误。请参阅以下示例:

procedure TForm1.FormPaint(Sender: TObject);
var
c: Char;
pc: PChar;
r: TRect;
begin
c := '1';
pc := @c;
r := Bounds(100, 100, 100, 100);
DrawText(Canvas.Handle, pc, 1, r, DT_SINGLELINE or DT_NOCLIP); //1
{$TYPEDADDRESS OFF}
DrawText(Canvas.Handle, @c, 1, r, DT_SINGLELINE or DT_NOCLIP); //2
{$TYPEDADDRESS ON}
DrawText(Canvas.Handle, @c, 1, r, DT_SINGLELINE or DT_NOCLIP); //3
DrawText(Canvas.Handle, PChar(@c), 1, r, DT_SINGLELINE or DT_NOCLIP); //4
end;

D2007 编译没有问题。 XE2 编译器拒绝使用

标记 //3 的行

[DCC Fehler] Unit1.pas(38): E2010 Inkompatible Typen: 'string' und 'Pointer'

我猜这是由于新添加的 DrawText 重载接受 Delphi 字符串所致。

你能解释一下这个错误吗?这不是什么大问题,因为我有一个解决方法(显式转换),但我很好奇。在更高版本的 Delphi 中该错误仍然存​​在吗?

编辑:我问的是编译器中是否有错误,而不是解释为什么它在那里。我很可能忽略了编译器拒绝我的代码的正当理由。

最佳答案

这似乎不是正常的重载解析情况。 DrawText 被定义两次:

function DrawText(hDC: HDC; 
lpString: PWideChar;
nCount: Integer;
var lpRect: TRect;
uFormat: UINT): Integer; external user32 name 'DrawTextW';

function DrawText(hDC: HDC;
const lpString: UnicodeString;
nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer;
begin
Result := Winapi.Windows.DrawText(hDC,
PWideChar(lpString),
nCount,
lpRect,
uFormat);
end;

使用{$TYPEDADDRESS OFF},编译器似乎将^Char解释为无类型的指针,该指针永远不兼容声明的 PChar 类型,而 @c 似乎确实可以解析为 PChar 。这似乎与 {$TYPEDADDRESS OFF} 旨在使所有指针与类型无关的概念不一致。看来 PChar^Char 在编译器中的处理方式与其他指针不同。

使用 {$TYPEDADDRESS ON} 时,@c^Char 变得等效,但奇怪的是,只要有没有要解决的重载解析。

在这两种情况下,重载解析似乎都是在类型兼容性完全建立之前完成的。不过,我不确定是否会将其称为错误...似乎很难在不引起问题的情况下进行更改。

SSCCE

program Project1;

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

{$DEFINE OVLD}

{$IFDEF OVLD}
procedure Test(s:string); overload;
begin
end;
{$ENDIF}
procedure Test(x:PChar); {$IFDEF OVLD}overload; {$ENDIF}
begin
end;

var
c : Char;
pc : ^Char;
begin
{$TYPEDADDRESS OFF}
Test(@c);
Test(pc); //OVLD - Incompatible types : 'string'-'pointer'
//No OVLD - Incompat. types : 'PWideChar'-'pointer'
{$TYPEDADDRESS ON}
Test(@c); //OVLD - Incompatible types : 'string'-'pointer'
//No OVLD - OK
Test(pc); //OVLD - Incompatible types : 'string'-'pointer'
//No OVLD - OK
end.

关于delphi - DrawText 重载解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25053276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com