Странное поведение формы.

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

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

Странное поведение формы.

Сообщение Deimos » 29.01.2014 14:26:52

Форма вызывается другой посредством showmodal и возвращает значение modalresult.

Код: Выделить всё
procedure TsfForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  modalresult:=selected_sf_record;
end; 


При щелчке мышкой на форме, которая вызывала выпадает исключение

[TCustomForm.SetFocus] sfForm:TsfForm Can not focus.,

хотя она закрыта и обращения к ней нет. Прнудительное снятие фокуса не помогает.

Добавлено спустя 5 минут 4 секунды:
ошибка проявляется безсистемно. (иногда есть, иногда нет) при одинаковых действиях.

Добавлено спустя 1 час 3 минуты 28 секунд:
Совсем странное поведение. Если перед закрытием формы поставить паузу (2 сек), то глюк исчезает
Deimos
постоялец
 
Сообщения: 174
Зарегистрирован: 17.01.2010 00:31:30

Re: Странное поведение формы.

Сообщение MiniQ » 30.01.2014 11:57:10

Как бы приведенный пример совсем не дает представления о структуре кода.
Вопрос из разряда "Доктор, у меня это. Что делать?"
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

Re: Странное поведение формы.

Сообщение Sharfik » 30.01.2014 12:56:39

Deimos, создавай новый проект. Создаешь две формы чистые и пишешь методы их вызова как в твоей программе. Когда будет глючить ищешь баг.

Deimos писал(а):[TCustomForm.SetFocus] sfForm:TsfForm Can not focus.,
хотя она закрыта и обращения к ней нет. Принудительное снятие фокуса не помогает.

Сам сказал - она закрыта, а значит ошибка вылетает оправданно. Вопрос - зачем ты щелкаешь по форме? И где обрабатывается щелчек?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Странное поведение формы.

Сообщение Лекс Айрин » 31.01.2014 13:59:25

Deimos, попробуйте в процедуру FormClose вставить строчку:

Код: Выделить всё
CloseAction := caFree;
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Странное поведение формы.

Сообщение Deimos » 01.02.2014 11:14:31

Sharfik писал(а):Сам сказал - она закрыта, а значит ошибка вылетает оправданно. Вопрос - зачем ты щелкаешь по форме? И где обрабатывается щелчек?


Есть форма №1, на которой есть tedit.
Есть форма №2 со списком. Форма №2 вызывается формой №1 в модальном режиме. При выборе позиции в списке (список - stringgrid) по двойному щелчку мышкой вызывается метод close формы №2,
Код: Выделить всё
procedure TsfForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  modalresult:=selected_sf_record;
end;   


форма закрывается и значение tedit формы №1 заполняется:
Код: Выделить всё
tedit.text:=sfForm.ShowModal;


Иногда ПОСЛЕ закрытия формы №2 при клике мышкой на форме №1 выпадает эксепшн, который был упомянут выше, о том, что форма №2 (она уже закрыта) не может получить фокус.

Если в метод закрытия формы №2 добавить
Код: Выделить всё
sleep(200);
ошибка исчезает.

Создаешь две формы чистые и пишешь методы их вызова как в твоей программе. Когда будет глючить ищешь баг.


Ошибка вылетает БЕЗ системы. Иногда вылетает, иногда нет.

Лекс Айрин - спасибо, попробую.

Добавлено спустя 20 минут 38 секунд:
MiniQ писал(а):Как бы приведенный пример совсем не дает представления о структуре кода.
Вопрос из разряда "Доктор, у меня это. Что делать?"


Структура кода:

Форма №1
(по нажатию кнопки вызываем форму №2 в модальном режиме)
Код: Выделить всё
procedure TPay.btnSFSelClick(Sender: TObject);
begin
  tedit.text:=sfForm.ShowModal;
end;


Форма №2

(двойной клик по stringgrid)
Код: Выделить всё
procedure TsfForm.sfGridDblClick(Sender: TObject);
begin
  //sleep(200);
  close;
end;


(инициализация переменной selected_SF_record)
Код: Выделить всё
procedure TsfForm.sfGridSelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);
begin
   selected_SF_record:=sfGrid.Cells[0,aRow];
end;


(закрываем форму №2)
Код: Выделить всё
procedure TsfForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  modalresult:=selected_sf_record;
  //closeAction:=caFree;
