|
Сентябрь 2011
Супер простые кнопки с
использованием GDI+X + Icons
Бернар Бут (Bernard Bout)
Некоторое время назад я создал очень простые кнопки, на которых был только
выровненный по центру текст.
C тех пор меня несколько раз просили добавить возможность включения
пиктограмм и в этот раз я предлагаю расширенный вариант с пиктограммами и
возможностью настраивать выравнивание текста.
Создание отчетов в PDF
формате - FoxyPreviewer последние новости
Сезар Шалом (Cesar
Shalom)
Недавно вышла версия 2.38, описание которой и код можно найти по ссылке http://foxypreviewer.codeplex.com/releases
или на диске, сопровождающем журнал.
Коллекции вместо массивов
Класс Collection обеспечивает очень легкий способ работы с группами
объектов.
Тамар Е. Гранор, д-р философии (Tamar E. Granor, Ph.D.)
Каждый процедурный язык программирования, который я использовала до
появления СУБД FoxBase+, предлагал массивы как способ хранения упорядоченной
коллекции данных. Поэтому, когда я начала изучать FoxBase+, наличие массивов
в языке программирования этой СУБД было для меня логичным. Фактически, самой
первой из всех когда-либо опубликованных мной в Fox- журналах статей была
статья о массивах.
Массивы в среде Fox, отличались от тех, которые я использовала раньше, в
двух отношениях. Во-первых, в большинстве языков, с которыми мне довелось
работать, предлагались массивы неограниченной размерности. В среде FoxBase+
обрабатывались только одно- и двумерные массивы, что по-прежнему справедливо
для среды VFP. Хотя это ограничение является весьма чувствительным, я
научилась его обходить.
Во-вторых, языки, которыми я пользовалась ранее, были языками со строгой
типизацией, поэтому во всех элементах массива должны были храниться данные
одного типа. Язык Fox – это язык со слабой типизацией, и он не выдвигает
такого требования. Поэтому в массивах очень удобно хранить копии записей, а
также другие данные, организованные по типу записей (например, данные о
файлах, возвращаемые функцией ADIR()).
Со временем функциональность, обеспечивающая работу с массивами, была
существенно доработана. Давным-давно была добавлена группа функций, которые
облегчают обработку массивов; в их число входят функции ASCAN() и ASORT()
для поиска и сортировки, функция ACOPY() для копирования всего массива или
его части, а также функции AINS() и ADEL() для добавления и удаления данных
в середине массива.
Кроме того язык VFP обзавелся несколькими функциями, которые позволяют
извлечь какие-то данные и запомнить их в массиве. Например, функция AFIELDS()
позволяет поместить в массив список полей таблицы, функция APRINTERS()
обеспечивает заполнение массива списком доступных принтеров, а функция
AMEMBERS() используется для извлечения списка свойств, событий и методов
объекта и запоминания этих данных в массиве. Есть также команды, которые
используются для перемещения табличных данных прямо в массивы и из них.
(Подробную информацию о работе с массивами и предназначенными для этого
функциями ищите по адресу http://www.tomorrowssolutionsllc.com/Materials/arrays.html.)
При наличии всех этих возможностей массивы являются ценным представителем
арсенала средств VFP. Однако, добавление базового класса коллекций в версии
VFP 8 предлагает альтернативный способ для обработки некоторых групп данных.
В частности, коллекции – это гораздо более естественный способ для
организации группы связанных между собой объектов, нежели массивы.
Введение в GDIPlusX, часть I
Дуг Хенниг (Doug Hennig)
GDIPlusX – это проект, разрабатываемый в рамках инициативы VFPX; он
открывает для VFP-приложений доступ к графическому интерфейсу GDI+, который
представляется в виде набора библиотек VFP-классов. Проект GDIPlusX
облегчает встраивание в ваши приложения новых возможностей для работы с
графикой, позволяя тем самым создавать более современный пользовательский
интерфейс с более мощной функциональностью. Эта статья начинает серию
публикаций и служит введением в проект GDIPlusX, в ней рассматриваются
основы интерфейса GDI+, классы, реализованные в библиотеке GDIPlusX, а также
приводятся различные примеры того, как эту библиотеку можно использовать в
приложениях VFP.
Интерфейс GDI+ – это та часть операционной системы Windows, которая отвечает
за отображение информации на устройствах, таких как экраны и принтеры. Как
подсказывает название, этот интерфейс является преемником графического
интерфейса прикладного программирования API (Graphics Device Interface, GDI),
входившего в ранние версии ОС Windows.
Интерфейс GDI+ позволяет разработчикам выводить данные на устройство
отображения, не беспокоясь о конкретных деталях работы с этим устройством.
Разработчик обращается к методам классов интерфейса GDI+, а они в свою
очередь выполняют соответствующие обращения к конкретным драйверам
устройств. Интерфейс GDI+ изолирует приложение от графической аппаратуры, и
эта изоляция позволяет разработчикам создавать аппаратно-независимые
приложения.
Хотя прикладной интерфейс GDI+ хорошо документирован, обращение к нему из
VFP-приложений может оказаться довольно сложным делом, поскольку приходится
заботиться о таких вещах, как дескрипторы (handles) для каждого
используемого объекта. К тому же, прикладной интерфейс API состоит из
обращений к функциям, тогда как большинство VFP-разработчиков предпочитают
работать с объектами. К счастью, три опытных VFP-разработчика, – Крег Бойд (Craig
Boyd), Бо Дурбан (Bo Durban) и Цезарь Шалом (Cesar Chalom), – не пожалели
времени и сил на то, чтобы создать набор классов-оболочек для классов
интерфейса GDI+. Этот набор классов-оболочек называется GDIPlusX.
Представление класса SSButton
Жун Тангунан (Jun Tangunan)
Как ни странно, после создания класса SSDTPicker, я сразу же перешел к
работе с классом SSTBNextGen. Исходный класс с 7 темами был готов через
несколько часов, и полагаю, теперь вы знаете, как быстро я работаю, когда
настроюсь что-то сделать и, конечно, когда меня не отвлекают. А еще, я в тот
же день начал возиться с интерфейсом GUI для класса SSButton, который также
собирался доделать и собрать очень нужный стандартный выполняемый exe-модуль
VFP. Интерфейс GUI и этот класс были готовы на следующий день.
Обычно, на этом я бы и остановился, чтобы немедленно сделать запись в
дневнике и поделиться замыслами, не заботясь об их дальнейшем развитии.
Почему? Это просто примеры, которые могут быть дополнены заинтересованными
пользователями. Фактически, большая часть того, что я предлагаю, – это
только идеи и принципы, за исключением некоторых инструментальных средств,
вроде Live Backup.
Но поскольку я получил весьма одобрительные отклики на 3 моих последних
класса, то решил и обещал предоставить вам кое-что получше, а не одни только
идеи или руководящие указания. И поэтому я пока придержал оба класса,
SSTBNextGen и SSButton, у себя, чтобы продолжить их тестирование и развитие.
Доработку этих двух классов я завершил 14 декабря, а класс SSTBNextGen и эту
запись в блоге создал на самом деле 15-ого.
Тем не менее, я отложил публикацию этих двух записей в блоге, поскольку
решил преподнести заинтересованным пользователям класс SSTBNextGen в
качестве моего предрождественского, а рассматриваемый класс в качестве
предновогоднего подарка. Плюс, я должен опубликовать обещанный «filler»,
которым является OptionSwitch.
Как видно по моему классу SSTBNextGen, сейчас он стал лучше. Впрочем, вы еще
удивитесь тому, что может делать этот класс одной кнопки, поскольку я
потратил массу усилий на то, чтобы сделать его очень универсальным. Не в
смысле программирования, впрочем, поскольку я могу найти способы
использовать только пару предыдущих классов и, однако же добиться желаемого;
но в «придумывании» того, что еще можно сделать.
3 предыдущих класса еще можно дополнить, так как на самом деле я не слишком
усердно над ними работал, потому что тогда у меня не было уверенности в том,
какие будут получены отклики с учетом того, что я выясню, кто есть кто. Так
что подождите до будущего года, и я снова займусь этими классами.
|