пятница, 28 декабря 2012 г.

SnakeWPF

    В процессе изучения WPF набросал еще одно классическое приложение - змейку!
    В wiki-OS возникли проблемы с обработкой KeyDown от клавиатуры - поэтому добавил кнопки для управления мышью. Посмотреть приложение можно здесь
    Настольное приложение с новогодним настроением выглядит так:



среда, 26 декабря 2012 г.

Wiki-OS

    Wiki-OS - Open source операционная система, задумка такова - каждый может написать/изменить приложение в ОС, да и саму ОС. Сегодня наткнулся случайно, набросал для теста приложение: https://www.wiki-os.org/MemoryWPF/MemoryWPF. Система меня очень впечатлила.
   Возможность изменять код онлайн в "мини IDE" впечатляет..., конечно не хватает возможностей IntelliSense, но все же! Приложение было написано локально в VS2012, читал книгу по WPF и тут же пытался делать наброски, затем случайно наткнулся на данный сайт и решил попробовать перенести код туда. После незначительных изменений кода - все заработало! Еще один повод изучать WPF.

WPF: Snoop

    Очень интересную программу нашел сегодня, называется Snoop, позволяет разобрать запущенные приложение wpf на кирпичики, с помощью нее, я узнал, что TextBox состоит из целого набора стандартных компонентов:

вторник, 25 декабря 2012 г.

Замена тачскрина(сенсора) LG GX500

   У любимой начал отказывать сенсор, на выходных был на радио-рынке узнал цены на ремонт -  от 250 до 350грн(работа + сенсор), сам сенсор продают за 200грн. Вечером того же дня погуглил сенсор, и нашел 8.55 $ (69.85 грн.), поразмыслил немного и решил брать в инет магазине и пытаться заменить самостоятельно.

WPF: Colors


понедельник, 24 декабря 2012 г.

WPF: Timer's

   Еще один сюрприз: оказывается в WPF метод обработчик Elapsed класса Timer из пространства имен System.Timers не может получить доступ к объектам формы, например при попытке считать свойство Tag, у объекта формы Image, бросается эксепшен, как я понял это связано с тем, что обработчик Elapsed выполняется в другом потоке, для которого прямой доступ запрещен, и возможен только через специальный класс Dispatcher.

   Вместо System.Timers.Timer в моем случае оказалось легче использовать System.Windows.Threading.DispatcherTimer. Он во многом похож на обычный таймер, но главное его отличие в том, что он его обработчик выполняется в том же потоке (в очереди класса Dispatcher) что и форма с UI компонентами:
 
 System.Windows.Threading.DispatcherTimer t = 
         new System.Windows.Threading.DispatcherTimer();
 t.Interval = new TimeSpan(500);
 t.Tick += new EventHandler(t_Tick);
 t.Start();

    Если в обработчике таймера будет выполняться "тяжелый" код, который может привести к тому что компоненты формы перестанут откликаться на действия пользователя, то все таки лучше вынести такой код в другой поток используя обычный таймер System.Timers.Timer. А если понадобится доступ к объектам формы, то нужно использовать вызов Invoke:

 this.Dispatcher.Invoke((Action)delegate { //код для доступа к UI } 

WPF: Задание пути к файлу изображения из кода

   Начал изучать WPF  и тут же сталкиваюсь с проблемой - изображение после добавления не доступно в списке подстановки IntelliSense из статического класса Resources, да и у компонента Image свойство Source имеет тип совсем не Bitmap а ImageSource.

   Из xaml разметки устанавливается примерно таким образом:

 <img source="/MemoryWPF;component/Images/1.jpg" />

   Из .cs кода(для изображения встроенного в ресурсы приложения):
 
 Uri src = new Uri(@"/MemoryWPF;component/Images/1.jpg", UriKind.Relative);
 BitmapImage bImg = new BitmapImage(src);
 Image img = new Image();
 img.Source = bImg;

Либо, вариант покороче:
  
 Image img = new Image();
 img.Source = new BitmapImage(new Uri(@"/MemoryWPF;component/Images/1.jpg", UriKind.Relative));

   Вместо "/MemoryWPF;component/", можно написать "./" еще больше укоротив пример.
   Uri определяет путь к файлу, если изображения не будут встроены в ресурсы во время компиляции, а будут расположены в локальной папке либо в интернете, то можно используя соответствующий путь подгрузить их оттуда:

// путь к файлу интернете
new Uri(@"http://s.codeproject.com/App_Themes/Christmas/Img/logo250x135.gif"); 
// путь к файлу на диске
new Uri(@"D:/2.jpg"); 

суббота, 22 декабря 2012 г.

Хоббит(впечатления)...

    Что бы кто не говорил - мне фильм понравился, масса положительных эмоций, встреча с полюбившимися по "Властелину" героями, прекрасные пейзажи, чумовые спец эффекты, интересная история - 3 часа пролетели незаметно. Мне кажется что фильм не оставит равнодушным всех кому нравилась пред. трилогия. 
   
   О звуке в аймаксе: в пещере, в сцене с голумом когда он хрипел, отловился я конкретно - повернул голову и начал искать кто хрипит в конце зала))))

Щенки 2012

   Ника ощенилась!

пятница, 21 декабря 2012 г.