end;


Больше никакого кода, который участвует в упомянутом процессе, нет.
Deimos
постоялец
 
Сообщения: 174
Зарегистрирован: 17.01.2010 00:31:30

Re: Странное поведение формы.

Сообщение Лекс Айрин » 01.02.2014 12:12:05

Deimos писал(а):Лекс Айрин - спасибо, попробую.


извини... Есть вероятность, что моя строчка закроет приложение целиком :oops:

Добавлено спустя 4 минуты 12 секунд:
Deimos, Имхо, у тебя просто модальная форма не успевает закрыться.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Странное поведение формы.

Сообщение Deimos » 01.02.2014 14:56:03

Лекс Айрин писал(а):Deimos, Имхо, у тебя просто модальная форма не успевает закрыться.



Были такие подозрения. Хотя клик мышкой по форме №1 может быть и секунд через 15 (проверял), вызывая то-же исключение. Абсолютно непонятный для меня глюк, в котором нет никакой системы. Во многих случаях он не возникает.

Добавлено спустя 2 минуты 54 секунды:
Лекс Айрин писал(а):извини... Есть вероятность, что моя строчка закроет приложение целиком :oops:



В винде не закрыла, хотя теоретически должен вызываться деструктор формы, и при следующем вызове формы вылетит крит. Насколько я помню...
Deimos
постоялец
 
Сообщения: 174
Зарегистрирован: 17.01.2010 00:31:30

Re: Странное поведение формы.

Сообщение Sharfik » 01.02.2014 18:50:46

1. ShowModal в Delphi возвращает только integer и тут возможно проблемы.
Код: Выделить всё
procedure TPay.btnSFSelClick(Sender: TObject);
begin
  tedit.text:=sfForm.ShowModal; // Эта строчка не верна, на мой взглад
end;

Как вариант

procedure TPay.btnSFSelClick(Sender: TObject);
var
tmpResult:String;
begin
sfForm.SetData(@tmpResult); //Передаем адрес переменной
if sfForm.ShowModal=1 then // Проверяем был ли выбор пользователя или окно было закрыто без подтверждения выбора
begin
tedit.text:=tmpResult;
end
else begin
tedit.text:="";
end;
end;

procedure TsfForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  PDataStr:=selected_sf_record;
  modalresult:=1
end;



closeAction:=caFree;

Бесполезен, если у тебя изначально вызов только show и нет создания окна.

В винде не закрыла, хотя теоретически должен вызываться деструктор формы, и при следующем вызове формы вылетит крит. Насколько я помню...

уничтожается только окно, а не программа. Программа уничтожается через application.terminate или close вызванный из главной формы.

Можно передавать адрес переменной
Код: Выделить всё
procedure EditSpecificationGroup(var ResultString:String);
var
  i: Integer;
begin
    if not Assigned(FAGroupEdit) then
    begin
      FAGroupEdit:=TFAGroupEdit.Create(Application);
    end;
    FAGroupEdit.SetChangeItem(ResultString);
    if FAGroupEdit.ShowModal>=0 then
    begin
    end;
end;

Можно передавать и забирать значения
Код: Выделить всё
        try
            if not Assigned(FDataBaseSelect) then
            FDataBaseSelect   :=TFDataBaseSelect.Create(Self);
            FDataBaseSelect.ShowCountField(True);
            ModalAnswer       :=FDataBaseSelect.ShowModal;
            DataBaseItem      :=TADataBaseItem(FDataBaseSelect.GetResult);

            if (ModalAnswer=1)and(Assigned(DataBaseItem))then
            begin
              NewItem           :=TADataBaseInUseItem.Create;
              NewItem.DataObject:=DataBaseItem;
              NewItem.Guid      :=CreateGUID;
              NewItem.LabelName :='N/A';
              NewItem.UserName  :=UserName;
              NewItem.Count     :=FDataBaseSelect.GetCount;
              ...
              u_db.GeneralDataBaseInUse.Add(NewItem);
              actRefreshAll.Execute;
            end;
        except
          NewItem.Free;
        end;


Закрытие модального окна
Код: Выделить всё
procedure TFDataBaseSelect.actApplyExecute(Sender: TObject);
begin
  ChangingItem:=tvDataBase.Selected.Data;
  close;
  ModalResult:=1;
end;
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru