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-任何语句,通常是复合语句,它是循环的主体
说明
上面的语法产生的代码等效于:
Run Code Online (Sandbox Code Playgroud){ init_statement while ( condition ) { statement iteration_expression ; } }
话虽如此,我将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)