从C ++到Delphi:FOR循环中具有指定声明的变量

Bro*_*wJr 7 delphi delphi-10-seattle

从以下C ++代码开始的for循环中,Delphi中的等效项是什么ChildWindowFromPoint()

HWND  hWnd;
POINT point;

...

for (HWND currHwnd = hWnd;;)
{
    hWnd = currHwnd;
    ScreenToClient(currHwnd, &point);
    currHwnd = ChildWindowFromPoint(currHwnd, point);
    if (!currHwnd || currHwnd == hWnd)
        break;
}
Run Code Online (Sandbox Code Playgroud)

我的尝试是这样,但我不确定是否正确:

var
  hWndWindow, currHwnd: HWND;
  MousePoint: TPoint;

...

while True do
begin
  currHwnd := hWndWindow;
  hWndWindow := currHwnd;
  ScreenToClient(currHwnd, MousePoint);
  currHwnd := ChildWindowFromPoint(currHwnd, MousePoint);

  if (currHwnd = 0) or (currHwnd = hWndWindow) then
    Break;
end;
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 10

您的翻译几乎是正确的,但是您犯了一个错误。您需要将初始分配移到循环currHwnd外部while

var
  hWndWindow, currHwnd: HWND;
  MousePoint: TPoint;

...

currHwnd := hWndWindow; // <-- moved here!
while True do
begin
  hWndWindow := currHwnd;
  ScreenToClient(currHwnd, MousePoint);
  currHwnd := ChildWindowFromPoint(currHwnd, MousePoint);

  if (currHwnd = 0) or (currHwnd = hWndWindow) then
    Break;
end;
Run Code Online (Sandbox Code Playgroud)

cppreference.com上的每个for循环

正式语法:

attr(可选),  用于( init-statement  条件(可选)   迭代表达式(可选)   

非正式语法:

attr(可选)  for( 声明或表达式(可选)  ;  声明或表达式(可选)  ;  表达式(可选)  语句

attr(C ++ 11)-任意数量的属性

初始化声明 -

  • 表达式语句(可以为  空语句  “;”)

  • 一个简单的声明,通常是带有初始化程序的循环计数器变量的声明,但是它可以声明任意多个变量

    请注意,任何  初始化语句都  必须以分号;结束,这就是为什么它通常被非正式地描述为表达式或声明,后跟分号的原因。

条件 -要么

  • 在上下文中可转换为bool的表达式。该表达式在每次迭代之前进行求值,如果产生false,则退出循环。

  • 用大括号或等于初始化器声明单个变量。初始化器在每次迭代之前进行求值,如果声明的变量的值转换为false,则退出循环。

eration_expression-任何表达式,在循环的每次迭代之后和重新评估condition之前执行  。通常,这是使循环计数器递增的表达式

statement-任何语句,通常是复合语句,它是循环的主体

说明

上面的语法产生的代码等效于:

{
    init_statement 
    while ( condition ) { 
        statement 
        iteration_expression ; 
    }
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,我将C ++循环转换为Delphi repeat..until循环(并编写了使用do..while循环的C ++代码):

HWND hWnd;
POINT point;

...

HWND currHwnd = hWnd;
do
{
    hWnd = currHwnd;
    ScreenToClient(currHwnd, &point);
    currHwnd = ChildWindowFromPoint(currHwnd, point);
}
while (currHwnd && currHwnd != hWnd);
Run Code Online (Sandbox Code Playgroud)
var
  hWndWindow, currHwnd: HWND;
  MousePoint: TPoint;

...

currHwnd := hWndWindow;
repeat
  hWndWindow := currHwnd;
  ScreenToClient(currHwnd, MousePoint);
  currHwnd := ChildWindowFromPoint(currHwnd, MousePoint);
until (currHwnd = 0) or (currHwnd = hWndWindow);
Run Code Online (Sandbox Code Playgroud)