уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Наконец-то! Свершилось чудо! Наконец-то поймался тот самый «Floating point divizion by zero» о котором мне твердили несколько человек с тех самых пор, как я выложил первую версию клиента для DelphiFeeds.ru. Знаете, я бы никогда и ни за что не поверил в то, что когда-нибудь буду радоваться пойманному в своей собственной программе багу…Серьезно. Пытался найти эту ошибку всякими разными способами — таскал программу на работу, проверял на всех подряд компах — нет ошибки! А всего-то надо было…сесть за компьютер жены и запустить программу там и…

Вот он родимый «Floating point divizion by zero» как есть. 

Надо сказать, до последнего момента пока не посмотрел отчёт MadExcept относительно этой ошибки, я сомневался: то ли этот баг конкретно мой (хотя никаких делений в программе, в принципе нету), то ли сам стиль глючит. А вот, что мне выдал MadExcept после того как я создал новый проект с Jet Style внутри:

00a374dc +080 Project8.exe  FMX.Types        8459 +7   TCanvas.CreateFromBitmap
009b6fdf +01b Project8.exe  FMX.Canvas.D2D   688 +1    TCanvasD2D.CreateFromBitmap
00a36f96 +016 Project8.exe  FMX.Types        8345 +1   TCanvasManager.CreateFromBitmap
00a3165e +01a Project8.exe  FMX.Types        6796 +3   TBitmap.GetCanvas
009d6771 +321 Project8.exe  FMX.Platform.Win 1889 +50  TWindowBorderWin.InvalidateRegion
009d6ed2 +06e Project8.exe  FMX.Platform.Win 2001 +10  TWindowBorderWin.RecreateRegion
009d8964 +d84 Project8.exe  FMX.Platform.Win 2411 +138 WMNCMessages
009d9484 +618 Project8.exe  FMX.Platform.Win 2684 +136 WndProc
774b0107 +02b ntdll.dll KiUserCallbackDispatcher
00a73a93 +053 Project8.exe  FMX.Forms        3077 +6   TCommonCustomForm.SetWindowState
00a70103 +017 Project8.exe  FMX.Forms        1742 +1   TWindowBorder.DoMinClick
00a47791 +17d Project8.exe  FMX.Types        13319 +28 TControl.Click
0098d21a +04a Project8.exe  FMX.Controls     2468 +14  TCustomButton.Click
00a47cfe +096 Project8.exe  FMX.Types        13424 +7  TControl.MouseUp
0098d46f +073 Project8.exe  FMX.Controls     2529 +13  TCustomButton.MouseUp
00a70664 +074 Project8.exe  FMX.Forms        1857 +4   TWindowBorder.MouseUp
009d88ae +cce Project8.exe  FMX.Platform.Win 2379 +106 WMNCMessages
009d9585 +719 Project8.exe  FMX.Platform.Win 2710 +162 WndProc
75f87885 +00a USER32.dll DispatchMessageW
009d1b99 +039 Project8.exe  FMX.Platform.Win 487 +8    TPlatformWin.HandleMessage
00a6c0c6 +042 Project8.exe  FMX.Forms        1328 +3   TApplication.HandleMessage
009d1b0f +02b Project8.exe  FMX.Platform.Win 464 +4    TPlatformWin.Run
00a6f486 +0da Project8.exe  FMX.Forms        1473 +12  TApplication.Run
00a9ede3 +03b Project8.exe  Project8         17 +3     initialization
74d733a8 +010 kernel32.dll  BaseThreadInitThunk

После этого отчета мое состояние можно было бы описать примерно так:

Приложение, которое выглядит вот так:

оказалось виновато в том, что оно вообще запустилось (TApplication.Run) и пользователь ткнул мышкой куда-то по форме (куда-то — это на кнопочку минимизации окна). При этом, обращу внимание на тот факт, что демка, идущая в комплекте со стилем работает без ошибок :) И «секрет» крылся в том, что демо-приложение Embarcadero выглядело вот так:

