Показаны сообщения с ярлыком коддинг. Показать все сообщения
Показаны сообщения с ярлыком коддинг. Показать все сообщения

среда, 27 марта 2013 г.

Синдром вечно плохого кода...

    Заметил интересную вещь если смотрю на собственноручно написанный в прошлом код - всегда хочется что-то переписать. Становятся очевидными такие решения, которые оптимальнее, проще и элегантнее выполняют поставленную задачу...  

вторник, 26 февраля 2013 г.

AsmTool PE

    Мое детище времен учебы в техникуме (2000 - 04 года) продолжает жить своей жизнью.  Недавно получил перевод на вебмани за эту программу (это при том что она уже более 2 лет бесплатна), открыл ее вебсайт и понастальгировал...

пятница, 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 состоит из целого набора стандартных компонентов:

понедельник, 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"); 

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

Microsoft .NET User Group Одесса

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

понедельник, 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 

вторник, 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 с нестандартными именами только в исключительных ситуациях.

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

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


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

Игровое окно