C++ в Delphi: переменная в цикле FOR с назначенным объявлением

Что эквивалентно в Delphi для этого цикла for вокруг ChildWindowFromPoint() из этого кода C++:

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;
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
2 753
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш перевод почти правильный, но вы допустили один ошибку. Вам нужно переместить начальное назначение 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;

Согласно for петля на сайте cppreference.com:

formal syntax:

attr(optional) for ( init-statement condition(optional) ; iteration_expression(optional) ) statement

informal syntax:

attr(optional) for ( declaration-or-expression(optional) ; declaration-or-expression(optional) ; expression(optional) )statement

attr(C++11) - any number of attributes

init-statement - either

  • an expression statement (which may be a null statement ";")

  • a simple declaration, typically a declaration of a loop counter variable with initializer, but it may declare arbitrary many variables

    Note that any init-statement must end with a semicolon ;, which is why it is often described informally as an expression or a declaration followed by a semicolon.

condition - either

  • an expression which is contextually convertible to bool. This expression is evaluated before each iteration, and if it yields false, the loop is exited.

  • declaration of a single variable with a brace-or-equals initializer. the initializer is evaluated before each iteration, and if the value of the declared variable converts to false, the loop is exited.

iteration_expression - any expression, which is executed after every iteration of the loop and before re-evaluating condition. Typically, this is the expression that increments the loop counter

statement - any statement, typically a compound statement, which is the body of the loop

Explanation

The above syntax produces code equivalent to:

{
    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);

Другие вопросы по теме