Не работает OnExit

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

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

Не работает OnExit

Сообщение sign » 14.03.2010 11:17:09

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

Re: Не работает OnExit

Сообщение Максим » 14.03.2010 20:11:26

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

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

Re: Не работает OnExit

Сообщение sign » 15.03.2010 07:26:46

Пожалуйста.
Вот этот пример. После прохода по едитам, все 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.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Не работает OnExit

Сообщение Максим » 16.03.2010 00:38:05

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

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

Re: Не работает OnExit

Сообщение sign » 16.03.2010 12:27:00

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

"После прохода" - это когда фокус перемещаешь (табом или посредством мышки) с одного едита в другой.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Не работает OnExit

Сообщение tria » 16.03.2010 13:10:04

Скорее всего события отрабатываются, просто статик текст не перерисовывается.
Попробуй вместе с присвоением фонта сделать ШоуМессадж для проверки. Или после присвоения фонта - репаинт или Invalidate статик тексту.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: Не работает OnExit

Сообщение Максим » 17.03.2010 04:21:48

Создал проект, вбил туда ваш код. У меня всё работает. Lazarus 0.9.29 r24055 FPC 2.4.1 i386-win32-win32/win64 Windows XP SP2.
Что я делаю не так? :mrgreen:
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Не работает OnExit

Сообщение sign » 17.03.2010 11:38:07

Скачал 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;

Никогда не вызываются.
???
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Не работает OnExit

Сообщение Максим » 18.03.2010 02:17:23

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

Вы уверены, что пользуетесь немодифицированными Lazarus и FPC? Точно ли у вас не работает именно этот пример? Может быть не работает другой, более сложный проект?
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Не работает OnExit

Сообщение sign » 18.03.2010 11:43:27

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

Трассировка показала, что у меня всегда (в процедуре WMKillFocus) ParentForm.Active = false.
Вот, кто тут вмешивается, не знаю, возможно результат взаимодействия лазаруса с виндовозом.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Не работает OnExit

Сообщение abarit » 19.03.2010 01:15:58

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

Попробуйте выполнить свою программу у друга. Эффект наблюдается?
Последний раз редактировалось abarit 19.03.2010 01:18:24, всего редактировалось 1 раз.
abarit
незнакомец
 
Сообщения: 9
Зарегистрирован: 15.03.2010 20:42:17

Re: Не работает OnExit

Сообщение Максим » 19.03.2010 01:18:16

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

  1. Полностью удалить Lazarus через его деинсталлятор, удалить остатки каталога, куда он был установлен, удалить каталог настроек
    Код: Выделить всё
    %USERPROFILE%\Local Settings\Application Data\lazarus
  2. Убедиться, что в системе отсутствуют лишние установки FPC и нет ничего лишнего в переменной Path;
  3. Установить Lazarus обратно и попробовать ещё раз.
Если это не поможет, разбираться с антивирусами, дистрибутивом Винды и т.п.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Не работает OnExit

Сообщение sign » 19.03.2010 06:22:29

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

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

Кстати, мне так и не понятно, нафига столько проверок при потере фокуса, когда как при установке фокуса всего лишь одна проверка
Код: Выделить всё
  if [csLoading,csDestroying,csDesigning]*ComponentState=[] then


Добавлено спустя 1 час 54 минуты 33 секунды:
Не помогло. :(
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Не работает OnExit

Сообщение eevee » 19.03.2010 10:16:11

Формат раздела с виндой не может не помочь )
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов

Re: Не работает OnExit

Сообщение sign » 20.03.2010 09:34:31

Знаю.
Просто потом столько геморроя с переустановкой кучи программ.
Вот, когда окончательно с дельфи на лазарус переползу, тогда и с форточек слезу.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

Рейтинг@Mail.ru