Сайт для программистов

суббота, 17 января 2009 г.

Математические функции на мобильных устройствах или Справка тоже ошибается

Здравствуйте!


Сегодня хочу поделиться с одним наблюдением, которое поможет некоторым программистам, использующих математические функции в проектах для .NET Framework.


В составе класса System.Math есть методы Sinh, Cosh и Tanh, которые возвращают гиперболические синус, косинус и тангенс соответственно. Если вы посмотрите в справочной системе, то увидите, что данные методы поддерживаются, начиная с CF 1.0. Но так ли это на самом деле? Давайте попробуем проверить эти утверждения. Запустим новый проект для мобильных устройств и введем простой код для кнопки:



textBox1.Text = Math.Sinh(1.2).ToString();

Редактор кода не будет возражать против данной строчки и даже будет выводить подсказку во время ввода. Теперь запустим проект. Пока все идет хорошо, программа прекрасно компилируется и запускается в эмуляторе или на реальном устройстве. Теперь попробуем нажать на кнопку. Вуаля! Вылетает сообщение об ошибке NotSupportedException.


К счастью, не все так страшно. Эти методы легко создать самостоятельно.



double angle = 1.2;

// sinh(double angle): (e^x - e^-x) / 2
double res = (Math.Exp(angle) - Math.Exp(-angle)) / 2.0;

// cosh(double angle): (e^x + e^-x) / 2
res = (Math.Exp(angle) + Math.Exp(-angle)) / 2.0;

// tanh(double angle): sinh / cosh
res = (Math.Exp(angle) - Math.Exp(-angle)) /
(Math.Exp(angle) + Math.Exp(-angle));


Сам я не математик и вряд ли мне придется использовать гиперболические синусы (я даже не знаю, что это такое), но, возможно, кто-то из читателей нарвется на эту неприятность. Отсюда вывод - не относитесь к справке MSDN как к догме.


Данный совет будет помещен на страницу Вопрос+ответ=совет


Счастливого вам программирования!

воскресенье, 4 января 2009 г.

Ширина столбцов у ListView

Всех с Новым Годом!

Сегодня поделюсь с вами одним наблюдением, о котором возможно не все знают. Если вы используете в своих проектах элемент управления ListView в режиме Details, то могли заметить одно неудобство. В некоторых случаях, слова обрезаются по ширине ColumnHeader и это слегка раздражает пользователя. Приходится самому вручную увеличивать ширину столбца, чтобы прочитать весь текст. Первое, что приходит в голову - это самостоятельно вычислять ширину слов с помощью MeasureString.
Но не все так плохо. Если прочитать документацию по свойству ColumnHeader.Width, то можно узнать о двух интересных значениях - это отрицательные значения -1 и -2. Первое значение устанавливает ширину столбца по самому длинному слову в столбце, а второе значение устанавливает ширину по слову, содержащему в самом столбце.
Вы можете установить эти значения в режиме разработки, но обратите внимание, что когда вы нажимаете на кнопку OK в редакторе свойств для ListView, то значения -1 или -2 автоматические заменяются на реальную ширину, которая IDE вычисляет автоматически за нас. Поэтому, если внесете изменения в ListView во время разработки, то еще раз установите нужные значения.
Если вы хотите поддерживать нужные размеры столбцов во время выполнения программы, то делайте это программным способом.

ColumnHeader header;
header.Width = -1;


Этот совет я помещаю на страницу Вопросов и ответов. Кстати, он справедлив и для .NET Compact Framework.

Счастливого вам программирования!