此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;
答案 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);