Я пробую выполнить editbox.SetFocus и/или editbox.Clear, но но это не дает никакого эффекта (по крайней мере видимого). Что я делаю неправильно?

 

Вы посылаете команду на изменение фокуса внутри обработчика, который сам устанавливает фокус, этим вы получаете банальную рекурсию.

 

Я избегаю этого путем отправления собственного сообщения в обработчике OnExit, после чего в обработчике моего сообщения выставляю логический флажок, предохраняющий код от рекурсии, поскольку данный флажок контролируется в обработчике OnExit.

 

Следующие строки содержат необходимый код:

 

 

Code:

interface

........

const

WM_MyExitRtn = WM_USER + 1001;

........

type

TForm1 = class(TForm)

   .........

   private

   bExitInProgress: Boolean; {предохраняемся от рекурсий сообщений}

public

   procedure WMMyExitRtn(var msg: TMessage); message WM_MyExitRtn;

end;

.........

implementation

.........

 

procedure TForm1.DBEdit1Exit(Sender: TObject);

begin

if not bExitInProgress then

   PostMessage(Handle, WM_MyExitRtn, 0, LongInt(Sender));

end;

.........

 

procedure TForm1.WMMyExitRtn(var msg: TMessage);

begin

bExitInProgress := True; { предохраняемся от рекурсивного вызова }

{здесь содержится необходимый код }

bExitInProgress := False; { сбрасываем флаг }

end;

 

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить