Архив за месяц: Апрель 2015
При показе из WinForms приложения WPF окна в его TextBox-ах не вводится текст
Шаблоны проектов для управляемых расширений AutoCAD
Страничка проекта находится здесь. Документация, примеры кода и демонстрационное видео так же присутствуют (ссылки на видео указаны в разделе Additional resources файла справочной системы).
Конструктивные замечания и предложения по теме приветствуются.
Мнение о книге "Атлант расправил плечи"
Если чуть подлиннее, то книга затянута, особенно третий том. Но в целом написана приятным языком в стиле утопии, ну или, если хотите, антиутопии. Т.е. такие две противоположности и герои потихоньку перемещаются из одной в другую. Да, это даже не спойлер, т.к. понятно с самого начала: наши победят! Кто в книге наши? Одга из крайностей. Автор немного перегибает и отметая одну крайность стремиться броситься во вторую. Нет, в третьей части немного пытается один из главных героев сказать про то, что совсем уж в крайность не надо, но это так, вскользь. Стоит ли читать? Ну почему бы и нет, хотя если рационально смотреть на окружающую действительность и как говорил один из упомянутых дедушек: "Люди всегда были и всегда будут, глупенькими жертвами обмана и самообмана в политике, пока они не научатся за любыми нравственными, религиозными, политическими, социальными фразами, заявлениями, обещаниями разыскивать интересы тех или иных классов.", то... Да все равно читать стоит. Уж очень многие считают эту книгу чуть ли не библией предпринимателей и чтобы можно было понимать откуда у изложенных в книге идей растут ноги. Да, стоит.
Немного о качестве accoreconsole.exe
Все мы прекрасно помним, что издавна, при запуске acad.exe с ключом /p и указанием нужного профиля, этот профиль, ежели он хранится в ARG-файле, импортируется в реестр и устанавливается текущим. Видимо это было скучно и Autodesk решил разнообразить наши серые будни...
Когда я запускаю accoreconsole.exe для AutoCAD 2015 и 2016 с ключом /p, указывающим нужный профиль, хранящийся в ARG-файле, то в последствии, по завершении сеанса accoreconsole и запуская acad.exe этих версий вижу этот профиль в диалоговом окне на вкладке Options (он же установлен и текущим). Это поведение аналогично тому, которое присутствовало в старых версиях AutoCAD, когда accoreconsole.exe ещё и в помине не было. Идём дальше...
Для AutoCAD 2013 и 2014 в диалоговом окне Options в аналогичной ситуации новый профиль не появляется.
В AutoCAD 2013 после работы accoreconsole.exe я вижу наличие ветки:
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R19.0\CoreUser\ran\Profiles\
в которой присутствует только запись <<Unnamed Profile>>
Мой профиль не появился.
Подобная картина в AutoCAD 2013 наблюдается и с веткой
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R19.0\ACAD-B001:409\Profiles
там так же присутствует только запись <<Unnamed Profile>>, а профиль, подключаемый мною через ключ /p не появился.
Т.е. при использовании accoreconsole.exe в AutoCAD 2013 указанный мною при помощи ключа /p профиль, подгружаемый из ARG-файла, не сохранился в реестре нигде, насколько я вижу.
АutoCAD 2014 так же не содержит информации о подключавшемся профиле в своей ветке
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R19.1\ACAD-D001:409\Profiles
присутствует только <<Unnamed Profile>>, как и в AutoCAD 2013.
Во всех др. версиях AutoCAD, отличных от 2013-го, аналогичная подветка CoreUser\ran\Profiles\ вовсе отсутствует и не появляется в т.ч. и после работы accoreconsole.exe.
Т.о. налицо поведение "кто в лес, кто по дрова".
Не будем останавливаться на "достигнутом", пойдём дальше...
AutoCAD 2013-2015 SP1 x64 Enu.
Если консольное окно accoreconsole.exe закрывать путём нажатия соответствующей кнопки в верхнем правом углу консольного приложения, то значение системной переменной FILEDIA, изменённое обозначенной утилитой в ходе своей работы, остаётся равным 0. Т.е. если в дальнейшем запустить acad.exe, то это соответствующим образом отражается на его работе. Но ежели закрывать консольное окно командами _.quit или _.exit, то такая проблема не наблюдается.
Компания Autodesk порекомендовала (не утруждая себя проверкой работоспособности обозначенной рекомендации): для того, чтобы не портилась системная переменная FILEDIA в AutoCAD (как и другие системные переменные), нужно использовать ключ запуска /isolate <userid>, где userid - произвольное имя.
Однако, как показала практика, не работает и обозначенное выше решение с /isolate:
Autodesk: В DevHelp подтвердили некорректность работы /isolate с AutoCAD 2015 SP2 и 2016 и передали команде инженеров для анализа.
Про более ранние версии видимо постеснялись написать...
Идём далее...
AutoCAD 2013-2015 x64 Enu
Запускаем accoreconsole.exe и загружаем в него некоторую сборку. Смотрим первый скрин.
Меняем ширину консольного окошка (смотрим второй скрин) и перезапускаем accoreconsole.
Снова загружаем ту же самую сборку. Смотрим третий скрин - для 2015-го и 4-й скрин - для 2013-го.
Как видим, после изменении ширины консольного окна, мусора стало меньше. При этом в 2013-м он вообще исчез - корректно выводит информацию, в то время как 2015-й дублирует каждую строку:
Autodesk: Замечание приняли и передали в работу Eng Team.
Печальная практика показывает, что зачастую это - стандартная отписка. Многие пользователи хорошо помнят о баге с переключением раскладки клавиатуры при помощи Shift + Alt. Для тех, кто переключает раскладку иным способом - почитать о данном баге можно здесь. Кстати, этот баг, как и многие другие, не устранён до сих пор! Кстати, до сих пор (т.е. и в AutoCAD 2016) присутствует баг, о котором я когда-то писал здесь. Причём второй из них исправляется всего парой строчек кода... Если даже такие простые (но важные) исправления Autodesk не удосуживается делать, то что можно говорить о чём-то более серьёзном?
Все обозначенные выше баги выявляются первым же запуском accoreconsole.exe. Компания Autodesk не тестирует своё программное обеспечение: откомпилировалось, значит можно отправлять на продажу, а юзерам, столкнувшимся с багами, нужно рекомендовать покупку "более новой версии", в которой может быть что-то будет исправлено.
То, что подобным качеством ПО они позорят себя, в компании Autodesk, к сожалению, себя не "грузят", т.к. практика показывает, что главное для них (как и для многих др. современных компаний) - продать (т.е. втюхать), а думать о качестве - это не современно. Покупатели ПО попутно являются и бесплатными тестерами - чем не отличное решение? А то, что они не только тестируют, но и платят деньги за это ПО - так это и вдвойне хорошо: иметь бесплатных тестеров, которые к тому же ещё и немалые деньги платят компании, чей софт тестируют - мечта любой "современной" компании. Потом можно выборочно устранять пару багов (пофиг, что попутно добавится ещё пара-тройка) и попутно прикрутить пару бантиков, вроде глянцевых кнопочек, после чего можно презентовать новую версию... Неплохо устроились ребята... Чувство совести, похоже, им не ведомо к сожалению (имхо).
Работа с файлами Excel пользователем через интерфейс, на основе SpreadsheetGear
данная статья сборник небольших примеров решения такой задачи с использование компонента SpreadsheetGear.
1. Установка и подключение в проект
Здесь все просто. Качаем бесплатную версию здесь. Запускаем инсталятор, далее, далее, далее, конечно же, не забыв поставить галку, что вы согласны с лицензией. Запускаем VS, создаем проект WPF и в Панели инструментов видим:
Все, можно перетаскивать в разметку. Для любителей все делать самому, можно добавить в проект ссылки на две библиотеки (все картинки кликабельны):
Ну и в XAML, подключаем пространство имен и размещаем компонент WorkbookView в нужном нам месте:
Во всех остальных примерах, я буду использовать приложение с вот такой разметнкой главной формы:
Ну и все примеры, это обработчики соответствующих кнопок.
2. Загрузка файла XLS в компонент
А вот так, для книги в которой листы защищены (нет сетки и заголовков строк и столбцов):
Т.к. мне представляет интерес работа именно с защищенными листами, то все остальные картинки будут именно с ними.
3. Скрываем листы книги, которые нам не нужны
Перед началом работы с элементами книги, необходимо заблокировать ее, а по окончании работы освободить. В остальных примерах я на этом уже не буду останавливаться, но везде будут соответствующие блоки.
При попытке скрыть последний лист, возникает исключение.
4. Работа с именованными блоками
Если в книге есть именованные блоки, то мы можем как внести в них данные, так и считать их. Например, я буду вносить по кнопке почтовый индекс. Блок в котором он находится имеет имя "П000020020001".
Со значениями в компонентах для эмуляции Excel, отдельная песня. Value у диапазона или ячейки имеет тип object. У SpreadsheetGear, чтобы определить тип хранящегося значения есть специальное свойство ValueType. Вот так, например, можно проверить какого типа значение храниться в ячейке:
Если поправить пример с добавлением вот так:
Т.е. в зависимости от типа присвоенного значения, определяется тип ячейки.
Ну и самый интересный эксперимент. Присвоим ячейке дату:
Обращают на себя внимание два факта. Во-первых, дата показывается правильно, а вот тип ячейки определяется как числовой. Печально...
5. Определение ячейки и блока редактируемых пользователем
Речь идет о редактировании ячейки, т.е. пока ячейка не перешла в состояние редактирования события не вызываются. Ну и для решения этой задачи есть два варианта.
В рамках первого способа, мы можем обрабатывать клики мышкой, для этого подписываемся в компоненте на соответствующее событие:
На что следует обратить внимание:
а) Хотя мы и подписывались на MouseUp событие вызовется только при первом переходе ячейки в редактирование. Выделение ячейки событие не вызывает, также как и повторные клики на редактируемой ячейке.
б) Получить блок в который входит ячейка можно двумя способами. Разницы в них не заметил.
в). Ни один из способов получения ячейки не позволяет понять, что этот Range именованный:
Второй способ, на мой взгляд более правильный, это обрабатывать события связанные с ячейкой. В данном случае, нас интересует CellBeginEdit. В данном случае, обработчик будет значительно проще:
6. Добавление строк и копирование части листа
В оригинальном листе есть блок:
Я хочу его скопировать и вставить под оригинальный М1. Сделать это можно достаточно просто:
7. Присвоение имен блокам
Последний на сегодня пример, связанный, кстати, с предыдущим. Блоки подсвеченные синим у меня имен не имеют, я хочу подсвеченным ячейкам внутри М1 эти имена дать, чтобы было удобнее присваивать в них значения.
Вот так выглядит код присвоения имен:
но, т.к. мы их присваивали через раздел, то присвоение по имени будет выглядеть:
На этом все, мое мнение, все это весьма неоднозначно и связано с неоправданными сложностями. Всякие WPF вкусности типа Binding применить не получится. Для узкой и специфичной задачи возможно применение этого компонента имеет смысл, ну а так...
Як зробити зміну (ротацію) зображень на Java Script?
У даній статті розберемо приклад роботи ротації зображень, написаної на Java Script. Рішення досить-таки популярне. Найчастіше використовується як слайдер зображень у верхній частині сайту, прокрутка рекламних банерів або показ слайдів фотогалереї.
Сам скрипт ротації на Java Script вставляємо між тегами <head> і </ head>
Код JavaScript
<script type="text/javascript"><br > var array = new Array(<br > "images/photo001.jpg",<br > "images/photo002.jpg",<br > ); //массив с путями к картинкам. Можно по аналогии добавить изображения<br > var delay = 2000; // время задержки одного изображения в миллисекундах = 2 сек<br > function imageRotation(i) {<br > var image = document.getElementById("rotator");<br > image.src = array[i];<br > i++;<br > if (i == array.length) i = 0;<br > setTimeout("imageRotation(" + i + ")", delay);<br > }<br > </script>
Вибираємо об’єкт в тілі документа, який повинен стояти між тегами <body> і </ body> і присвоюємо йому id rotator. Візьмемо за приклад зображення і тег <img>
Дивіться також:овощерезка nicer dicer plus
Код HTML
<p><br > <img id="rotator" src="" alt="Ротация изображений" width="150" height="150" /><br > </p>
Спасибі за увагу!
Як стиснути або закодувати JavaScript? Онлайн сервіси
Навіщо потрібно стискати і кодувати код? Стискати слід для зниження ваги файлу або скорочення займаного місця. Що стосується кодування, то це потрібно для тих, хто хоче скористатися Вашим готовим кодом без згоди або як мінімум слова спасибі) Шифровка робить його нечитабельним.
Таким чином, до речі, можна закодувати не тільки код Java Script, але ще і CSS. Перейдемо до сервісів.
Список онлайн сервісів для стиснення та кодування JS
1. JS Crunch
http://www.cfoster.net/jscrunch/
Автор: Charles Foster
Оптимальне шифрування і стиснення. Підтримує UTF-8. З мінусів: не виводить ніякої інформації про виконану роботу — коефіцієнт стиснення, вихідні, кінцеві розміри. Не завжди видає робочий зашифрований код, тому перевіряйте.
2. JavaScript Compressor
http://javascriptcompressor.com/
Автор: Dean Edwards
Онлайн компресор. Надає можливість закодувати код декількома способами.
3. CSS & amp; JavaScript Compressor
http://www.creativyst.com/Prod/3/
Онлайн компресор. Досить дубовий, без будь-яких наворотів, вичищає зайві прогалини, табуляцію і порожні переклади рядків.
Увага! Доведено багатьма життєвими прикладами: завжди зберігайте оригінал коду і перевіряйте працездатність нового стисненого закодованого коду.
Смотрите также:битсы наушники
Так, є сучасні форми стиснення і зчитування: прочитайте про gzip. Однак, не слід забувати про приватних невеликих прикладах, де сервіси можуть стати в нагоді. І як можна частіше займайтеся чищенням і оптимізацією коду. Особливо при високих навантаженнях на сервіс!)