Не работает OnExit

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Не работает OnExit

Сообщение sign »

В IDE назначаю компонентам TEdit события OnEnter и OnExit.
Событие OnExit не срабатывает при выходе из едита.
Поставил точку остановки.
Событие DoEnter работает, т.е. по F7 туда ухожу после завершения OnEnter.
Процедура по OnExit не реагирует на точку остановки. Поставил её в DoExit.
Мимо, остановка не происходит.
Следовательно, процедура, которая создалась по клику в OnExit, не присвоилась OnEditingDone.
???
Lazarus-0.9.29-23983-fpc-2.4.1-20100314-win32.exe
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

У меня событие OnExit работает. Lazarus 0.9.29 r23990 FPC 2.4.1 i386-win32-win32/win64.
Не совсем понял, причём тут OnEditingDone.

Так что пример неработающего проекта с пояснениями - в студию. :)
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Пожалуйста.
Вот этот пример. После прохода по едитам, все StaticText`ы становятся красными.
Т.е. Edit1Enter и Edit2Enter вызываются по событию, а Edit1Exit и Edit2Exit - нет.

Код: Выделить всё

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    procedure Edit1Enter(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
    procedure Edit2Enter(Sender: TObject);
    procedure Edit2Exit(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Edit1Enter(Sender: TObject);
begin
  StaticText1.Font.Color:=clRed;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  StaticText1.Font.Color:=clBlue;
end;

procedure TForm1.Edit2Enter(Sender: TObject);
begin
  StaticText2.Font.Color:=clRed;
end;

procedure TForm1.Edit2Exit(Sender: TObject);
begin
  StaticText2.Font.Color:=clBlue;
end;

end.
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Что значит "после прохода"?

Выложите полный проект, пожалуйста.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Вот, то, что я выложил и не работает.
На форме два TEdit и два TStaticText.

"После прохода" - это когда фокус перемещаешь (табом или посредством мышки) с одного едита в другой.
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

Скорее всего события отрабатываются, просто статик текст не перерисовывается.
Попробуй вместе с присвоением фонта сделать ШоуМессадж для проверки. Или после присвоения фонта - репаинт или Invalidate статик тексту.
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Создал проект, вбил туда ваш код. У меня всё работает. Lazarus 0.9.29 r24055 FPC 2.4.1 i386-win32-win32/win64 Windows XP SP2.
Что я делаю не так? :mrgreen:
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Скачал Lazarus 0.9.29 r24055 FPC 2.4.1 i386-win32-win32/win64 Windows XP SP2.
Ничего не изменилось.

???
По сути происходящего у меня.
Когда кликаешь мышой в инспекторе объектов по пункту OnExit, то создается процедура Edit1Exit и Edit2Exit соответсвено.

Прошелся по вызовам, обнаружил, что не срабатывает вот тут

Код: Выделить всё

procedure TWinControl.WMKillFocus(var Message: TLMKillFocus);
var
  ParentForm: TCustomForm;
begin
  //DebugLn('TWinControl.WMKillFocus A ',Name,':',ClassName);
  Assert(False, Format('Trace: %s', [ClassName]));
  if [csLoading,csDestroying,csDesigning]*ComponentState=[] then
  begin
    if Self is TCustomForm then
    begin
      if TCustomForm(Self).Active then
      begin
        EditingDone;
        DoExit;
      end;
    end else
    begin
      ParentForm := GetParentForm(Self);
      if Assigned(ParentForm) and
        ParentForm.Active then
      begin
        EditingDone;
        DoExit;
      end;
    end;
  end;
end;

Вот этот участок кода:

Код: Выделить всё

     if Assigned(ParentForm) and
        ParentForm.Active then
      begin
        EditingDone;
        DoExit;
      end;

ParentForm.Active - всегда False.
Потому, эти процедуры

Код: Выделить всё

        EditingDone;
        DoExit;

Никогда не вызываются.
???
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Ещё раз повторюсь, что у меня ваш пример работает. На этот раз Lazarus 0.9.29 r24073 FPC 2.4.1 i386-win32-win32/win64 Windows XP SP2.

Вы уверены, что пользуетесь немодифицированными Lazarus и FPC? Точно ли у вас не работает именно этот пример? Может быть не работает другой, более сложный проект?
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Скачано с http://www.hu.freepascal.org/lazarus/
Не работает именно на этом примере, впрочем, как и в любых моих проектах.

Трассировка показала, что у меня всегда (в процедуре WMKillFocus) ParentForm.Active = false.
Вот, кто тут вмешивается, не знаю, возможно результат взаимодействия лазаруса с виндовозом.
abarit
незнакомец
Сообщения: 9
Зарегистрирован: 15.03.2010 19:42:17

Сообщение abarit »

sign, может быть глупо, но в винде нет настроек, аля - делать окно под курсором активным? Или еще каких-то таких причуд?

Попробуйте выполнить свою программу у друга. Эффект наблюдается?
Последний раз редактировалось abarit 19.03.2010 00:18:24, всего редактировалось 1 раз.
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Пока могу посоветовать только следующее:

  1. Полностью удалить Lazarus через его деинсталлятор, удалить остатки каталога, куда он был установлен, удалить каталог настроек

    Код: Выделить всё

    %USERPROFILE%\Local Settings\Application Data\lazarus
  2. Убедиться, что в системе отсутствуют лишние установки FPC и нет ничего лишнего в переменной Path;
  3. Установить Lazarus обратно и попробовать ещё раз.
Если это не поможет, разбираться с антивирусами, дистрибутивом Винды и т.п.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Уже понятно, что на другом компе всё будет отлично.
Дело в виндовозе или каких-то настройках.

Пошел удалять лазарус и ставить заново.

Кстати, мне так и не понятно, нафига столько проверок при потере фокуса, когда как при установке фокуса всего лишь одна проверка

Код: Выделить всё

  if [csLoading,csDestroying,csDesigning]*ComponentState=[] then


Добавлено спустя 1 час 54 минуты 33 секунды:
Не помогло. :(
eevee
новенький
Сообщения: 63
Зарегистрирован: 29.12.2009 16:52:44
Откуда: Саратов

Сообщение eevee »

Формат раздела с виндой не может не помочь )
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Знаю.
Просто потом столько геморроя с переустановкой кучи программ.
Вот, когда окончательно с дельфи на лазарус переползу, тогда и с форточек слезу.
Ответить