Microsoft .NET User Group Одесса

   Случайно наткнулся на сайт Одесского .NET сообщества и записался на встречу 20 декабря...
   Впечатления под катом... 

среда, 19 декабря 2012 г.

Хоббит


    Купил сегодня билеты в кинотеатр на фильм "Хоббит: Нежданное путешествие" и только когда распечатал купленные билеты понял, что иду в кинотеатр 21 числа! Так заработался что забыл что 21 конец света))) Ну ничего фильм ведь должен быть хороший, думаю оно того стоит))
   Кстати удобная система онлайн бронирования и покупки билетов реализована - купил билеты за 5 минут, минус только в том что нужен принтер для распечатки электронного билета. А еще круче то, что если есть android устройство (ну или вездесущий эпл) то минус в виде необходимости распечатки отпадает, так как можно просто поднести устройство с запущенным приложением кинотеатра, и выбранным билетом - к сканеру. 

понедельник, 17 декабря 2012 г.

Сохранение содержимого webBrowser как изображение...

     Возникла задача отправки в качестве вложения в письмо в виде изображения, отчета, который сформирован в виде HTML странички,  в компоненте webBrowser. Первоначально задача показалась пустяковой и я быстренько набросал строчки кода:
int width = webBrowserReportReys..Document.Body.ScrollRectangle.Width;
int height = webBrowserReportReys..Document.Body.ScrollRectangle.Height;        
Bitmap bitmap = new Bitmap(width, height);
webBrowserReportReys.DrawToBitmap(bitmap, new Rectangle(0, 0, width, height));
    Но после сохранения Bitmap оказался пустым :-(. MSDN вообще сказал такое:
This API supports the .NET Framework infrastructure and is not intended to be used directly from your code. This method is not supported by this control.
    После длительных поисков и тестов нашел хороший код и статью позволяющую решить задачу: http://www.codeproject.com/Articles/58605/HTML-to-Image-in-C 

пятница, 14 декабря 2012 г.

Как я переоформлял машину...

    Так как машину брал по ген. доверенности, начитавшись информации о всех возможных рисках решил переоформить для того чтобы спать спокойней... Начал с поиска телефона МРЕВ Саратского района, и наткнулся на сайте http://www.saiodessa.gov.ua/ на ссылку "Заява на реєстрацію ТЗ", далее увидел там пункт "Зняття з обліку ТЗ" и заинтересовался...
   

вторник, 11 декабря 2012 г.

Имя столбца с пробелами, скобками и т.д. в DataTable.Compute()

В классе DataTable есть очень полезный метод:

public object Compute(string expression, string filter)
    Член System.Data.DataTable

Сводка:
Вычисляет заданное выражение для текущих строк, отвечающих условию фильтра.

Параметры:
expression: Вычисляемое выражение.
filter: Фильтр, ограничивающий число строк, используемых выражением.

Возвращает:
Класс System.Object, которому задан результат сравнения.

Сегодня столкнулся с проблемой при его вызове. Столбцы с "неправильными" с точки зрения рекомендаций именами, неверно обрабатываются в данном методе, например столбец с именем: "Сумма(CHF)" приводил к возникновению исключения. Тоже самое будет если в имени используется пробел, точка или запятая, для решения проблемы необходимо "неправильное" имя столбца в заключить в квадратные скобки.

decimal sum = 0;
if (myNewDataGridView1.DataSource != null)
  sum = (decimal)(DataTable)myNewDataGridView1.DataSource).Compute("Sum([Сумма(CHF)])", String.Empty);

     Я в своем проекте для задания Caption`а, который отображается пользователю, когда-то давно по молодости написал метод(в классе который работает с базой), и использовал для этого свойство ColumnName, теперь так и тянется... Теперь нужно будет выделить день для исправления этой ошибки во всех проектах, так как в разных участках кода идет обращение к столбцам таблицы по их именам. Для задания текста отображаемого пользователю в заголовке столбца dataGridView нужно использовать свойство Caption класса DataTable!
      Кстати еще один нюанс - столбец который содержит в свойстве ColumnName запятую - не сортируется в dataGridView(тоже было потрачено немало времени пока понял причину)!
Используйте свойство ColumnName с нестандартными именами только в исключительных ситуациях.

воскресенье, 2 декабря 2012 г.

Вздутые конденсаторы...

    Попросили на днях посмотреть компьютер, думал все по накатанной - установка, настройка винды... Оказалось комп стартует 1 раз из 10, остальные просто выключается не издавая даже "пука" из динамика... Внешний осмотр материнки показал, что вздуты конденсаторы возле процессора, вдавил их пальцами (понято что не решение)...

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

Нагетсы "Легко" с сыром и проволокой!

     Поздно возвращались с любимой домой, и времени и желания готовить не было - было решено взять полуфабрикаты, выбор пал на нагетсы "Легко" с сыром...

воскресенье, 1 апреля 2012 г.

Мой новый железный друг...


     Так как NISSAN Y10 оказался неудачной заменой для 6ки, и был продан, спустя длительный месяц поисков нового авто, пересмотра различных предложений, с учетом опыта с Y10, остановил свой выбор на... 

четверг, 12 января 2012 г.

Mini "Sokoban" за 5 часов...


Заскучал на работе и решил отвлечься, набросал мини игрушку sokoban. Картинки нашел в интернете и вперед, вот что получилось:
Главное окно

Игровое окно