Наконец-то! Свершилось чудо! Наконец-то поймался тот самый «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 в своих приложениях, небольшой совет:
А я тем временем поисправляю кой-чего в клиенте DelphiFedds.ru, кстати там введена регистрация пользователей, так что скоро нас все посчитают :) Всем удачи и до новых встреч!
А то, что посоветовали в баг-репорте помогает?
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.
—————-
GlobalUseDX10Software := True помогает, но окно начинает отрисовываться некорректно — внизу появляется чёрный прямоугольник. Отписал в QC
Сергей Сидоров, спасибо за то, что отписали в QC. Да, действительно GlobalUseDX10Software := True приводит к появлению чёрного прямоугольника при разворачивании окна. Причём этот прямоугольник наблюдается даже на моем компе где баг «Floating point divizion by zero» вообще не наблюдался…
Здравствуйте, Влад, с наступившим Вас!
Сердечная благодарность за блог вообще и клиента для DelphiFeeds в частности.
Заметил маленькую проблеммку при попытке запустить вторую копию клиента пока первая еще в стадии запуска. Сначала выскакивает On Create Error, а при закрывании несостоявшейся второй копии — сообщения об утечках. Приложил бы скрины, но не знаю как, да и не факт, что надо. Версия 1.1.2.57
С уважением
Александр Кремлёв
Александр, спасибо большое за поздравление и отзыв :) Скрины (если потребуется) можно выкладывать на форуме в теме про клиент. Ну а эту ошибку вместе с несколькими другими пофиксю к следующему обновлению