Не работает OnExit
Модератор: Модераторы
Не работает OnExit
В IDE назначаю компонентам TEdit события OnEnter и OnExit.
Событие OnExit не срабатывает при выходе из едита.
Поставил точку остановки.
Событие DoEnter работает, т.е. по F7 туда ухожу после завершения OnEnter.
Процедура по OnExit не реагирует на точку остановки. Поставил её в DoExit.
Мимо, остановка не происходит.
Следовательно, процедура, которая создалась по клику в OnExit, не присвоилась OnEditingDone.
???
Lazarus-0.9.29-23983-fpc-2.4.1-20100314-win32.exe
Событие OnExit не срабатывает при выходе из едита.
Поставил точку остановки.
Событие DoEnter работает, т.е. по F7 туда ухожу после завершения OnEnter.
Процедура по OnExit не реагирует на точку остановки. Поставил её в DoExit.
Мимо, остановка не происходит.
Следовательно, процедура, которая создалась по клику в OnExit, не присвоилась OnEditingDone.
???
Lazarus-0.9.29-23983-fpc-2.4.1-20100314-win32.exe
У меня событие OnExit работает. Lazarus 0.9.29 r23990 FPC 2.4.1 i386-win32-win32/win64.
Не совсем понял, причём тут OnEditingDone.
Так что пример неработающего проекта с пояснениями - в студию.
Не совсем понял, причём тут OnEditingDone.
Так что пример неработающего проекта с пояснениями - в студию.
Пожалуйста.
Вот этот пример. После прохода по едитам, все StaticText`ы становятся красными.
Т.е. Edit1Enter и Edit2Enter вызываются по событию, а Edit1Exit и Edit2Exit - нет.
Вот этот пример. После прохода по едитам, все 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.Что значит "после прохода"?
Выложите полный проект, пожалуйста.
Выложите полный проект, пожалуйста.
Вот, то, что я выложил и не работает.
На форме два TEdit и два TStaticText.
"После прохода" - это когда фокус перемещаешь (табом или посредством мышки) с одного едита в другой.
На форме два TEdit и два TStaticText.
"После прохода" - это когда фокус перемещаешь (табом или посредством мышки) с одного едита в другой.
Скорее всего события отрабатываются, просто статик текст не перерисовывается.
Попробуй вместе с присвоением фонта сделать ШоуМессадж для проверки. Или после присвоения фонта - репаинт или Invalidate статик тексту.
Попробуй вместе с присвоением фонта сделать ШоуМессадж для проверки. Или после присвоения фонта - репаинт или Invalidate статик тексту.
Создал проект, вбил туда ваш код. У меня всё работает. Lazarus 0.9.29 r24055 FPC 2.4.1 i386-win32-win32/win64 Windows XP SP2.
Что я делаю не так?
Что я делаю не так?
Скачал Lazarus 0.9.29 r24055 FPC 2.4.1 i386-win32-win32/win64 Windows XP SP2.
Ничего не изменилось.
???
По сути происходящего у меня.
Когда кликаешь мышой в инспекторе объектов по пункту OnExit, то создается процедура Edit1Exit и Edit2Exit соответсвено.
Прошелся по вызовам, обнаружил, что не срабатывает вот тут
Вот этот участок кода:
ParentForm.Active - всегда False.
Потому, эти процедуры
Никогда не вызываются.
???
Ничего не изменилось.
???
По сути происходящего у меня.
Когда кликаешь мышой в инспекторе объектов по пункту 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;
Никогда не вызываются.
???
Ещё раз повторюсь, что у меня ваш пример работает. На этот раз Lazarus 0.9.29 r24073 FPC 2.4.1 i386-win32-win32/win64 Windows XP SP2.
Вы уверены, что пользуетесь немодифицированными Lazarus и FPC? Точно ли у вас не работает именно этот пример? Может быть не работает другой, более сложный проект?
Вы уверены, что пользуетесь немодифицированными Lazarus и FPC? Точно ли у вас не работает именно этот пример? Может быть не работает другой, более сложный проект?
Скачано с http://www.hu.freepascal.org/lazarus/
Не работает именно на этом примере, впрочем, как и в любых моих проектах.
Трассировка показала, что у меня всегда (в процедуре WMKillFocus) ParentForm.Active = false.
Вот, кто тут вмешивается, не знаю, возможно результат взаимодействия лазаруса с виндовозом.
Не работает именно на этом примере, впрочем, как и в любых моих проектах.
Трассировка показала, что у меня всегда (в процедуре WMKillFocus) ParentForm.Active = false.
Вот, кто тут вмешивается, не знаю, возможно результат взаимодействия лазаруса с виндовозом.
sign, может быть глупо, но в винде нет настроек, аля - делать окно под курсором активным? Или еще каких-то таких причуд?
Попробуйте выполнить свою программу у друга. Эффект наблюдается?
Попробуйте выполнить свою программу у друга. Эффект наблюдается?
Последний раз редактировалось abarit 19.03.2010 00:18:24, всего редактировалось 1 раз.
Пока могу посоветовать только следующее:
- Полностью удалить Lazarus через его деинсталлятор, удалить остатки каталога, куда он был установлен, удалить каталог настроек
Код: Выделить всё
%USERPROFILE%\Local Settings\Application Data\lazarus - Убедиться, что в системе отсутствуют лишние установки FPC и нет ничего лишнего в переменной Path;
- Установить Lazarus обратно и попробовать ещё раз.
Уже понятно, что на другом компе всё будет отлично.
Дело в виндовозе или каких-то настройках.
Пошел удалять лазарус и ставить заново.
Кстати, мне так и не понятно, нафига столько проверок при потере фокуса, когда как при установке фокуса всего лишь одна проверка
Добавлено спустя 1 час 54 минуты 33 секунды:
Не помогло.
Дело в виндовозе или каких-то настройках.
Пошел удалять лазарус и ставить заново.
Кстати, мне так и не понятно, нафига столько проверок при потере фокуса, когда как при установке фокуса всего лишь одна проверка
Код: Выделить всё
if [csLoading,csDestroying,csDesigning]*ComponentState=[] thenДобавлено спустя 1 час 54 минуты 33 секунды:
Не помогло.
Формат раздела с виндой не может не помочь )
Знаю.
Просто потом столько геморроя с переустановкой кучи программ.
Вот, когда окончательно с дельфи на лазарус переползу, тогда и с форточек слезу.
Просто потом столько геморроя с переустановкой кучи программ.
Вот, когда окончательно с дельфи на лазарус переползу, тогда и с форточек слезу.
