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

时间:2019-06-13 01:12:14

标签: delphi delphi-10-seattle

此C ++代码中围绕ChildWindowFromPoint() for 循环在Delphi中等效于什么:

HWND  hWnd;
POINT point;

...

for (HWND currHwnd = hWnd;;)
{
    hWnd = currHwnd;
    ScreenToClient(currHwnd, &point);
    currHwnd = ChildWindowFromPoint(currHwnd, point);
    if (!currHwnd || currHwnd == hWnd)
        break;
}

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

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;

1 个答案:

答案 0 :(得分: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;

cppreference.com上的每个for loop

  

正式语法:

     

attr (可选)用于( 初始声明 条件(可选) iteration_expression (可选) 声明

     

非正式语法:

     

attr (可选)。用于( 声明或表达(可选)。; 声明) -or-expression (可选); 表达式(可选) 声明

     

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

     

初始声明-要么

     
      
  • 表达式语句(可能是 null语句“ ;;”)

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

         

    请注意,任何 init-statement 都必须以分号结尾;这就是为什么通常将其非正式地描述为表达式或声明后跟分号的原因。

  •   
     

条件-要么

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

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

  •   
     

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

     

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

     

说明

     

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

     
{
    init_statement 
    while ( condition ) { 
        statement 
        iteration_expression ; 
    }
}

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

HWND hWnd;
POINT point;

...

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

...

currHwnd := hWndWindow;
repeat
  hWndWindow := currHwnd;
  ScreenToClient(currHwnd, MousePoint);
  currHwnd := ChildWindowFromPoint(currHwnd, MousePoint);
until (currHwnd = 0) or (currHwnd = hWndWindow);