Решенный баг с AutoSize формы из dll
Добавлено: 09.05.2017 02:45:03
Столкнулся с своеобразным глюком свойств формы. Может пригодится кому.
У меня есть главная форма приложения и ряд форм загружаемых из dll. Главная форма хранит указатели на нужные формы и вызывает метод Show.
Формы из dll вызываются путем клипа по списку в listbox. Если клик один по иконке, то открыть/закрыть. Если двойной клик, то только открыть.
Началось все с того, что исключительно под Windows 8 при вызове формы вылетала ошибка "деление на ноль". Сейчас же, под Win10, отладчик GDB стал вылетать на 902 строку модуля LCLProc. Хотя без отладчика программа работает чисто. При разборе так и не понял, почему при двойном клике по строке ошибка вылетает, а при одинарном через иконку нет. Но проблему решил изменив настройки свойств компонента формы.
Код функции вызова окна следующий:
В результате его выполнения программа проходит мимо этого сравнения, проверки свойства AutoSize формы и идет дальше к исключению.
Приходит к
При включении AutoSize формы все становилось нормально, но на форме появлялся бардак. Как оказалось бардак устраивает StatusBar. И выключив у него и формы свойства AutoSize проблема ушла вообще.
У меня есть главная форма приложения и ряд форм загружаемых из 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 проблема ушла вообще.