Т.е свойство EnableBorderStyle было выставлено как False. Стоит его вернуть в True и «Floating point divizion by zero» выскакивает аки чёрт из табакерки. Итак место ошибки было более менее определено — бордюры окна, а точнее стилизованные бордюры окна. Просмотрел стиль на наличие или отсутствие каких-либо элементов бордюра — вроде бы все в норме, размеры TRect’ов выставлены правильно, положение элементов тоже. Полез снова в отчет, начал ковыряться в исходнике FMX и обнаружил место где конкретно срабатывает Exception:

//FMX.Canvas.GDIP.pas
constructor TCanvasGdiPlus.CreateFromBitmap(const ABitmap: TBitmap);
begin
  inherited CreateFromBitmap(ABitmap);
  FGPGraphics := TGPGraphics.Create(TGPBitmap(FBitmap.Handle));
  FGPGraphics.SetSmoothingMode(SmothingDefault);
  FGPGraphics.SetPixelOffsetMode(PixelOffsetModeHalf);
  FGPGraphics.SetInterpolationMode(InterpolationModeHighQuality);
  FGPGraphics.SetTextContrast(TextContrast);
  if GlobalUseGDIPlusClearType then
    FGPGraphics.SetTextRenderingHint(TextRenderingHintClearTypeGridFit)
  else
    FGPGraphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
  FGPPen := TGPPen.Create($FF000000);
  FGPPenBrush := TGPSolidBrush.Create($FF000000);
  FGPBrush := TGPSolidBrush.Create($FFFFFFFF);
  FGPFamily := TGPFontFamily.Create('Tahoma');
  FFontScale := 96 / FGPGraphics.GetDpiX; //ВОТ ТУТ FGPGraphics.GetDpiX = 0

Почему так происходит и когда вызывается этот самый конструктор, скажу откровенно, особенно не искал и в обозримом будущем не планирую — на то есть специально обученные люди. Факт наличия бага есть, баг хоть и не всегда, но воспроизводим. Вполне возможно, что зависит он от видюшки, т.к. у меня стоит ATI Radeon, а у жены на компе — NVidia. Точное место откуда вываливается злосчастный «Floating point divizion by zero» указано. Накорябал баг-репорт…но что-то я его не наблюдаю в этом списке, поэтому, если что — баг остается «вакантным» — можете отправить его в QC повторно :) Пока же, для тех, кто хочет использовать Jet Style в своих приложениях, небольшой совет:

Не ставьте у приложения с Jet Style свойство формы EnableBorderStyle в значение True — избавите и себя и пользователей от лишнего бага

А я тем временем поисправляю кой-чего в клиенте DelphiFedds.ru, кстати там введена регистрация пользователей, так что скоро нас все посчитают :) Всем удачи и до новых встреч!

Update. Баг-репорт с описанием ошибки опубликован.  Кто встречался с этой ошибкой — голосуйте
Скачать программу можно на форуме.
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
5 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Senpai
Senpai
26/11/2012 13:43

А то, что посоветовали в баг-репорте помогает?

Tomohiro Takahashi at 11/25/2012 6:52:45 PM —
Please try to set GlobalUseDX10Software := True as below?
—————-
program Project1;

uses
FMX.Forms, FMX.Types,
Unit1 in ‘Unit1.pas’ {Form1};

{$R *.res}

begin
GlobalUseDX10Software := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
—————-

Сергей Сидоров
Сергей Сидоров
26/11/2012 18:17

GlobalUseDX10Software := True помогает, но окно начинает отрисовываться некорректно — внизу появляется чёрный прямоугольник. Отписал в QC

Александр
Александр
01/01/2013 20:12

Здравствуйте, Влад, с наступившим Вас!
Сердечная благодарность за блог вообще и клиента для DelphiFeeds в частности.
Заметил маленькую проблеммку при попытке запустить вторую копию клиента пока первая еще в стадии запуска. Сначала выскакивает On Create Error, а при закрывании несостоявшейся второй копии — сообщения об утечках. Приложил бы скрины, но не знаю как, да и не факт, что надо. Версия 1.1.2.57

С уважением
Александр Кремлёв