Страница 1 из 1

Решенный баг с AutoSize формы из dll

СообщениеДобавлено: 09.05.2017 02:45:03
Sharfik
Столкнулся с своеобразным глюком свойств формы. Может пригодится кому.

У меня есть главная форма приложения и ряд форм загружаемых из dll. Главная форма хранит указатели на нужные формы и вызывает метод Show.
Формы из dll вызываются путем клипа по списку в listbox. Если клик один по иконке, то открыть/закрыть. Если двойной клик, то только открыть.
Началось все с того, что исключительно под Windows 8 при вызове формы вылетала ошибка "деление на ноль". Сейчас же, под Win10, отладчик GDB стал вылетать на 902 строку модуля LCLProc. Хотя без отладчика программа работает чисто. При разборе так и не понял, почему при двойном клике по строке ошибка вылетает, а при одинарном через иконку нет. Но проблему решил изменив настройки свойств компонента формы.

Код функции вызова окна следующий:
Код: Выделить всё
procedure TFProjectEdit.EditorShow(Sender: TObject);
var
  tmpForm:TForm;
begin
  if Assigned(ThisApplication)then
  begin
      if Assigned(tvEditors.Selected)and Assigned(tvEditors.Selected.Data) then
      begin
        tmpForm:=TForm(tvEditors.Selected.Data);
        if Assigned(tmpForm) then
        begin
           if Sender=nil then
           begin
               //IconClick
               if tmpForm.Visible then
                  tmpForm.Close
               else
                  tmpForm.Show;
           end
           else begin
               //DblClick
               tmpForm.Show;
           end;
         end;
         tvEditors.Selected.Selected:=false;
      end;
  end;
end;


В результате его выполнения программа проходит мимо этого сравнения, проверки свойства AutoSize формы и идет дальше к исключению.
Код: Выделить всё
control.inc:
738: if (AWidth>100000) or (AHeight>100000) then
    BoundsOutOfBounds;

Приходит к
Код: Выделить всё
LCLProc
902: RaiseGDBException


При включении AutoSize формы все становилось нормально, но на форме появлялся бардак. Как оказалось бардак устраивает StatusBar. И выключив у него и формы свойства AutoSize проблема ушла вообще.

Re: Решенный баг с AutoSize формы из dll

СообщениеДобавлено: 09.05.2017 02:56:12
zub
Это не решеный баг, это временное везение))

Re: Решенный баг с AutoSize формы из dll

СообщениеДобавлено: 09.05.2017 23:14:01
olegy123
Sharfik писал(а):При включении AutoSize формы все становилось нормально, но на форме появлялся бардак. Как оказалось бардак устраивает StatusBar. И выключив у него и формы свойства AutoSize проблема ушла вообще.

Sharfik писал(а):Главная форма хранит указатели на нужные формы и вызывает метод Show.

Компилятор не решает проблему что там у вас в указателях сидит в рантайме. Форма или мусор. GDB вам правильно сообщает - что переменные фатально изменились. Поэтому совет - проанализируйте код еще раз. Указатели это зло - их нужно применять с крайней осторожностью.
Можете упростить поиск проблемы - путем многократного теста, поиска того места где ошибка встречается и анализа действий, что вызывали до, при каких условиях это случается..
Путем анализа heap.. Инсперктор проекта->параметры компилятора -> Отладка. С этим ваше приложение будет давать больше информации о своей работе.

Re: Решенный баг с AutoSize формы из dll

СообщениеДобавлено: 10.05.2017 00:22:23
zub
olegy123
Ключевое тут формы из dll и пока в fpc не появятся пакеты - в этом вопросе решений быть не может, только костыли((