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

Общие вопросы программирования, алгоритмы и т.п.

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

Ответить
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 839
Зарегистрирован: 20.07.2013 01:04:30

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

Сообщение 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 проблема ушла вообще.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Это не решеный баг, это временное везение))
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

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

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

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

Сообщение zub »

olegy123
Ключевое тут формы из dll и пока в fpc не появятся пакеты - в этом вопросе решений быть не может, только костыли((
Ответить