Способы представления данных
Существуют разные способы представления данных. ([7],[13]). Наиболее распространенный из них - графический. Например, Panorama предоставляет следующие возможности (предполагается, что система использует в качестве механизма связи сообщения): карта процессоров (процессоры и их соединения, а также текущие сообщения между ними); окно отладки (состояния задач, данные, и.т.п.); окно потока сообщений (все сообщения между процессорами во времени (и время приема, и время получения).
В дополнение к графическому способу можно использовать, например, звуковой, как это описано в [14]. Преимущество использования звука при отладке состоит в том, что при большом объеме собранных данных может быть сложно обнаружить ошибку визуально. Например, если в процессе работы затерялось какое-то сообщение от одного процессора к другому, то, анализируя графическое представление взаимодействия процессоров, трудно найти потерянное сообщение, так как оно может быть графически просто не представлено. Однако, если каждое сообщение (от посылки до получения) будет сопровождать некоторый звуковой сигнал, то потерянное сообщение будет сразу обнаруживаться.
Как видно, при отладке распределенных приложений необходимо учитывать связь между процессорами и, в основном, асинхронный ее характер, то есть на первое место выступает обнаружение ошибок, связанных со взаимодействием задач и усиленных тем, что задачи выполняются на разных процессорах.
Сравнение AWT/Swing и Qt
До сих пор мы сравнивали лишь языки программирования Java и C++. Но, как мы упомянули в начале этой статьи, язык программирования является лишь одним из аспектов, принимаемых во внимание при разработке GUI. Теперь мы сравним пакеты для разработки GUI, которые поставляются вместе с Java, т.е. AWT и Swing, и кросс-платформенный инструментарий Qt от норвежского производителя Trolltech. В сравнении мы ограничились лишь одним инструментарием C++, потому что в отличие от MFC (Microsoft Foundation Classes) и других подобных библиотек, Qt поддерживает все 32-битные Windows-платформы (кроме NT 3.5x), большинство разновидностей Unix, включая Linux, Solaris, AIX и Mac OS X, и встраиваемые платформы. Это позволяет максимально близко сопоставить платформы Java/AWT/Swing и C++/Qt.
Сравнение C++ и Java
Часто при обсуждении преимуществ и недостатков различных языков программирования дебаты сводятся к аргументам, основанным скорее на личном опыте и предпочтениях, чем на объективных критериях. Конечно же, при выборе языка программирования личные предпочтения и опыт разработчика должны быть учтены, но так как эти критерии субъективны, они здесь не принимаются во внимание. Вместо этого мы будем рассматривать продуктивность программирования, производительность работы приложения и эффективность использования памяти, потому что эти критерии могут быть определены количественно и могут быть исследованы с научной точки зрения, хотя мы также учтем информацию, полученную из опыта разработки проектов в нашей компании.
Сравнение инициализации Scribe-DirectDraw и DirectDraw7:
Объявления переменных:
Практически аналогично в обоих случаях. Однако в DX7 кроме объекта DirectDraw, объектов поверхностей (буферов) и структуры описания поверхности надо объявить главный объект DirectX.
Раньше мы делали это так: Dim dd As DirectDraw Dim Primary As DirectDrawSurface 'Primary surface Dim BackBuffer As DirectDrawSurface 'BackBuffer surface Dim ddsd As DDSURFACEDESC Dim caps As DDSCAPS
В DirectX7 это делается так:
Dim dx As DirectX7 Dim dd As DirectDraw7 Dim Primary As DirectDrawSurface7 'Primary surface Dim BackBuffer As DirectDrawSurface 'BackBuffer surface Dim ddsd As DDSURFACEDESC2 Dim caps As DDSCAPS2
Далее, надо создать объект DirectDraw, установить режим отношения программы с другими приложениями (Coopeartive Level) и режим экрана. В DirectDraw7 объект DirectDraw создается из объекта DirectX.
Сначала предыдущая версия: Call DirectDrawCreate(ByVal 0&, dd, Nothing) 'Создаем DirectDraw Call lpDD.SetCooperativeLevel(trgtForm.hwnd, DDSCL_EXCLUSIVE Or DDSCL_FULLSCREEN Or DDSCL_ALLOWREBOOT) 'Режим работы Call lpDD.SetDisplayMode(X, Y, Color) 'Режим дисплея
Теперь, DirectX7 Set dd = dx.DirectDrawCreate("") 'Создаем DirectDraw Call dd.SetCooperativeLevel(trgtForm.hWnd, DDSCL_FULLSCREEN Or DDSCL_EXCLUSIVE Or DDSCL_ALLOWREBOOT) 'Режим работы Call dd.SetDisplayMode(X, Y, Color, 0, DDSDM_DEFAULT) 'Режим дисплея
Теперь надо задать описание главной поверхности, создать ее и получить задний буфер.
Scribe-DirectDraw: 'Create a front surfaces With ddsd .dwSize = Len(ddsd) .dwFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT .DDSCAPS.dwCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX .dwBackBufferCount = 1 End With Call dd.CreateSurface(ddsd, Primary, Nothing) 'Retrieve BackBuffer caps.dwCaps = DDSCAPS_BACKBUFFER Call Primary.GetAttachedSurface(caps, BackBuffer)
DirectDraw7: 'Create a front surfaces ddsd.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX ddsd.lBackBufferCount = 1 Set Primary = dd.CreateSurface(ddsd) 'Retrieve BackBuffer caps.lCaps = DDSCAPS_BACKBUFFER Set BackBuffer = Primary.GetAttachedSurface(caps)
После этого можно установить ColorKey и другие дополнительные параметры. Как видите, смысл один и тот же, а разница скорее в синтаксисе, что однако довольно неприятно.
Так что, для какого DirectX программировать решать конечно же вам. По крайней мере уже целая толпа, пожав плечами отправилась юзать новое детище Microsoft... Удачи, и
Приятного программирования,
Среда разработки C++ Builder
C++ Builder представляет собой SDI-приложение, главное окно которого содержит настраиваемую инструментальную панель (слева) и палитру компонентов (справа). Помимо этого, по умолчанию при запуске C++ Builder появляются окно инспектора объектов (слева) и форма нового приложения (справа). Под окном формы приложения находится окно редактора кода.
Рис.1. Среда разработки C++ Builder
Формы являются основой приложений C++ Builder. Создание пользовательского интерфейса приложения заключается в добавлении в окно формы элементов объектов C++ Builder, называемых компонентами. Компоненты C++ Builder располагаются на палитре компонентов, выполненной в виде многостраничного блокнота. Важная особенность C++ Builder состоит в том, что он позволяет создавать собственные компоненты и настраивать палитру компонентов, а также создавать различные версии палитры компонентов для разных проектов.
Средства мониторинга событий службы WMI
Не буду останавливаться на основах функционирования WMI; эта тема уже достаточно обсуждалась как на страницах печатных изданий, так и в Web. Однако для того, чтобы дать читателю представление о том, как служба WMI обеспечивает выполнение задачи, поставленной перед сценарием, я кратко опишу некоторые реализованные в WMI функции мониторинга событий. Встроенная система мониторинга событий службы WMI отслеживает события во всех классах WMI. Любой сценарий можно "привязать" к этим событиям и выполнять действия в зависимости от них. Системы на основе событий, как правило, позволяют сокращать число используемых рабочих циклов процессора и задержки, связанные с опросом элемента системы об изменениях его состояния. Если сценарий, в котором задействованы средства мониторинга событий WMI, составлен корректно, он может отслеживать события, не будучи встроенным в цикл, а значит, непроизводительные затраты ресурсов процессора снижаются почти до нуля. В рамках мониторинга событий внутренние механизмы WMI выполняют некоторые операции по опросу элементов системы. Но эти операции проводятся внутри пространства имен WMI. Сценарию не приходится запускать дополнительные процессы, реактивировать бездействующие процессы, подключаться к внешним источникам данных или пережидать задержки на обращение к диску.
Средства мониторинга событий службы WMI могут инициализировать мониторинг событий даже в тех случаях, когда данная функция не предусмотрена соответствующим интерфейсом API. Когда в API встраивается провайдер WMI, этот провайдер автоматически извещает WMI обо всех случаях создания, обновления и удаления экземпляров своего класса. Даже если вы привлечете к работе системного программиста Windows, вполне возможно, что он так и не сможет найти комбинацию базовых API, обеспечивающую надежное подключение и мониторинг событий соединений VPN, RAS и динамических соединений для всех версий Windows (от XP до Windows 95). Такая сложная задача явно противоречит идее написания короткого VBScript-сценария, предназначенного для мониторинга этих событий и выполнения соответствующих действий.
Ссылки
. "Legacy Information: A New Life with IBM Rational Rapid Developer", Rusty Lloyd. IBM Rational Rapid Developer Evaluator's Guide (IBM Rational Software Corporation). Rational Rapid Developer's Tutorial.
Стандарты ПО
Многие полагают, что если есть стандарт, то для получения качественного ПО достаточно просто четко ему следовать. Корни этого мифа - в необоснованном переносе в программную инженерию практики, сложившейся в традиционных индустриях. В последние 20 лет мы наблюдаем прямо-таки экспоненциальный рост числа разнообразных стандартов.
Организации, занимающиеся созданием и распространением стандартов (ISO, IEEE, IEC), пока не слишком преуспели в объективной оценке их достоинств с точки зрения практики разработки. К примеру, было бы неплохо хотя бы приблизительно знать, что если следовать стандарту "A" потребуются дополнительные затраты на величину "B", но при этом вы приобретете выгоды величиной "C". Если бы каждый стандарт сопровождался методикой оценки выгод его использования для некоторого типичного проекта, то стандарты было бы намного легче сравнивать и адаптировать.
Мои основные сомнения, касающиеся стандартизации, таковы: стандарты редко появляются вовремя: как правило, процесс их создания растягивается на столь долгое время, что к моменту публикации они теряют актуальность; бытует мнение (и оно не лишено оснований), что иногда под предлогом борьбы за качество стандарты вводятся сильными мира сего как средства конкурентной борьбы; стандарты не содержат методик количественной оценки выгод от их применения; не всегда понятна взаимосвязь вводимого стандарта с лучшими образцами практики и с другими стандартами.
Безусловно, следовать стандартам в той или иной степени необходимо, но разработка программн - не та область, где это гарантирует улучшение качества продукта в каждом конкретном случае.
Структура файла проекта
Для каждого приложения C++ Builder создается один файл проекта, один make-файл и один файл ресурсов. Файл проекта генерируется при выборе пункта меню File/New Application. Первоначально файлу проекта присваивается по умолчанию имя Project1.cpp. Если в процессе разработки приложения добавляются формы и модули, C++ Builder обновляет файл проекта.
Для просмотра файла проекта следует выбрать пункт меню View/Project Source. Эта операция выполнит загрузку исходного текста файла проекта в редактор кода (рис. 1).
Рис. 1. Просмотр файла проекта в редакторе кода
Файл проекта имеет такую же структуру, как и файл модуля. Подобно файлу модуля, это файл исходного кода на языке C++, который компилируется с другими файлами при создании исполняемого файла.
В файле проекта имеется определенный набор ключевых элементов:
Директива препроцессора #include <vcl\vcl.h> предназначена для включения в текст проекта заголовочного файла, ссылающегося на описания классов библиотеки компонентов.
Директива препроцессора #pragma hrdstop предназначена для ограничения списка заголовочных файлов, доступных для предварительной компиляции.
Директива USEFORM сообщает, какие модули и формы используются в проекте.
директива USERES компилятора присоединяет файлы ресурсов к выполняемому файлу. При создании проекта автоматически создается файл ресурсов с расширением *.res для хранения курсоров, пиктограммы приложения и др.
Application->Initialize()
Это утверждение критично только в случае, если приложение является OLE automation-сервером. В остальных случаях оно фактически ничего не делает.
Application->CreateForm()
Это утверждение создает форму приложения. По умолчанию, каждая форма в приложении имеет свое утверждение CreateForm.
Application->Run()
Это утверждение запускает приложение (точнее, переводит его в состояние ожидания наступления одного из событий, на которое оно должно реагировать).
Конструкция try...catch используется для корректного завершения приложения в случае возникновения ошибки при инициализации, создании форм, запуске приложения.
Структура h-файла
h-файл генерируется при создании нового модуля. В нем содержится информация о данных и функциях, которые можно использовать в модуле. h-файл для модуля, связанного с формой, содержит описания интерфейсных элементов и других компонентов этой формы и обработчиков событий для них (то есть, в терминологии объектно-ориентированного программирования, описание класса формы). Такие описания автоматически добавляются в h-файл при внесении в форму новых компонентов или генерации новых обработчиков событий. Иными словами, в h-файле содержится интерфейс, а в самом модуле - реализация.
Рис. 3. Пример структуры h-файла
Примечание. При удалении из формы компонентов их описания удаляются из h-файла, а описания обработчиков событий сохраняются. При переименовании компонентов изменяются их описания в h-файле, а также имена и описания обработчиков событий, сгенерированные автоматически. Однако при этом не изменяются ссылки на эти компоненты и обработчики событий, используемые в других функциях, поэтому рекомендуется переименовывать компоненты и обработчики событий сразу же после их создания, пока на них не появились ссылки.
Не рекомендуется удалять из модуля пустые функции (например, случайно созданные шаблоны обработчиков событий). Они не увеличат размер исполняемого файла, но их удаление может привести к невозможности заново сгенерировать обработчик события, если в этом возникнет необходимость.
Отметим, что в модуле могут содержаться функции, не описанные в h-файле, однако видимость их в этом случае ограничивается данным модулем.
Внутри модуля функции могут быть определены и ссылаться друг на друга в произвольном порядке. Если данный модуль ссылается на другие формы и модули, следует с помощью директивы препроцессора #include включить в него соответствующий h-файл с помощью пункта меню File/Include Unit Hdr... . После этого интерфейсные элементы другого модуля будут доступны в данном модуле.
Структура make-файла
Make-файл - это текстовый файл, содержащий макросы, директивы и инструкции по компиляции и сборке проекта для утилиты make.exe. Отметим, что make-файл по существу ничем не отличается от обычного знакомого пользователям С и С++ make-файла. Он генерируется автоматически при создании проекта, и его содержимое зависит от установок, указанных программистом в опциях проекта. Чтобы увидеть содержание make-файла, следует выбрать пункт меню View/Project Makefile (рис. 2).
Рис. 2. Пример структуры make-файла
Структура модуля
Модули являются основой создания библиотек и приложений в C++ Builder. Модуль содержит исходный текст на языке C++ и первоначально представляет собой файл с расширением *.CPP. В дальнейшем каждый такой файл компилируется в объектный файл с расширением *.OBJ. Объектные файлы, в свою очередь, собираются компоновщиком в выполняемый файл с расширением *.EXE.
При добавлении к проекту новой формы генерируется новый модуль. При добавлении модуля к проекту при помощи выбора пункта меню File/New Unit создается пустая структура модуля, в которой включены директивы: #include <vcl\vcl.h>; #pragma hdrstop; #include "Unit2.h"
Директива #include "Unit2.h" указывает на то, что в текст модуля должен быть включен соответствующий заголовочный файл.
При создании модуля используются следующие правила:
Имя должно быть уникальным. Два модуля с одним и тем же именем не могут использоваться одновременно в одном и том же проекте.
Если модуль связан с формой, то имя исходного файла модуля и файла формы (с расширением *.dfm) должны быть одинаковыми.
При создании обработчика событий в инспекторе объектов в тексте файла модуля генерируется шаблон функции, в который разработчик должен вводить код, выполняемый при наступлении обрабатываемого события.
Связка ActiveX - Internet Explorer
Связка ActiveX - Internet Explorer
А знаете ли вы, что на Delphi можно писать ActiveX компоненты? Конечно знаете. А что с их помощью можно взаимодействовать с Internet Explorer? Это может быть интересно для профессиональных вебмастеров, скажете вы, но я не согласен. "Простой" программист тоже может найти массу применений этому. Здесь будет описано одно из них. Все мы лазим (ходим и т.д.) по интернету. И вы тоже - раз читаете эти строки :). А не случалось ли вам, случайно где-то побывав, что-то прочитав и благополучно забыв адрес сайта через некоторое время вдруг понять, что там было именно то, что вам сейчас срочно понадобилось? Можно конечно посмотреть History браузера, можно залезть в кэш "руками" и попытаться найти там что-то. А можно написать компонент, который бы искал слова в файлах кэша (в общем случае в любых HTML-файлах) и выводил бы на просмотр требуемые файлы. Связать этот компонент с Эксплорером - и вперед. Что удобно - вся работа происходит в эксплорере: и поиск, и,естественно, просмотр. При этом для Delphi-программиста не нужны особые знания языка HTML, скриптовых языков и т.п. Достаточно знать несколько основных конструкций (а уж справочных руководств в интернете очень много). Написанный ActiveX-компонент вставляется в HTML-страничку. Вот пример простейшей странички <HTML> <HEAD> <TITLE>Поиск</TITLE> </HEAD> <BODY> <P ALIGN=CENTER> <OBJECT ID="findword1" - {при помощи этого тэга компонент вставляется в страничку} CLASSID="CLSID:47E50425-E611-11D3-970A-4854E82B17E6" CODEBASE="C:\PATH\FINDWORDS.OCX"> </OBJECT> </P> </BODY> </HTML>
В этом примере ActiveX-компонент, находящийся в файле C:\PATH\FINDWORDS.OCX вставляется в HTML-страничку. Но важно отметить, что эта страничка откроется только в Microsoft Internet Explorer версии 4 и старше. Пишут, что третий эксплорер тоже поддерживает тэг <OBJECT>, но сам не пробовал, не знаю. Браузеры Netscape, Opera и какие еще там бывают, его не поддерживают.
Итак, тэг <OBJECT> вставляет в страничку ActiveX-компонент.
Его атрибут CLASSID указывает идентификатор класса нашего компонента. При создании в Delphi компонента с нуля ему автоматически присваивается этот идентификатор класса. ID="findword1" - имя объекта. Здесь можно писать любое имя. По нему мы в дальнейшем будем ссылаться на наш компонент в теле странички из скриптов-процедур обработки событий. Далее, для того, чтобы наш компонент мог использоваться прикладными программами, он должен быть зарегистрирован в реестре. Зарегистрировать его можно программой regsvr32, которая по умолчанию находится в каталоге [System]. Например так: [regsvr32 C:\PATH\FINDWORDS.OCX]. Если при открытии странички Explorer не находит в реестре указанный компонент, то он ищет его в местоположении, указанном атрибутом CODEBASE. Здесь может быть полный путь к файлу, если он находится на вашем жестком диске или даже URL-адрес (со всеми сопутствующими атрибутами, как то http:// и т.д.).Т.е, если эксплорер встретил ссылку на компонент, а этого компонента нет на вашей машине, он может загрузить его из интернета с указанного адреса. Кстати, атрибут CLASSID - обязательный, именно по нему производится "идентификация" класса. А атрибут CODEBASE - необязательный. В случае, когда он опущен, если компонент уже зарегистрирован в системе, то он отобразится в вашей страничке, если не зарегистрирован - страничка будет пустой. И наконец если эксплорер сам регистрирует компонент, он переписывает файл OCX в папку [Windows\Downloaded program files]. Для того, чтобы вручную не писать скрипты подсоединения ActiveX компонентов, я советую скачать программу Microsoft ActiveX Control Pad . Эта программа предназначена для внедрения ActiveX-компонентов в HTML-странички. После ее работы определение компонента выглядит примерно так:
<OBJECT ID="findword1" CLASSID="CLSID:47E50425-E611-11D3-970A-4854E82B17E6" CODEBASE="C:\PATH\FINDWORDS.OCX"> <PARAM NAME="Visible" VALUE="-1"> <PARAM NAME="AutoScroll" VALUE="0"> <PARAM NAME="AutoSize" VALUE="0"> <PARAM NAME="AxBorderStyle" VALUE="1"> <PARAM NAME="Caption" VALUE="findword"> <PARAM NAME="Color" VALUE="2147483663"> <PARAM NAME="Font" VALUE="MS Sans Serif"> <PARAM NAME="KeyPreview" VALUE="0"> <PARAM NAME="PixelsPerInch" VALUE="96"> <PARAM NAME="PrintScale" VALUE="1"> <PARAM NAME="Scaled" VALUE="-1"> <PARAM NAME="DropTarget" VALUE="0"> <PARAM NAME="HelpFile" VALUE=""> <PARAM NAME="DoubleBuffered" VALUE="0"> <PARAM NAME="Enabled" VALUE="-1"> <PARAM NAME="BiDiMode" VALUE="0"> <PARAM NAME="Cursor" VALUE="0"> <PARAM NAME="filename" VALUE="nothing"> </OBJECT>
Т.е.
эта программа сама подставляет полное определение компонента (его CLASSID, например). Правда, полученный код иногда приходится подправлять вручную. Например может потребоваться убрать явное указание высоты и ширины объекта. Теперь подходим к самому главному: как сделать сам компонент (чтобы было что вставлять в нашу страничку :). Итак, в Delphi делаем New\ActiveX\Active form. В окошке Active Form Wizard выбираем Threading model=Apartment. Другие threading models не работают с IE 4. Выглядит это так: компонент в страничке открывается, но иногда вдруг выскакивает Access violation. (обычно на событие Create). Модель же Both работает с IE 5. Флажок "Include Design-Time licence" лучше не устанавливать. Дальше открывается новая форма, где вы можете размещать свои кнопки-текстбоксы, определять реакцию на события и т.д. Далее будут описаны некоторые хитрости. Например, нужно хранить некоторые данные во внешнем файле. Я столкнулся со следующим: мой компонент на разных машинах размещал свои файлы в разных местах: на одной в каталоге Windows, на другой - на рабочем столе. Был найден такой выход: пусть страничка по требованию компонента возвращает ему каталог, в котором она находится. Для этого на форму я поместил PageControl, сделал закладки невидимыми и на OnShow (у формы ActiveX компонента нет события OnShow) одной из страниц поставил генерацию собственного события OnWantDir. А в теле HTML-странички соответственно реакцию на него:
<SCRIPT LANGUAGE="VBScript"> <!-- Sub findword1_OnWantDir() findword1.page_location = location.href end sub --> </SCRIPT>
Далее, это событие OnShow происходит сразу после создания экземпляра компонента. Так вот, если событие OnWantDir генерировать непосредственно в нем (в OnShow), то видимо что-то в недрах Windows не успевает провернуться и машина виснет. Поэтому пришлось повесить на форму таймер, на OnShow таймер запускать, и уже на OnTimer как раз и вызывать свое событие OnWantDir. Интервал у таймера я поставил в полсекунды.
Конечно можно было бы хранить свои файлы например в каталоге [Windows], но почему-то функция GetWindowsDirectory при вызове из ActiveX-компонента возвращала ошибку, хотя тут же нормально отрабатывала из обыкновенного приложения (exe). То же и с GetSystemDirectory и GetTempDirectory. Как сделать компонент тиражируемым? Чтобы пользователь смог работать с ним сразу же, не запуская никаких дополнительных программ, не указывая всяких-разных путей и т.д. Вот пример HTML-странички (а его скриншот):
<html> <HEAD> <title>Поиск</title> <SCRIPT LANGUAGE="VBScript"> <!-- Sub Procedure1() location.href = findword1.NewStroke
{Получить от компонента имя файла и открыть его для просмотра. Эта процедура запускается при возникновении события OnDocClick. Location - объект Explorer'а (см. документацию по VBScript)}
end sub --> </SCRIPT> </HEAD> <SCRIPT LANGUAGE="VBScript"> <!-- Sub findword1_OnWantDir() findword1.page_location = location.href
{Получить текущий каталог, т.е. свойству page_location объекта присвоить местоположение нашей странички}
end sub Sub findword1_OnDocClick()
{При возникновении события OnDocClick вызвать процедуру Procedure1 (открыть файл для просмотра)}
call Procedure1() end sub --> </SCRIPT> <p align = "center"> <OBJECT ID="findword1" CLASSID="CLSID:47E50425-E611-11D3-970A-4854E82B17E6" CODEBASE="findwords.ocx">
{Здесь просто имя файла без пути. Explorer зарегистрирует компонент невидимо для пользователя, взяв его из текущеего каталога (страничка и файл OCX находятся в одном каталоге)}
<PARAM NAME="Visible" VALUE="-1"> <PARAM NAME="AutoScroll" VALUE="0"> <PARAM NAME="AutoSize" VALUE="0"> <PARAM NAME="AxBorderStyle" VALUE="1"> <PARAM NAME="Caption" VALUE="findword"> <PARAM NAME="Color" VALUE="2147483663"> <PARAM NAME="Font" VALUE="MS Sans Serif"> <PARAM NAME="KeyPreview" VALUE="0"> <PARAM NAME="PixelsPerInch" VALUE="96"> <PARAM NAME="PrintScale" VALUE="1"> <PARAM NAME="Scaled" VALUE="-1"> <PARAM NAME="DropTarget" VALUE="0"> <PARAM NAME="DoubleBuffered" VALUE="0"> <PARAM NAME="Enabled" VALUE="-1"> <PARAM NAME="BiDiMode" VALUE="0"> <PARAM NAME="Cursor" VALUE="0"> <PARAM NAME="filename" VALUE="nothing"> <PARAM NAME="page_location" VALUE=""> </OBJECT> </p> </BODY> </html>
И еще раз: 1) открываем нашу страничку (в IE 4 и выше); 2) если компонент зарегистрирован, он сразу показывается, если не зарегистрирован, то регистрируется и показывается.При этом: 3) после создания выдерживается пауза в полсекунды и запрашивается текущий каталог (и страничка и сам OCX-файл находятся в одном каталоге, который и будет текущим). 4) если нужно открыть на просмотр какую либо страничку (выбранную пользователем в процессе работы из списка - см. ), то свойству компонента (при внедрении его в страничку правильнее будет называть его уже объектом) присваивается значение (имя файла), генерируется событие. Cкрипт-обработчик этого события читает свойство и отрывает требуемый файл.
Свойства компонентов
Свойства являются атрибутами компонента, определяющими его внешний вид и поведение. Многие свойства компонента в колонке свойств имеют значение, устанав иваемое по умолчанию (например, высота кнопок). Свойства компонента отображаются а странице свойств (Properties). Инспектор объектов отображает опубликованные (published) свойства компонентов. Помимо published-свойств, компоненты могут и чаще всего имеют общие (public), опубликованные свойства, которые доступны только во время выполнения приложения. Инспектор объектов используется для установки свойств во время проектирования. Список свойств располагается на странице свойств инспектора объектов. Можно определить свойства во время проектирования или написать код для видоизменения свойств компонента во время выполнения приложения.
При определении свойств компонента во время проектирования нужно выбрать компонент на форме, открыть страницу свойств в инспекторе объектов, выбрать определяемое свойство и изменить его с помощью редактора свойств (это может быть п остое поле для ввода текста или числа, выпадающий список, раскрывающийся список, диалоговая панель и т.д.).
Терминология
Компонент. Составная часть распределенного приложения.
Active Directory. Сетевая служба каталогов Microsoft, которую корпорация предполагает включить в состав Windows 2000.
ActiveX. Предлагаемый Microsoft способ разработки программных компонентов.
Common Object Model (COM). Программная архитектура Microsoft, поддерживающая компонентный подход к разработке приложений.
COM+. Модернизация COM и Microsoft Transaction Server, который упрощает разработку сложных распределенных приложений.
Common Object Request Broker Architecture (CORBA). Основной конкурент DCOM в области построения распределенных программных систем.
Распределенные вычисления. Парадигма организации приложений, в которой различные части программы могут исполняться на разных компьютерах в сети.
Microsoft Transaction Server (MTS). Усовершенствование в составе COM, которое реализует поддержку транзакций баз данных.
Remote Procedure Call (RPC). Удаленный вызов процедуры - сообщение, посылаемое по сети, которое позволяет программе, установленной на одном компьютере, инициировать выполнение необходимой операции на другом.
Тестирование
Только неофиты от программирования верят мифу, что на этапе тестирования можно выявить и решить все накопившиеся в процессе разработки проблемы. По данным руководителя фирмы Software Productivity Research К. Джоунса вероятность благополучного завершения проблемного проекта не превышает 15%. Вывод очевиден: если разработчики ожидают фазы тестирования в надежде исправить обнаруженные недостатки ПО, шансов на спасение такого проекта очень мало.
The MIDAS Suite содержит:
The Business ObjectBroker - для динамического управления загрузкой и контроля безопасности в многозвенных критичных для бизнеса системах. The Remote DataBroker - снижает стоимость конфигурирования и поставки информационных систем с "тонким" клиентом. The ConstraintBroker - проверяет корректность данных и снижает сетевой траффик с помощью пересылки правил ссылочной целостности с сервера на рабочую станцию без написания кода.
Более детальное описание MIDAS и его интеграции с Delphi 3 можно обратиться к материалам корпоративного Web-сервера Borland .
ThisWorkBook или ActiveWorkBook?
Q: На листе модулей открытой рабочей книги присутствует процедура, которая копирует некий лист из другой (не активной) рабочей книги. В этом листе в некоторых ячейках находятся определенные пользователем формулы. Процедура работает без проблем.
Из workbook, содержащей эту процедуру, я делаю надстройку (.xla) и подключаю ее к Excel 95. При вызове вышеописанной процедуры она выдает сообщение:
Run time error 424 object required
Kак можно избежать это сообщение?
A:Вот что я тебе посоветую:
Посмотри ещё разок код модулей рабочей книги и исправь все ссылки вида ActiveWorkbook.WorkSheets(".. на ссылки вида ThisWorkBook.WorkSheets("..
Дело в том, что когда выполняется код надстройки активной книгой в Excel'е является _не_ сама надстройка! Конструкция ThisWorkbook позволяет сослаться на книгу, в которой в настоящий момент выполняется код Excel VBA.
Нint: Это общий принцип создание надстроек Excel!
Тотальное Управление Качеством
Последний миф связан с тенденцией регламентировать все возможные аспекты разработки ПО. Тотальное Управление Качеством (Total Quality Management - TQM) - это очень показательный пример воплощения данного мифа. В традиционных областях индустрии следование четко определенной методике управления качеством действительно приносит успех. Однако промышленное программирование остается сугубо творческим процессом со значительным элементом неопределенности, и прямое приложение отработанных в иных условиях методик представляется ошибочным.
Триггерные возможности MQSeries
Асинхронный характер работы системы очередей сообщений требует специального механизма внешней активизации прикладных и системных компонентов. В MQSeries такой механизм - "триггеринг" привязан непосредственно к очередям сообщений. Триггерным событием может быть, например, появление в очереди нового сообщения или факт накопления определенного числа сообщений, имеющих приоритет выше заданного порогового значения.
Чтобы определить триггерное событие, для прикладной очереди при помощи административных команд устанавливаются опции, разрешающие триггеринг и условия триггерного события. Кроме того, администратором системы создается специальное описание обработки такого события. В описании содержится информация о приложении, которое будет вызвано при наступлении триггерного события. Если происходит такое событие, например, появляется новое сообщение в очереди, менеджер очередей автоматически генерирует специальное триггерное сообщение, которое помещается в очередь инициации (initiation queue). В триггерном сообщении содержатся данные о событии и вызываемом процессе. Все очереди инициации отслеживаются триггерным монитором, который читает триггерное сообщение и вызывает внешнюю программу обработки (рис. 2).
Рис. 2. Обработка "триггерных" событий
Приведем пример двух административных команд для создания триггерной очереди и описания процесса вызова внешней программы: DEFINE QLOCAL(имя очереди) TRIGGER + PROCESS(имя процесса) INITQ(имя очереди инициации) + TRIGTYPE(тип триггерного события) .... DEFINE PROCESS(имя процесса) + APPLICID(имя вызываемой программы) USERDATA(параметры)...
Триггеринг достаточно часто применяется в качестве стандартного метода автоматического старта каналов между менеджерами очередей. Для этого достаточно в качестве триггерных обьявить транспортные очереди, содержащие сообщения для передачи удаленному менеджеру очередей.
Удаление листов в зависимости от даты
Q: Как удалить рабочие листы листов в зависимости от даты?
A: Вот код функции на Excel VBA, который решает данную проблему:
' Function DelSheetByDate
' Удаляет рабочий лист sSheetName в активной рабочей книге,
' если дата dDelDate уже наступила
' В случае успеха возвращает True, иначе - False
Public Function DelSheetByDate(sSheetName As String, _
dDelDate As Date) As Boolean
On Error GoTo errHandle
DelSheetByDate = False
' Проверка даты
If dDelDate <= Date Then
' Не выводить подтверждение на удаление
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets(sSheetName).Delete
DelSheetByDate = True
Application.DisplayAlerts = True
End If
Exit Function
errHandle:
MsgBox Err.Description, vbCritical, "Ошибка №" & Err.Number
End Function
Управление Adaptive Server Enterprise
Для новых или неопытных администраторов Sybase Central является средством быстрого и эффективного освоения администрирования. Но и более опытным администраторам Sybase Central дает организованное представление некоторой труднодоступной информации такой как, например, зависимости одних объектов от других или списки полномочий пользователей в представлении по объектам или по пользователям. На любом уровне администрирования Sybase Central может поднять производительность за счет удобного интерфейса и наличия таких возможностей, как редактирование кода (хранимых процедур, триггеров и пр.) и генерации скриптов.
ASE Plug-in соответствует стандарту интернационализации I18N и обеспечивает полноценную поддержку английского, французског, немецкого и японского языков.
На рисунке показано главное окно Sybase Central с некоторыми раскрытыми объектами при инсталляции ASE.
Удобный интерфейс
ASE Plug-in для Sybase Central является удобным вариантом - но не заменой ! - isql, работающего из командной строки. Администраторы могут использовать любой из этих интерфейсов и по-прежнему использовать и разрабатывать скрипты.
Использование в Sybase Central интерфейса "укажи и нажми", дерева представления объектов, диалоговых окон с закладками и прокручиваемых списков не требует теперь от администраторов запоминания имен и синтаксиса хранимых процедур для получения или изменения информации в системе или БД. Визарды устраняют необходимость помнить правильную последовательность команд при создании новых объектов.
Интерфейс предоставляет возможность работать с именами таких объектов как, например, таблицы, столбцы, правила, устройства и триггеры, не требуя от пользователей исследовать или запоминать их. Таблицы свойств отображают информацию об объекте, не требуя администратора понимания структуры системной таблицы ASE.
Кроме того, чтобы сделать управление с одной консоли более производительным, ASE plug-in позволяет работать со следующими утилитами:
SQL Advantage. Обеспечивает соединение с Adaptive Server Enterprise с целью создания и выполнения хранимых процедур и выражений на Transact-SQL. Directory Services Editor (dsedit).Редактирует файл службы каталогов на компьютере, где установлен Sybase Central. Configure Sybase Server (syconfig). Конфигурирует ASE, Monitor Server и Backup Server. Таблицы свойств объектов
Sybase Central предлагает визуальное представление всех установок ASE в сочетании с возможностью легко получать свойства конкретных объектов. Например, как показано на рисунке, всего несколько нажатий клавиши мыши - и администратор получает исчерпывающую информацию о том, как сконфигурировано устройство БД.
Когда администратор добавляет новый объект, визарды предлагают всю необходимую и дополнительную информацию о свойствах этого объекта. После того, как объект создан, его свойства доступны для просмотра в таблице свойств. Закладки на таблице организуют свойства в легко идентифицируемые группы. Свойства объекта отображаются в таблице свойств независимо от того, каким образом был создан сам объект: с помощью визарда, скрипт-файла или выражений на Transact-SQL из SQL Advantage или другого isql средства.
Список зависимостей
Когда администратор БД собирается произвести изменения каких-либо объектов, он должен понимать, какие воздействия могут оказать эти изменения на другие объекты. С использованием Sybase Central исследование связей между объектами становится намного проще. Команда меню Dependencies вызывает диалог с двумя закладками, которые соответствуют двум видам зависимостей выбранного объекта:
Закладка "Referenced by" показывает, какие объекты зависят от данного объекта. Например, от таблицы могут зависить хранимые процедуры, триггеры и представления (views). Закладка "References" показывает, от каких объектов зависит выбранный объект. Например, таблица может зависеть правил, значений по умолчанию и типов пользователей. На рисунке приведены оба типа зависимостей для таблицы TITLES
Управление доступом
Простым щелчком мыши на дереве объектов Sybase Central администратор может сразу же увидеть доступы (logins) и ролевые функции (roles), определяемые для пользователей, для каждого Adaptive Server Enterprise, а также пользователей и группы пользователей, определенные для каждой базы данных.
Визарды ведут администратора на протяжении всего процесса создания новых составляющих этих объектов. Таблица свойств отображает параметры, использовавшиеся для создания объектов, и другую полезную информацию. Например, таблица свойств для доступа показывает:
базы данных, для которых определен данный доступ ролевые функции, соответствующие данному доступу пользователи, использующие данный доступ непосредственно или через синоним Новое свойство ASE версии 11.5 - ролевые функции, определяемые для пользователя, - полностью поддерживаются ASE Plug-in.
Администраторы могут назначать и изменять права пользователя щелчком мыши в соответствующей ячейке таблицы на закладке "Object Permissions" формы "Properties". Формат двумерной таблицы назначения прав пользователя используется для таблиц БД, хранимых процедур, представлений (views) и команд (типа create table). Этот формат также используется для управления правами для пользователей, групп пользователей и пользовательских ролевых функций (roles).
Редактор кода
Используя Sybase Central администраторы могут легко просматривать, редактировать и выводить на печать тексты хранимых процедур, представлений и триггеров. Полностью интегрированный редактор автоматически вызывается, когда администратор создает новую процедуру, представление или триггер. Для существующих объектов редактор открывается простым выбором команды меню, отображая текст выделенного объекта. Шифрованный текст не отображается.
Вот некоторые свойства редактора кода:
Автоматическое выделение синтаксических конструкций Поддержка отступов в контексте используемого языка Неограниченное количество UNDO и REDO Поддержка DRAG-N-DROP редактирования Наличие режима поиска/замены Открытие и сохранение внешних файлов Печать Выполнение кода, создающего новые объекты Редактор кода не поддерживает доступ к данным. Например, если хранимая процедура создает новую таблицу и заносит в нее данные, то с помощью редактора кода можно только создать таблицу; чтобы заполнить ее данными, администратору потребуется выполнить процедуру из SQL Advantage.
Поддержка Data Definition Language (DDL)
Sybase Central включает в себя мощный DDL- генератор для записи кода выделенного объекта на Transact-SQL. Выбранный объект может быть таблицей, представлением, триггером, входом, устройством или даже целой базой данных, включая все объекты внутри нее. Созданный код отображается в окне, где он может быть отредактирован, распечатан или сохранен во внешнем файле. Поддерживается запись в один файл результатов нескольких DDL-генераций.
Управление несколькими соединениями и OmniConnect
Component Integration Services (CIS) - новый сервис в версии 11.5 ASE, дающий возможность доступа к данным, находящимся на удаленных серверах, из локального сервера ASE. Удаленный сервер может быть любым сервером Sybase, например, as Adaptive Server Enterprise, Adaptive Server Anywhere или Sybase IQ. Используя соответствующий продукт из сесмейства DirectConnect, можно обеспечить доступ не только к серверам Sybase, но к таким СУБД как Oracle, DB2 или Informix. С помощью CIS пользователь, соединяясь с одним ASE, получает полный и прозрачный доступ ко всем хранилищам данных как на локальном ASE, так и на удаленных серверах.
ASE Plug-in для Sybase Central с помощью CIS решает следующие задачи управления относительно удаленного доступа к данным:
Управление удаленным сервером. Удаленные серверы должны быть зарегистрированы на сервере ASE. Используя ASE Plug-in, администраторы могут добавлять и удалять удаленные серверы, устанавливать или изменять их свойства. Упраление доступом к удаленному серверу. Получая доступ к данным на удаленном сервере, пользователь работает через "слепок" локальных установок доступа на ASE. Управление таблицами на удаленном сервере через промежуточные таблицы. Администраторы могут добавлять, изменять и удалять таблицы на удаленном сервере путем создания этих изменений в промежуточных таблицах (proxy tables) на локальном сервере ASE. Проверка (синхронизация) промежуточных таблиц. Структуры таблиц на удаленном сервере могут быть в любое время изменены соответствующими администраторами, что приводит к рассогласованию данных.Проверка proxy-таблиц сравнивает два источника и подготавливает изменения, необходимые для определения промежуточных таблиц. Кроме управления удаленными серверами ASE Plug-in может управлять OmniConnect. Интерфейс в этом режиме очень похож на интерфейс ASE, за исключением собственно хранения данных: он содержит только proxy-таблицы.
Управление Crystal Reports с помощью OLE Automation.
Еще одним вариантом использования Crystal Reports в приложениях является использование Crystal Report Engine как OLE Automation-сервера. В справочной системе Crystal Reports имеется подробное описание иерархии вложенных объектов и их методов (и внушительный набор примеров для Visual Basic, аналоги которых несложно создать и на Pascal). В этом случае пример для Delphi, аналогичный рассмотренному выше, выглядит следующим образом: unit Uole1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,ComObj; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Button2: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; rep,r:variant; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin rep:=CreateOleObject('Crystal.CRPE.Application'); r:=rep.OpenReport('d:\Report2.rpt'); r.RecordSelectionFormula := '{items.ItemNo} = '+Edit1.Text; r.Preview; end; procedure TForm1.Button2Click(Sender: TObject); begin Close; end; end.
Отметим, однако, что использование OLE Automation - не самый выгодный с точки зрения производительности способ управления отчетами.
Usability.shtml
Интерфейсный интерфейс
В. Ковалев,
Вообще, каждая новая операционная система чем-то напоминает компьютерную игру. Журналы с азартом и упоением публикуют инструкции "по прохождению", хакеры и вирусописатели ищут и находят "секретные коды", а пользователи неистово "рубятся" в неё, одновременно решая кое-какие профессиональные задачи и попутно меняя картинки на экране. Самой удачной и увлекательной игрой подобного рода можно без сомнения считать Windows, во всех её вариациях.
Мало кто помнит, как всё начиналось. Бедная по возможностям DOS-Shell от Microsoft естественно не могла выдержать конкуренцию с Norton Commanderом (по крайней мере здесь, в постсоветском пространстве). Зато Windows 3.11 уже явила миру то, что и сейчас гордо именуется "дружеским интерфейсом". А уж Windows 95 и вовсе предоставил такие функциональные возможности для пользователей, что и поныне не менее тридцати процентов рабочего времени используется исключительно на настройку (включая замену экранных заставок, фона, звуковых эффектов и цветовой гаммы) этой операционной системы.
Правда, похоже, после 95-ого года ребята из Рэймонда так и не явили ничего интересного миру. Видимо, Microsoft решила дождаться момента, когда мощность компьютеров достигнет того предела, что можно будет использовать операционную среду, управляемую голосом. Ведь те же новоявленные Windows 2000 и Windows Me по внешнему виду почти неотличимы от своих собратьев. Правда, по начинке - это всё же другие операционные системы, но внешне - всё как и было: рабочий стол, кнопка "Пуск" и неудобный в использовании Проводник.
Есть за рубежом такая профессия, как "юзабилити". У нас специалисты данной отрасли тоже есть, но мало найдется людей, которые смогут внятно объяснить, чем же эти люди занимаются. А занимаются они ни много ни мало - эргономикой программного обеспечения. Дословно: они стараются сделать так, что бы работать с компьютером было удобно.
Знаете, почему два синих окошка Нортана и подобных им программ более удобны чем пресловутый стандартный Проводник в Windows? Дело в том, что предназначены эти две программы, хоть и относясятся к файл-менеджерам, для разных операций.
Если с помощью Norton Commander удобно перемещать, копировать файлы и каталоги, сравнивать их, то Проводник служит для одной-единственной, но весьма хорошо реализованной цели - перейти к нужному файлу или папке, а уж для каких-либо манипуляций с этими объектами он изначально не предназначен. Перейти к необходимому объекту в файловой системе или в панели управления используя Проводник несоизмеримей проще и быстрее, чем прыгать по директориям с помощью Norton Commander-а или подобной программы. В этом, кстати, и кроется успех подобных программы у нас, и практически полная безвестность за границей. Дело в том, что пользователи персональных компьютеров там - в буквальном смысле "пользователи", совершать какие-либо операции на уровне файловой системы им приходиться так же редко, как нам использовать кредитные карточки при расчетах через интернет. Вот именно эти проблемы удобства и рациональности использования тех или иных программных продуктов решаются людьми, чья профессия пока режет нам ухо - "юзабилити". На самом деле проблемы удобства использования программных средств занимают отнюдь не последнее место в списке вопросов, которые предстоит решить разработчику. Особенно на данный аспект следовало обратить внимание тем, кто пополняет и без того обширное море бесплатных или условно-бесплатных программ. Крупным компаниям, производящим программные продукты, хочешь - не хочешь, приходиться прислушиваться к пожеланиям пользователей, особенно в том случае, если этот пользователь корпоративный. А одиночкам, вышедшим на ниву разработки программного обеспечения, приходиться уповать только на собственное понятие "удобоваримости" программ и чувство вкуса, порой весьма отличного от общемирового. Именно в том случае, если у пользователя возникает "чувство комфорта" при работе с каким-нибудь программным продуктом, скорее всего он остановится при выборе именно на этой программе. Ведь, например, широко используемый по всему миру WinZip обрел известность используя общепонятный интерфейс, будучи написанный непрофессионалом в среде Delphi. Поэтому крупные фирмы тратят порой миллионы, а то и миллиарды долларов на разработку интерфейсной среды, понимая, что покупаться будет только тот продукт, пользоваться которым будет просто и удобно.
И сколько бы нареканий не вызывал Windows, его "оконный" интерфейс, метафора "рабочего стола", возможности "перетащи и брось" - стандарты де факто, и от этого никуда не деться. Хотя например, Internet Explorer и явил миру своеобразный "шаг вперед, два назад". По своей сущности он отбросил наработанный годами общепонятный "язык" общения с пользователем. Согласитесь кнопка "назад", не всегда приведет к предыдущей запрошенной странице (хотя это больше претензии к создателям сайтов, любящих странною любовью фреймы). А то, что никакой броузер по умолчанию не хочет подгружать в фоновом режиме те страницы на которых с текущей есть ссылки (в большинстве случаев мы перемещаемся по сети щелкая мышкой по интересным для нас ссылкам, разве нет?), естественно вызывает раздражения, когда наблюдаешь неповоротливое движение броузера в заданном направление. Неужто нельзя было предугадать, что пользователь сейчас щелкнет по какой-либо ссылке и не подгрузить часть данных заранее. Вообще же на данный момент как разработчики сайтов и разнообразнейших утилит для работы с сетью, похоже, мало задумываются о удобстве работы пользователя, и в большей степени обеспокоены реализацией своих высокохудожественных или высокоинтеллектуальных идей. Мы же пока вообще считаем интерфейс программ делом последним, и вместо справки по F1, выводим лишь гордое и самодовольное "О программе", с указанием, куда следует переводить деньги и перечислением всяческих кар за незаконное использование. И после этого многие удивляются, почему хорошие по своей сути программы не имеют успеха за границей. Да они просто неудобны в использовании. Конечно, в том случае, если программа предназначена для выполнения профессиональных обязанностей, то можно освоить и подобный неудобный в использовании продукт, попутно законспектировав, к примеру, два тома руководства по внутреннему языку для 1С. Ну а в том случае, если программа предназначена для рядового пользователя? Будет он тратить силы и время на исследования может быть и весьма интересного продукта? Скорее всего нет - и, как следствие, программа останется невостребованной.
А "шароварщики" без денег. Единственный сектор, где "юзабилити" удобству работы с программой уделяют внимание - это компьютерные игры. Мало кто из разработчиков программ здесь осмелиться так просто плевать на пользователей - релиз игры они просто не продадут. В этом смысле аналогия Windows с компьютерной игрой очевидна. Несмотря на многочисленные огрехи самой операционной системы, особых нареканий графический интерфейс не вызывает - его конечно можно улучшать, используя разнообразнейшие и многочисленные программы, но по своей сути он достаточно целен и удобен в использование. Кстати, если вы считаете, что это не так, быстро ответьте: что бы вы хотели видеть вместо рабочего стола и панели задач? Но похоже, что ситуация с неудобством программных продуктов имеет шанс быть исправленной. На серверах объявлений о работе уже появились приглашения специалистов по "юзабилити". Правда, пока предложений больше, чем специалистов. Но в этом есть определенный шанс для тех, кто сможет доказать свою умение влезать в "шкуру" пользователя. И в скором времени можно надеяться на то, что от "местных" программ перестанут шарахаться за рубежом, да и нас они перестанут пугать нелогичностью и станут более удобны в использовании.
В. Ковалев / ©
Установка разделяемых свойств компонентов
Большинство визуальных компонентов имеют общие свойства, (например, Visible, Width, Left). Для установки одинаковых значений общих свойств для нескольких компонентов необходимо выполнить следующие действия:
1. Выбрать несколько настраиваемых компонентов. При этом страница свойств и спектора объектов будет отображать только те свойства, которые имеются у всех выбра ных компонентов.
Рис. 1. Выбор нескольких компонентов для групповых операций
2. Установить значения свойств, общих для выделенных компонентов.
Рис.2 показывает результаты изменения свойства Font и Left . Все выбранные компоненты приобрели одинаковые значения этих свойств.
Рис. 2 Установка разделяемых свойств компонентов
Установка VB 5.0 и VB 4.0 на одном компьютере
В нескольких откликах читателей на статью о Visual Basic 5.0 (PC Week/RE, N 22/97, стр. 43) затрагивается вопрос о проблеме сосуществования VB 5.0 и VB 4.0 на одном компьютере. Кто-то столкнулся с ней на собственном опыте, кто-то читал об этом в Internet или зарубежной прессе.
Суть проблемы заключается в том, что эти две версии VB имеют довольно много общих программных компонентов с одинаковыми именами и функциями - ряд файлов OCX и DLL, которые хранятся в общем каталоге компьютера WINDOW95\SYSTEM. Соответственно, при установке VB 5.0 автоматически производится замена старых компонентов на новые (правила здесь очень просты - на компьютере сохраняются файлы с более поздней датой создания).
В бета-версиях VB 5.0, которые распространялись в конце 1996 г., о такой ситуации прямо указывалось в обращении к программистам-тестерам. Там же говорилось о нежелательности хранения обеих версий 4.0 и 5.0 на одном компьютере по двум причинам: Так как речь шла о бета-версии, то Microsoft не гарантировала работоспособность новых компонентов. Разработчик-тестер не мог передавать кому бы то ни было создаваемые им программы, так как в них попадали бета-компоненты VB 5.0, на распространение которых он не имел прав.
Ошибки в бета VB 5.0 (в том числе и в бета-версии VB5/CCE, которая распространялась свободно) действительно были. Например, я тогда обнаружил их в ряде модулей OCX - COMDLG32, COMCTL32 и RICHTX32. Пришлось вручную восстанавливать варианты от VB 4.0, которые однако работали и с новой версией.
Справедливости ради нужно отметить, что в окончательном варианте VB 5.0 эти ошибки оказались исправлены. Но из общения с обратившимися ко мне читателями было видно, что практически все они пользовались либо старыми бета-версиями, либо пиратскими, содержимое которых вообще с трудом поддается идентификации. В частности, многие пользователи VB5-бета получили довольно неприятный сюрприз, обнаружив после майских праздников, что время жизни VB 5.0 (и его компонентов!) закончилось.
В окончательной версии VB 5.0 никаких предупреждений со стороны Microsoft о его разногласиях с VB 4.0 не содержится. Более того в документах Microsoft подчеркивается совместимость компонентов VB 5.0 с версией 4.0. (Один читатель указал на предупреждение не ставить две версии на один ПК, которое содержится в статье ID:Q161344, записанной на Web-странице Microsoft. Но, по-видимому, это относится ко времени бета-тестирования - статья датирована декабрем 1996 г.)
Тем не менее, следует рекомендовать всем по возможности воздержаться от установки на один ПК сразу двух версий VB. Хотя бы потому, что VB 5.0 фактически еще проходит этап "опытной эксплуатации" и наличие в нем ошибок сейчас вполне вероятно. Для разработчиков, занимающихся созданием коммерческих программ на VB 4.0, рисковать не стоит. К тому же все новые варианты компонентов заметно прибавили по размеру (что касается функций, то это еще требует дополнительного изучения).
Устройство системы очередей сообщений
Основными элементами системы MQSeries являются: сообщения, которые прикладные программы посылают друг другу; очереди для хранения сообщений; менеджеры очередей, управляющие очередями и обработкой сообщений; каналы передачи сообщений, связывающие менеджеры между собой.
Сообщения (Message) MQSeries представляют собой структуру данных, состоящую из заголовка сообщения размером 324 байт (MQMessageDescriptor) и прикладных данных, в зависимости от платформы имеющих размер до 100 Мбайт. Заголовок содержит контрольную информацию о сообщении и его характеристиках. С помощью этой информации менеджер очередей решает, каким образом обрабатывать и куда передавать сообщение.
Прикладная часть сообщения может включать данные в специальных предопределенных форматах или данные в форматах пользователя. Для приложений, функционирующих под управлением разных ОС и оперирующих различными кодовыми страницами, поддерживаются методы конвертации данных.
Очередь сообщений (Queue) - основное место хранения и обработки сообщений. Физическое управление очередями полностью скрыто от прикладных программ - приложения могут получить доступ к очередям только через интерфейс MQI (Message Queue Interface). Для передачи критически важной информации MQSeries использует "постоянные" (persistence) сообщения, которые журналируются и восстанавливаются после рестарта менеджера сообщений. Для повышения производительности MQSeries поддерживает также и "непостоянные" сообщения, которые не журналируются и могут быть потеряны в результате системного или аппаратного сбоя.
Менеджер очередей (Queue Manager) отвечает за управление очередями сообщений и прием вывозов от прикладных программ. Внутренняя реализация менеджеров очередей для каждой операционной системы своя. Однако с функциональной точки зрения менеджеры очередей MQSeries представляют собой совокупность очередей различных типов, каналов передачи сообщений между менеджерами, программ-мониторов и административных утилит.
Прикладные программы взаимодействуют с системой MQSeries через интерфейс прикладного программирования MQI, который имеет единую структуру на всех платформах и основан на простой системе из десятка команд.
Взаимодействие с системой любой прикладной программы начинается с команды подключения к менеджеру очередей MQCONN.
Чтобы использовать очередь, приложение должно сначала ее открыть (команда MQOPEN). Если все прошло успешно, программе возвращается специальный указатель (object handle), на который она будет ссылаться при последующих обращениях к данной очереди. Для помещения сообщения в очередь используется команда MQPUT, для выборки сообщений - команда MQGET, для вспомогательных целей запроса и установки атрибутов очередей существуют вызовы MQINQ и MQSET. При этом многочисленные опции команд позволяют реализовать различные режимы работы приложений с очередями сообщений. Например, путем установки опций команды MQGET можно осуществлять просмотр и навигацию вдоль очереди сообщений (по типу курсора CУБД) или выборку сообщений, удовлетворяющих, например, какому-либо признаку. Для начала и завершения транзакции используется команда MQCMT и команда отката транзакции назад MQBACK. Для закрытия очереди и отсоединения от менеджера очередей применяются команды MQCLOSE и MQDISC соответственно. При создании приложений обеспечивается поддержка интерфейса MQI для языков программирования: Cи, С++, Java, SmallTalk, Cobol, PL/1, Lotus LSX, Basic. Для написания программ, использующих MQSeries, можно задействовать такие распространенные пакеты быстрой разработки приложений, как VisualAge, Delhi, PowerBuilder, VisualBasic и другие. Хотя надо отметить, что разработка приложений для систем очередей сообщений имеет свои особенности, связанные с асинхронным характером взаимодействия, например программирование процедур-мониторов очередей.
В заключение
Мы постарались по возможности рассмотреть все значимые аспекты перевода 32-разрядного кода на 64-разрядную платформу. Следует заметить, что портирование драйверов происходит точно по такому же принципу. Хотя при этом обнаруживается достаточно много подводных камней, каждый из которых проявляется в своем конкретном случае. Составить общее представление об этом вопросе позволяет MSDN.
Как сообщают представители Microsoft, средства для работы с 64-разрядным кодом (новые типы данных, указатели, компилятор, библиотеки...) будут включены в новую версию MS Visual C++. Пока что в нашем распоряжении есть DDK/SDK, и это уже немало. С их помощью уже сейчас можно создавать кросс-платформенные приложения и портировать 32-разрядный код.
АЛЕКСЕЙ ДОЛЯ - технический писатель. С ним можно связаться по адресу: .
Визуальное построение Internet/Intranet приложения при помощи Borland Delphi.
Давайте посмотрим, что можно сделать при помощи визуальных компонент для Delphi, поставляемых в составе коробки с Baikonur Web App Server for Delphi. Конечно же, примеры, которые входят в состав поставки, не показывают всего многообразия возможностей, предоставляемых инструментарием, но с чего-то ведь надо начинать.
Вместе весело шагать ...
Итак, все "общество" в сборе. Есть пуля, стрелок и командир. Их нужно объединить в цепь - единую систему, способную выполнить поставленную задачу. Дадим классу "Цепь" имя CchainShot (листинг 4).
Данный класс создает объект "Командир", а также массивы объектов "Стрелок" и "Пуля" - соответственно IArrayRifleman и IArrayBullet. Связи между порожденными объектами организует метод SetLink.
Метод OnSize должен вызываться сразу после создания цепи стрелков. Он служит для задания размеров мячиков-пуль, установки их начального положения и определения шагов перемещения по координатным осям за один такт автоматного времени.
Методы GetAddrRifleman и GetAddrBullet возвращают адреса стрелков и пуль по их номерам из массивов. При организации связей для каждого стрелка ищется пуля с таким же номером, как у него.
Организация связей заключается в присвоении значений указателям, входящим в состав объектов "Стрелок" и "Пуля". При этом для первого стрелка соседом слева является командир, а для последнего указатель на соседа справа имеет значение Null.
Вместо заключения
Использование динамически подключаемых библиотек не так сложно, как это может показаться на первый взгляд. DLL предоставляют широчайшие возможности для оптимизации работы приложений, а также работы самих программистов. Используйте DLL и, возможно, ваша жизнь станет легче!
Внутренняя архитектура сервера приложений Baikonur.
Рассмотрим, как устроента система на основе сервера Baikonur. На рисунке показаны основные элементы системы. Удаленные и неудаленные клиенты 1-N обслуживаются одинаковым образом, никаких различий для них не делается. Каждый запрос, поступающий от клиентского браузера на TCP-порт, обслуживается листенером - подзадачей обслуживания коммуникационного порта, который фактически является монитором соединений (коннектов), а затем попадает на парсер, который разбирает запрос и идентифицирует клиента. При возникновении соединения листенер инициирует работу IP-менеджера, который обслуживает подзадачи сессий клиентов. Парсер принимает решение, генерировать ли ему новую подзадачу сессии клиента, или переключить информационный поток от клиента к его задаче. Таким образом информационный поток попадает от клиентского браузера именно туда, куда необходимо. Идентификация клиента позволяет избежать потери контекста при переключении между задачами. На передаче информационного потока задаче обработка не заканчивается. Библиотека HTML-компонент, написанная для Delphi, устроена так, что базовый компонент, присутствующий в каждой задаче (THTMLControl), умеет воспринимать поток информации, передаваемый ему с сервера Baikonur. Этот поток воспринимается, и раздается активным визуальным компонентам для обработки. При передаче информации от приложения клиенту все происходит в обратном порядке, с тем лишь исключением, что коннект уже установлен, клиентский браузер идентифицирован. Поэтому остается лишь собрать информацию с визуальных компонент, собрать ее в один поток и передать обратно на клиента.
Рисунок 3
Для функционирования системы строится довольно сложная структура данных (см. следующий рисунок.). Сложность построения системы усугубляется еще и тем, что обработка всех процессов производится в параллельном режиме, это особенно заметно на многопроцессорных серверах. Все подзадачи Baikonur ведут обработку независимо друг от друга, и, хотя в целом сам сервер получился довольно компактным, логика его функционирования требует отдельного описания.
Рисунок 4
Внутри
Использование сценариев делает возможным интеграцию объектной модели приложения C++ с интерпретатором сценариев. Для QSA это означает, что большая часть Qt и, в особенности, объектная модель Qt должны быть доступны для Qt Script.
Предоставление доступа к откомпилированным функциям из сценариев называется 'привязыванием' (binding). Для осуществления привязывания применяются различные подходы, но наиболее распространенным является использование генератора кода, который производит синтаксический разбор объявлений классов C++, и на основе собранной информации для каждого класса создает обертку (wrapper), которая обычно является подклассом. В дальнейшем интерпретатор сценариев вызывает код обертки. Этот подход имеет два существенных недостатка: он сильно раздувает код, потому что подкласс обертки должен быть создан для каждого класса, и очень утомителен, потому что обертка должна быть создана для каждого класса, который разработчик захочет использовать в сценариях.
Подход, использованный в QSA, совершенно отличен, и основан на мета-объектной системе Qt. Мета-объектная система использует механизм сигналов и слотов, с которым знакомы все программисты Qt. Она также использует систему свойств Qt. Мета-объектная система может использоваться во время выполнения для создания и удаления связей сигнал-слот, для запросов, получения и изменения свойств, и для доступа к информации RTTI (Run Time Type Identification). Ни для одной из этих динамических возможностей не нужны подклассы оберток и не потребуется писать какой-либо другой код.
Небольшое количество кода, который предоставляет эти возможности, уже создано компилятором moc (Meta Object Compiler). В результате каждый класс и подкласс QObject, а также все их свойства, сигналы и слоты автоматически доступны для использования в сценариях. Не-QObject классы могут легко быть сделаны доступными для сценариев, если их обернуть в QObject. Этот подход работает даже для плагинов (plugins), поэтому классы или подклассы QObject, используемые в плагинах, будут доступны в сценариях.
Приведенная диаграмма показывает взаимосвязи между механизмом поддержки сценариев (QSA Library), приложением и сценариями приложения. Разработчики сценариев могут получить доступ непосредственно к объектам QObject, для которых был вызван метод addObject(), как будто эти объекты встроены в сам язык Qt Script. Объекты QObject могут быть объектами приложения или объектами, специально созданными разработчиками для программистов сценариев с целью предоставления им простого управления приложением. QSA Designer интегрирован с механизмом поддержки сценариев для обеспечения удобства создания, редактирования, выполнения и отладки сценариев.
Восемь типов технологии перевода
В современных профессиональных средах перевода возможности вычислительной техники используются на различных этапах и уровнях. Всего можно выделить восемь способов применения компьютера при переводе (таблица 1).
Таблица 1
Уровень терминов | Уровень сегментов | |
До перевода | Выделение терминовАнализ терминологии | Сегментация текста |
Во время перевода | Автоматический поиск терминологии | Поиск языковых пар в памяти переводовМашинный перевод |
После перевода | Проверка соответствия терминологии | Проверка целостности сегментов, формата и грамматики |
Вот пуля пролетела, и ага, или А очередями слабo,?!
В основном варианте программы стрелки выпускают по одной пуле. А как сделать, чтобы они были готовы стрелять в любой момент? Или, по-другому, как организовать стрельбу очередями?
Оказывается, для этого достаточно внести в классы "Стрелок" и "Пуля" совсем небольшие изменения. Полностью новые классы приведены в примере, прилагаемом к электронной версии этой статьи (см. , где также находятся последняя версия FSA-библиотеки mfsa532.dll и дополнительная библиотека lwslib.dll), здесь же мы рассмотрим лишь соображения, лежащие в основе реализации "автоматной" стрельбы.
Во-первых, пуля должна быть выпущена точно в нужный момент. Более всего для этого подходит действие y3 стрелка, позволяющее создать динамический объект-пулю. Пусть сам стрелок после выстрела переходит к ожиданию новой команды. Тогда действие y3 приобретет вид, показанный в листинге 6.
Во-вторых, объекту "Стрелок" следует передать адрес окна отображения, который он, в свою очередь, передаст объекту "Пуля" (см. листинг 6).
И в-третьих, необходимо придать пуле способность распознавать выстрел в автоматическом режиме, что можно сделать, присваивая ей номер, равный нулю. Кроме того, такая пуля должна самоуничтожаться, достигнув границы окна.
Таблица переходов для данного варианта алгоритма приведена в листинге 7. Подчеркнем, что при переходе КА в состояние "00" автоматный объект удаляется из сетевой автоматной среды.
Проделав описанные изменения, можно, наконец, стрелять очередями. Чтобы выпустить несколько пуль подряд, нужно прежде, чем первая пуля достигнет границы окна, дать требуемое число раз команду Fire в меню программы Command.
Меню позволяет также задать скорость полета пули, выбрав пункт Slow или Fast (по умолчанию действует Fast). В окончательном варианте пули, входящие в массив, имеют вид известных мячиков, а "автоматные" - стилизованных под пулю эллипсов.
Встраивание отчетов в Borland Delphi и Borland C++Builder.
Существует несколько способов использования отчетов Crystal в приложениях, написанных на Delphi и C++Builder. Во-первых, можно непосредственно использовать функции Print Engine в коде, связанном с формой, или написать собственные компоненты, использующие такие функции. Во-вторых, можно воспользоваться готовым компонентом TCrpe, входящим в комплект поставки Crystal Reports 6.0, а также использовать компоненты третьих фирм. Можно использовать управляющий элемент Crystal Reports ActiveX. Наконец, можно управлять работой Crystal Reports Print Engine как сервером OLE Automation. Рассмотрим примеры использования каждого способа.
графическое средство управления для продуктов
Sybase Central - графическое средство управления для продуктов Sybase. Он реализует стратегию Sybase управления всеми серверами и ПО промежуточного уровня предприятия с единственной консоли. Sybase Central работает в операционной среде Microsoft Windows 95 и Microsoft NT. Он поддерживает соединения и обеспечивает управление продуктами Sybase на любой платформе, на которой поддерживается работа с продуктами Sybase.
Sybase Central для Adaptive Server Enterprise(известного как Adaptive Server Enterprise Plug-in) входит в пакет with Adaptive Server Enterprise (ASE) версия 11.5 и может быть устанавлен с любого CD из поставки ASE . (Для платформы HP-UX настольные приложения находятся на отдельном CD.)
Используя Sybase Central и ASE Plug-in, администраторы систем и баз данных могут с единственной консоли полностью устанавливать и контролировать в сети Adaptive Server Enterprise версии 11.5 и SQL Server 11.0.x независимо от платформ, на которых они работают.
Управление этими серверами с Sybase Central не отменяет как использование интерфейса администратора isql для ASE и SQL Server, так и использование скриптов. Интерфейс командной строки isql и графический интерфейс Sybase Central выполняют одни и те же функции, так что их использование равнозначно. Однако интерфейс Sybase Central более интуитивен и легок для освоения.
Ниже приведены некоторые преимущества, получаемые от использования Sybase Central для управления ASE и SQL Server 11.0.x:
Визуальное представление объектов. В основном окне Sybase Central раскрывающееся дерево объектов показывает каждую базу данных, вход (login), устройство, удаленный сервер, именованый кеш (буфер), группу механизмов (engine), выполняемый класс, ролевые функции и текущий процесс для каждого сервера ASE. Для каждой базы данных раскрывается список объектов, таких как, например, таблицы, хранимые процедуры, виды, правила и пользователи.
Простой интерфейс "укажи и нажми". Кнопки, выпадающие списки, диалоговые окна с закладками и визарды обеспечивают удобный и быстрый способ просмотра и корректировки объектов в системе и базых данных.
Borland C++ Builder - выпущенное недавно компанией Borland средство быстрой разработки приложений, позволяющее создавать приложения на языке C++, используя при этом среду разработки и библиотеку компонентов Delphi. В настоящей статье рассматривается среда разработки C++ Builder и основные приемы, применяемые при проектировании пользовательского интерфейса.
Введение в объектную модель FSO
Новая особенность VB6 - объектная файловая система (FSO), которая представляет собой основанный на объектах инструмент для работы с папками и файлами. Это позволяет вам использовать знакомый синтаксис object.method с богатым набором свойств, методов и событий для работы с папками и файлами в дополнение к использованию традиционных методов и команд Visual Basic.
Объектная модель FSO дает вашим прикладным программам возможность создавать, изменять, перемещать и удалять папки. С легкостью можно собрать информацию о системных папках, их наличии и расположении. Вы также можете получать всю остальную информацию о дисках, папках и файлах: их имена, атрибуты, даты создания или изменения и т.д.
Объектная модель FSO позволяет намного проще проводить обработку файлов. При обработке файлов ваша основная цель состоит в том, чтобы сохранить данные в эффективном, легко доступном, экономящем ресурсы формате. Всю остальную работу - собственно размещение данных на носителе - берет на себя FSO. Вы сможете создавать файлы, добавлять, изменять и считывать данные.
FSO, которая содержится в библиотеке типов Scripting type library (scrrun.dll), поддерживает создание текстовых файлов и манипулирование ими через объект TextStream. Однако она не поддерживает создание или манипулирование двоичными файлами. Для управления двоичными файлами по-прежнему приходится использовать старые методы - команду Open с соответствующим флагом.
Объекты файловой системы
FSO имеет следующие объекты:
Объект | Описание |
Drive (Дисковод) | Позволяет получить информацию о дисководах, присоединенных к системе: их тип, объем (общий, занятый и свободный), метку, серийный номер и т.д. Обратите внимание, что под словом "дисковод" не обязательно подразумевается жесткий диск. Это может быть FDD, CD-ROM, виртуальный диск и т.д. Также не обязательно, чтобы дисководы были физически присоединены к системе - обеспечивается работа с сетевыми дисками. |
Folder (Папка) | Позволяет создавать, удалять или перемещать папки. Также через этот объект можно получить сведения об их именах, атрибутах, путях к определенным папкам и так далее. |
Files (Файлы) | Позволяет создавать, удалять или перемещать файлы. Предоставляет доступ к атрибутам, именам и прочим характеристикам файлов. |
FileSystemObject | Основной объект группы. Содержит методами, которые позволяют создавать, удалять, получать информацию обо всех объектах файловой системы. Также осуществляет управление дисководами, папками и файлами. Многие из методов, связанных с этим объектом, дублированы в других объектах. |
TextStream | Дает возможность читать и писать текстовые файлы. |
Программирование в объектной модели FSO Программирование в объектной модели FSO включает три основных задачи: создание объекта FileSystemObject путем использования метода CreateObject или объявления новой переменной типа FileSystemObject; использование соответствующего метода в созданном объекте; вызов свойств объекта. FSO содержится в библиотеке типов, называемой Scripting, которая размещена в файле scrrun.dll. Эту библиотеку надо прописать в меню References | Microsoft Scripting Runtime (если вы этого еще не сделали). С помощью Object Browser можно просмотреть список объектов, свойств, методов, событий и констант, включенных в FSO. Создание объекта FileSystemObject Первый шаг - создание объект FileSystemObject для последующей работы с ним. Это можно сделать двумя способами: объявить переменную как объект:
Dim fso As New FileSystemObject используя метод CreateObject, создать объект класса FileSystemObject:
Set fso = CreateObject("Scripting.FileSystemObject") Обратите внимание, что первый метод работает только в Visual Basic, в то время как второй метод работает и в Visual Basic, и в VBScript. Использование соответствующих методов Следующий шаг - использование соответствующих методов объекта FileSystemObject. Например, если вы хотите создать новую папку или файл, надо использовать методы CreateFolder или CreateTextFile. Если вы хотите удалить объекты, используйте методы DeleteFile или DeleteFolder объекта FileSystemObject, или метод Delete объектов File или Folder. (FSO, естественно, не поддерживает создание или удаление объектов типа Drive). Используя соответствующие методы, вы можете также копировать и перемещать файлы и папки. Обратите внимание, что некоторые функциональные возможности в модели объекта FileSystemObject избыточны. Например, вы можете скопировать файл двумя путями: используя метод CopyFile объекта FileSystemObject, или используя метод Copy объекта File. Оба подхода дают одинаковые результаты и существуют для того, чтобы обеспечить максимум гибкости при программировании. Работа с существующими дисководами, файлами и папками Чтобы получить доступ к существующему дисководу, файлу или папке, используется соответствующий метод Get объекта FileSystemObject: GetDrive; GetFolder; GetFile.
Например: Dim fso As New FileSystemObject, fil As File Set fil = fso.GetFile("c:\test.txt") Обратите внимание, однако, что вы не должны использовать методы Get для только что созданных объектов, так как функции создания объектов сразу возвращают вызывающей программе ссылку на созданный объект. Например, если вы создаете новую папку, используя метод CreateFolder, вам не нужно использовать метод GetFolder, чтобы обратиться к ее свойствам (таким как Name, Path, Size и т.д.), так как функция CreateFolder сразу возвращает ссылку на созданный объект. Чтобы получить доступ к свойствам созданной папки, достаточно воспользоваться соответствующей переменной (в данном случае fldr): Private Sub Create_Folder() Dim fso As New FileSystemObject, fldr As Folder Set fldr = fso.CreateFolder("C:\MyTest") MsgBox "Created folder: " & fldr.Name End Sub Обращение к свойствам объекта Получив доступ к объекту с помощью методов Get (или создав его), вы можете обращаться к его свойствам. Например, сначала вы получаете доступ к корневому каталогу диска c: методом GetFolder (так как папка уже существует): Set fldr = fso.GetFolder("c:\") После этого вы можете проверить его свойство Name: Debug.Print "Folder name is: "; fldr.Name Если Вы хотите узнать дату и время последнего изменения файла, используйте следующий синтаксис: Dim fso As New FileSystemObject, fil As File 'Получаем объект File, чтобы сделать запрос Set fil = fso.GetFile("C:\detlog.txt") 'Печатаем информацию Debug.Print "File last modified: "; fil.DateLastModified
Введение в WebOLTP
WebOLTP – имя, которое было предложено компанией Sybase, для описания приложений, выполняющих транзакции в Internet, intranet, extranet или традиционных корпоративных сетях. Отличительные черты WebOLTP при ставнении с OLTP-технологией на мэйнфреймах или в системах клиент/сервер :
“Тонкие клиенты” В традиционных системах клиент/сервер для запуска приложений необходимо, чтобы клинтское ПО было заранее установлено. В архитектуре с “тонким” клиентом специализированное программное обеспечение не обязательно устанавливать на клиенте, поскольку исполняемые компоненты могут загружаться с Web site для последующего взаимодействия с клиентом. Таким образом, “тонкий” клиент или клиент с “нулевой инсталляцией” получает два ключевых преимущества при работе в сети: универсальный доступ и уменьшение затрат на инсталляцию и управление. Однако, из-за наличия броузеров и HTML, тонким клиентам для динамического управления бизнес-приложениями необходимо использование дополнительных средств, таких как Java-апплеты. Большие объемы при большом количестве соединений В отличие от приложений клиент/сервер и их предшественников, пользователи WebOLTP могут существенно расширить границы отдела или компании, используя extranets или Internet. С этими новыми приложениями "самообслуживания", доступ больше не ограничивается небольшим количеством клерков, регистрирующих заказы, но вместо этого становится открытым для тысяч пользователей, одновременно выполняющих транзакции. Это потребует хорошо масштабируемую архитектуру сервера для построения WebOLTP приложений. Непредсказуемые нагрузки Приложения с отчетливо выраженным кругом потребителей работают с достаточно ясно определенными наборами действий и нагрузок. Использование WebOLTP-приложений, благодаря открытому кругу пользователей в них, должно привести к непредсказуемым нагрузкам. По мере того, как любое Web-приложение становится доступно, менеджерами Web-узлов обычно затрудняются предсказать, когда и сколько пользователей пытаются загружаться.Чтобы справляться с неожиданными скачками загрузки при сохранении приемлемого времени отклика, требуется наличие хорошо регулируемых и адаптирующихся систем. Короткий жизненный цикл приложения Каждая следующая генерация приложений кажется обреченной на более короткий жизненный цикл, чем предшествующая. Хотя жизненные циклы, по-видимому, немного удлинятся по мере развития технологии Internet, современные приложения для Сети требуют всего лишь несколько недель или месяцев на разработку, и разрабатываться только в последние 12-18 месяцев. Web-менеджеры стараются корректировать содержимое узла ежедневно и обновлять их графику по крайней мере каждые 9-12 месяцев. Поскольку текущие ожидания потребителя заставят WebOLTP-приложения последовать этому примеру, технология для построения этих систем должна быть очень легкой для использовать и развертывания. Появление WebOLTP-архитектуры Новая архитектура и модель использования призваны удовлетворить строгие требования к WebOLTP-приложениям. Возникновение 3-уровневой или многоуровеневой архитектуры (см. Рис. 4) отвечает потребностям WebOLTP с точки зрения масштабируемости (scalability) и динамического доступа при сохранении всех преимуществ базовой архитектуры. Инфраструктура Web В этой новой модели, пользователи находят и запускают приложения, использующие традиционные страницы и Web-серверы. Но вместо просто загрузки статической страницы, динамическая "апплета" загружается в индивидуальный броузер. К тому же апплета поддерживает высокоскоростные протоколы, которые позволяют ей соединяться непосредственно с сервлетами ("servlets") - ПО, работающим на промежуточном уровне. Обычно сервлеты обеспечивают доступ к одной или более баз данных, реализуют бизнес-логику и возвращают результаты апплете для отображения на клиенте.
Рисунок 4. Трехуровневая архитектура
Хотя многие представители промышленности и ряд поставщиков усиленно “проталкивают” эту архитектуру, по-прежнему ведутся многочисленные споры о точной роли каждого компонента и о ключевых технических требованиях по обеспечению масштабируемости и простоты использования систем на основе WebOLTP. Апплеты Апплеты являются динамически загружаемыми программами, которые управляют логикой представления данных.
В архитектуре WebOLTP апплеты также содержат часть кода, отвечающего за коммуникации, что позволяет им напрямую соединяться с сервлетами, работающими на промежуточном уровне. Существует два метода для построения апплетов. Первый основан на использовании Java и JavaBeans, второй – на основе технологии ActiveX. Безотносительно того, какая технология используется, апплеты реализуют следующие преимущества: Небольшой объем, что обеспечивает быструю загрузку Большую интерактивность и более дружественный интерфейс по сравнению с обычными HTML-страницами Легкость в разработке и сопровождении Протоколы, отличные от HTTP На сегодня единственным широко распространенным протоколом в Сети является Hypertext Transfer Protocol – . Являясь частью исходной инфраструктуры WWW, HTTP прекрасно подходит для работы со статическими HTML-страницами. Однако он не совсем удобен для интерактивной обработки бизнес-транзакций, поскольку является странично-ориентированным и не поддерживает информацию о состояниях и соединениях. Все это является существенными недостатками, когда речь заходит о приложениях WebOLTP. Для того, чтобы обойти эти слабые места, фактически все эксперты и поставщики предлагают альтернативные протоколы для связи броузера и ПО промежуточного уровня. Ключевые требования для этих новых протоколов включают способность: Поддерживать информацию о пользователях и транзакциях Эффективно формировать результирующую выборку и управлять ею Поддерживать транзакции Предоставлять надежные механизмы шифрования данных Среда промежуточного уровня С появлением многоуровневой архитектуры, на промежуточный уровень (или уровни) была перенесена основная тяжесть прикладной обработки. Этот факт делает промежуточный уровень одним из наиболее критических и проблематичных компонентов WebOLTP архитектуры. СУБД Системы управления базами данных остаются важными компонентами всех OLTP систем, в том числе и WebOLTP. Для оптимизации СУБД в архитектуре WebOLTP необходимо: Поддержка нестабильных нагрузок с отслеживанием таких свойств, как запрос очередей и приоритетов Высокая скорость соединения с СУБД из Java-приложений Очереди приложений и управление ресурсами как средства сокращения общего объема ресурсов в системе и достижения стабильной производительности в рамках Internet-транзакции Обеспечение безопасности, как например, уполномоченная авторизация, т.е.
соответствие, для определенных WebOLTP-приложений Распределенная обработка запросов, которая позволила бы обрабатывать все многообразие типов данных, встречающихся в среде WebOLTP. Варианты ПО промежуточного уровня Возможно наиболее спорной областью WebOLTP-архитектуры является вопрос, какая технология больше всего подходит для выполнения и управления бизнес-логикой на промежуточном уровне. Приведем основные требования к ПО промежуточного уровня: Масштабируемость и производительность при работе с большим количеством пользователей, сессий, транзакций и соединений с БД Высокопроизводительное соединение броузера и back-end хранилища данных Поддержка быстрой разработки и развертывания WebOLTP-приложений на промежуточном уровне Поддержка как синхронного, так и асинхронного управления транзакциями. На сегодняшний день существует три наиболее распространенных варианта технологий для построения ПО промежуточного уровня: CORBA на основе брокеров объектных запросов (Object Request Brokers - ORBs); мониторы обработки транзакций (Transaction Processing Monitors - TP-Monitors) и серверы Web-приложений.
Каждая из этих технологий имеет свои сильные стороны, но ни одна из них идеально не подходит для требований WebOLTP на промежуточном уровне.
Объекты CORBA имеют превосходные возможности построения многоуровневой архитектуры с вызовом сильно распределенных объектов и прочисми сервисами. К сожалению, сложность общего решения и недостаток надежных средств поддержки ограничивает их применение только квалифицированными разработчиками, которые не боятся “испачкать руки”. К тому же, большинство ORB сегодня имеют примитивные механизмы исполнения на стороне сервера, что также ограничивает эффективность и масштабируемость.
TP мониторы, с другой стороны, имеют устойчивые и отработанные механизмы выполнения, которые предоставляют превосходную эффективность и масштабируемость. Однако, подобно объектам ORB, их общая сложность и собственный интерфейс API зачастую делает TP мониторы трудными в использовании и дорогими с точки зрения установки, управления и поддержки.
Серверы Web-приложений представляют последние решения в области программного обеспечения промежуточного уровня. Технология сервера Web-приложений появилась в результате попытки трансформировать Netscape и Web-серверы Microsoft в серверы приложений; рычагами к этому послужило последнее поколение соответствующих API -(NSAPI и ISAPI). Серверы Web-приложений вообщем являются специализированными (заказными) разработками на основе одного из инструментальных средств создания Web-узла.
Этот мощный набор инструментальных средств действительно ведет к повышению производительности разработчика. Но с другой стороны, масштабируемость существенно ограничена прямым обращением сервера приложений к Web-серверам и отсутствием поддержки не-HTTP протоколов связи.
Чтобы преодолеть слабые стороны существующих систем и удовлетворить требованиям WebOLTP на промежуточном уровне, обеспечивающим масштабируемость и простоту использования, был предложен новый класс системного ПО: серверы транзакций.
Серверы Транзакций Серверы Транзакции объединяют самые лучшие возможности СФЕР и мониторов TP с компонент-основанной разработкой: это дает возможность быстрому созданию масштабируемых WebOLTP приложений. Первыми доступными серверами транзакций станут Sybase Jaguar CTS (Компонентный сервер транзакций) от Sybase, Inc. и Microsoft Transaction Server (прежде известные как Viper). Поскольку спрос на WebOLTP растет, вскоре, по-видимому, должны появиться другие продукты этого класса.
Рисунок 5. Серверы транзакций объединяет самые лучшие возможности TP мониторов и ORB.
Серверы транзакций характеризуются следующими отличительными свойствами:
Предлагают встроенные возможности управления транзакциями. Обеспечивают механизм запуска и управления сервлетами (servlets). Поддерживают вызовы распределенных объектов для обеспечения связи в многоуровневых приложениях. Поддерживают средства быстрой разработки ПО для промежуточного уровня, включая компонентную разработку.
Выбор компонентов для групповых операций
Для эффективной разработки пользовательских интерфейсов приложений C++ Builder нередко возникает необходимость в манипулировании компонентами на формах.. Большинство операций для манипулирования компонентами находятся в меню Edit: К различным опциям этого меню следует обращаться после того, как на форме вы ран один или несколько компонентов, свойства которых требуется изменить.
Выбрать один компонент можно следующими способами: Выбрав с помощью мыши компонент на форме Выбрав имя компонента в селекторе объектов. Переходом к компоненту на форме, нажимая клавишу Tab.
Выбрать несколько компонентов можно следующими способами:
Удерживая нажатой клавишу Shift, щелкнуть мышью на каждом компоненте
Нажать левую клавишу мыши и окружить нужные компоненты прямоугольным контуром
Вычисление пересечения языковых пар
Поскольку выделение общей части двух сегментов- важный этап предлагаемой технологии перевода, изучим этот вопрос более детально. При этом, помня о том, что сегмент в памяти перевода выступает, чаще всего, не отдельно, а как элемент языковой пары, будем рассматривать именно пересечение пар.
Для начала дадим определения пересечения сегментов. Итак, пересечение сегментов A и B- это множество сегментов Ci, таких что: каждый из Ci содержится и в A, и в B; никакие два Ci не содержат одинаковых фрагментов; не существует такого сегмента D, что и A, и B содержат D, и D содержит один из сегментов Ci.
Приведенное определение не подразумевает выделения из сегментов A и B всех общих фрагментов. Это сделано для того, чтобы можно было использовать алгоритмы различной сложности реализации пересечения.
Теперь перейдем к пересечению языковых пар. Как уже было упомянуто выше, очень важно определить, является ли пересечение изоморфным, иными словами, можно ли считать результаты пересечения исходных и целевых сегментов языковой парой. Два примера иллюстрируют это (рис. 5). В первом случае пару сегментов "достаточно высока" и "ishighenough" имеет смысл поместить в память переводов, поскольку она действительно представляет собой вариант перевода, который может быть повторно использован переводчиком. Во втором случае- это совершенно очевидно- сегменту "достаточно" не следует сопоставлять сегмент "ishighenough", поскольку данная языковая пара будет некорректной.
Рис. 5
Для проверки изоморфизма пересечений можно использовать подход, основанный на технологии машинного перевода. Его суть в сопоставлении терминов, образующих исходный и целевой сегменты. Для этого необходимо произвести грамматический разбор сегментов с целью выделения терминов и синтаксических связей между ними. После этого можно воспользоваться терминологическим словарем для определения того, какому термину в целевом сегменте соответствует заданный термин в исходном сегменте. Иными словами, изоморфизм можно определить по следующему критерию (рис. 6): пересечение является изоморфным, если всем терминам его исходного сегмента, сопоставлены термины его целевого сегмента, и синтаксические связи между ними идентичны тем, которые присутствуют в сегментах, из которых было получено пересечение.
Рис. 6
В общем случае, для оценки изоморфизма можно проверять не только отдельные термины (суть корневые узлы графа памяти переводов), но и родительские сегменты всех уровней. Это повысит надежность оценки, снизив риск неправильного определения синтаксических связей.
Следует обратить внимание на тот факт, что в предлагаемой модели машинный перевод используется только для грамматического анализа текста, образующего сегмент. Слабым местом систем машинного перевода является выбор перевода для терминов сегмента, и именно эта задача решается более надежным способом- с помощью памяти переводов.
Выделение терминов и анализ терминологии
На этом этапе производится исследование текста с целью выяснения, какие слова или словосочетания могут быть взяты в качестве терминов. После того, как определен термин на исходном языке, осуществляется анализ терминологии на предмет того, какой термин на целевом языке следует выбрать для обозначения нужного концепта. Например, если в исходном тексте встретилось словосочетание "операционная система" то программа должна проанализировать его в качестве возможного термина, даже если в системе уже определены термины "операционный" и "система".
Выполнение сценария регистрации
Строки кода, размещенные в метке E, используются для создания объекта-оболочки, для отображения сетевого накопителя и выполнения сценария регистрации (в последнем случае используется метод run объекта-оболочки). Для выполнения сценариев регистрации .bat и .cmd нужно выделять применяемый по умолчанию каталог, однако сценарий выполняется в соответствии с соглашением по универсальным именам UNC (Universal Naming Convention), которое этого не предусматривает. Таким образом, для работы с названными сценариями накопителю необходимо присвоить буквенное обозначение. Если же сценарий регистрации написан в формате .vbs, .exe или в другом формате, не требующем присвоения накопителю буквенного обозначения, можно удалить все команды, управляющие отображением накопителя (метка F) и сохранить лишь ту часть программы, которая обеспечивает создание объекта-оболочки и выполнение сценария непосредственно с UNC. Сегмент сценария с соответствующими модификациями представлен в .
Выравнивание компонентов
Для выравнивания компонентов на форме можно использовать следующие комбинации клавиш:
Shift + стрелки | Изменяет размер компонента на один пиксел в направлении выбранной стрелки |
Shift + Ctrl + стрелки | Перемещает компонент на одну единицу сетки в направлении выбранной стрелки |
Ctrl + стрелки | Перемещает компонент на один пиксел в направлении выбранной стрелки |
Можно также выровнять компоненты, используя пункт меню View/Alignment Palette. Для этого нужно: Выбрать компоненты для выравнивания. Выбрать пункт меню View/Alignment Palette. Выбрать нужную кнопку (см. рис. 5).
Рис.5 Выравнивание компонентов с помощью View/Alignment Palette
Можно выровнять компоненты, используя пункт меню Edit/Align. Для этого нужно: Выбрать компоненты для выравнивания. Выбрать пункт меню Edit/Align. Появится диалоговое окно Alignment. Выбрать нужную опцию и нажать на кнопку OK (рис 6).
Рис.6. Выравнивание компонентов с помощью меню Edit/Align
Можно изменить условия выравнивания компонент, используя пункт меню Options/Environment. Для этого нужно: Выбрать пункт меню Options/Environment. Диалоговое окно Environment появится открытым на странице Preferences. В группе Form designer можно выбрать следующие опции: Display grid - сделать сетку из точек на форме видимой для выравниваемых компонентов Snap to grid - заставить левые и верхние стороны компонентов расположиться а линиях сетки. Для того, чтобы изменить расстояние между узлами сетки, нужно ввести новые значения вместо имеющихся. Значение по умолчанию -- 8 пикселей по оси X (по горизонтали) и по оси Y (по вертикали). Нажать OK.
Рис. 7. Выравнивание компонентов с помощью страницы Preferences диалоговой панели Environment
Высокоскоростные приложения в архитектуре клиент/сервер для Web
Пользователи Delphi теперь могут создавать высокоскоростные Internet-приложения с базами данных, используя имеющийся опыт создания приложений в архитектуре клиент/сервер. Открытая архитектура продукта позволяет им создавать Web-приложения, поддерживающие основные стандарты Internet, такие как ISAPI, NSAPI, ActiveX, HTML, WinCGI и CGI. Помимо этого, новое средство поставки Web-приложений, входящее в Delphi 3, может представить завершенное клиент-серверное приложение с "тонким" клиентом как форму ActiveX в Web, снижая расходы компаний на конфигурацию и поставку приложений.
Вывод - больше прагматизма!
Именно осознание малой практической ценности популярных когда-то направлений сделало многих практиков скептиками, не верящими в новые идеи. Это опасно, потому что так можно дойти до неприятия действительно полезных идей, не говоря уже о более приземленных вещах, таких как сокращение финансирования исследовательских работ.
Перечисленные идеи потеряют мифологический статус и действительно обеспечат реальную помощь в создании качественного и надежного ПО только в том случае, если будут подвергнуты критическому анализу. Кроме того, они должны использоваться не по отдельности, а в сочетании друг с другом
Однако я должен еще раз повторить уже не однажды высказанное предупреждение: исследователям не следует предлагать свои разработки практикам до того, как будут получены убедительные доказательства их действительной полезности. Важно, чтобы при этом рассматривались и вопросы, связанные с ограничениями новых технологий и стоимостью их адаптации.
У каждого из нас - своя роль. Практики должны более четко объяснять исследователям свои реальные проблемы, используя для этого и компьютерную прессу, и трибуны научных конференций. Исследователи должны демонстрировать эффективность своих идей на реальных, а не игрушечных задачах, и только потом выходить с ними на рынок.
Вызов процедур и функций, загруженных из DLL.
Способ вызова процедур и функций зависит от того, каким образом вы загрузили динамическую библиотеку, в которой эти подпрограммы находятся.
Вызов функций и процедур из статически загруженных DLL достаточно прост. Первоначально в приложении должно содержаться описание экспортируемой функции (процедуры). После этого вы можете их использовать точно так же, как если бы они были описаны в одном из модулей вашего приложения. Для импорта функции или процедуры, содержащейся в DLL, необходимо использовать модификатор external в их объявлении. К примеру, для рассмотренной нами выше процедуры HelloWorld в вызывающем приложении должна быть помещена следующая строка: procedure SayHello(AForm : TForm); external myfirstdll.dll';
Ключевое слово external сообщает компилятору, что данная процедура может быть найдена в динамической библиотеке (в нашем случае - myfirstdll.dll). Далее вызов этой процедуры выглядит следующим образом: ... HelloWorld(self); ...
При импорте функции и процедур будьте особенно внимательны при написании их имен и интерфейсов! Дело в том, что в процессе компиляции приложения не производится проверки на правильность имен объектов, экспортируемых из DLL, осуществляться не будет, и если вы неправильно описали какую-нибудь функцию, то исключение будет сгенерировано только на этапе выполнения приложения.
Импорт из DLL может проводиться по имени процедуры (функции), порядковому номеру или с присвоением другого имени.
В первом случае вы просто объявляете имя процедуры и библиотеку, из которой ее импортируете (мы это рассмотрели чуть выше). Импорт по порядковому номеру требует от вас указание этого самого номера: procedure HelloWorld(AForm : TForm); external myfirstdll.dll' index 15;
В этом случае имя, которое вы даете процедуре при импорте не обязательно должно совпадать с тем, которое было указано для нее в самой DLL. Т.е. приведенная выше запись означает, что вы импортируете из динамической библиотеки myfirstdll.dll процедуру, которая в ней экспортировалась пятнадцатой, и при этом в рамках вашего приложения этой процедуре дается имя SayHello.
Если вы по каким-то причинам не применяете описанный выше способ импорта, но тем не менее хотите изменить имя импортируемой функции (процедуры), то можно воспользоваться третьим методом: procedure CoolProcedure; external myfirstdll.dll' name DoSomethingReallyCool';
Здесь импортируемой процедуре CoolProcedure дается имя DoSomethingReallyCool.
Причем создание и помещение форм в динамическую библиотеку не слишком сильно отличается от работы с формами в обычном проекте. Сначала мы рассмотрим, каким образом можно написать библиотеку, содержащую формы, а затем мы поговорим об использовании технологии MDI в DLL. Разработку DLL, содержащую форму, я продемонстрирую на примере. Итак, во-первых, создадим новый проект динамической библиотеки. Для этого выберем пункт меню File|New, а затем дважды щелкнем на иконку DLL. После этого вы увидите примерно следующий код:
library Project2; {здесь были комментарии}
uses SysUtils, Classes;
{$R *.RES}
begin end.
Сохраните полученный проект. Назовем его DllForms.dpr. Теперь следует создать новую форму. Это можно сделать по-разному. Например, выбрав пункт меню File|New Form. Добавьте на форму какие-нибудь компоненты. Назовем форму DllForm и сохраним получившийся модуль под именем DllFormUnit.pas. Вернемся к главному модулю проекта и поместим в него функцию ShowForm, в задачу которой будет входить создание формы и ее вывод на экран. Используйте для этого приведенный ниже код.
function ShowForm : Integer; stdcall; var Form : TDLLForm; begin Form := TDLLForm.Create(Application); Result := Form.ShowModal; Form.Free; end;
Обращаю внимание, что для того, чтобы проект был скомпилирован без ошибок, необходимо добавить в секцию uses модуль Forms. Экспортируем нашу функцию с использованием ключевого слова exports :
exports ShowForm;
Компилируем проект и получаем файл dllforms.dll. Эти простые шаги - все, что необходимо сделать для создания динамической библиотеки, содержащей форму. Обратите внимание, что функция ShowForm объявлена с использованием ключевого слова stdcall. Оно сигнализирует компилятору использовать при экспорте функции соглашение по стандартному вызову (standard call calling convention). Экспорт функции таким образом создает возможность использования разработанной DLL не только в приложениях, созданных в Delphi. Соглашение по вызову (Calling conventions) определяет, каким образом передаются аргументы при вызове функции.
Существует пять основных соглашений: stdcall, cdecl, pascal, register и safecall. Подробнее об этом можно узнать, посмотрев раздел "Calling Conventions" в файле помощи Delphi. Также обратите внимание, что значение, возвращаемое функцией ShowForm, соответствует значению ShowModal. Таким образом вы можете передавать некоторую информацию о состоянии формы вызывающему приложению. Ниже представлено два листинга, первый из которых содержит полный код файла проекта DLL (модуль с формой здесь не приводится), а второй - модуль вызывающего приложения, в котором используется только что разработанная нами библиотека.
library DllForms;
uses SysUtils, Classes, Forms, DllFormUnit in 'DllFormUnit.pas' {DllForm};
{$R *.RES}
function ShowForm : Integer; stdcall; var Form : TDLLForm; begin Form := TDLLForm.Create(Application); Result := Form.ShowModal; Form.Free; end;
begin end.
unit TestAppUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; function ShowForm : Integer; stdcall; external dllforms.dll';
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin ShowForm; end; end.
Прошу заметить, что при экспорте функции также было использовано ключевое слово stdcall. Следует обратить особое внимание на работу с дочерними формами в DLL. Если, к примеру, в вызывающем приложении главная форма имеет значение свойства FormStyle, равным MDIForm, то при попытке вызова из DLL MDIChild-формы, на экране появится сообщение об ошибке, в котором будет говориться, что нет ни одной активной MDI-формы. В тот момент, когда вы пытаетесь показать ваше дочернее окно, VCL проверяет корректность свойства FormStyle главной формы приложения. Однако в нашем случае все вроде бы верно. Так в чем же дело? Проблема в том, что при проведении такой проверки, рассматривается объект Application, принадлежащий не вызывающему приложению, а собственно динамической библиотеке.
Ну, и естественно, поскольку в DLL нет главной формы, проверка выдает ошибку. Для того чтобы избежать такой ситуации, надо назначить объекту Application динамической библиотеки объект Application вызывающего приложения. Естественно, это заработает только в том случае, когда вызывающая программа - VCL-приложение. Кроме того, перед выгрузкой библиотеки из памяти необходимо вернуть значение объекта Application библиотеки в первоначальное состояние. Это позволит менеджеру памяти очистить оперативную память, занимаемую библиотекой. Следовательно, вам нужно сохранить указатель на "родной" для библиотеки объект Application в глобальной переменной, которая может быть использована при восстановлении его значения. Итак, вернемся немного назад и перечислим шаги, необходимые нам для работы с помещенным в DLL MDIChild-формами.
В динамической библиотеке создаем глобальную переменную типа TApplication. Сохраняем указатель на объект Application DLL в глобальной переменной. Объекту Application динамической библиотеки ставим в соответствие указатель на Application вызывающего приложения. Создаем MDIChild-форму и работаем с ней. Возвращаем в первоначальное состояние значение объекта Application динамической библиотеки и выгружаем DLL из памяти.
Первый шаг прост. Просто помещаем следующий код в верхней части модуля DLL:
var DllApp : TApplication;
Затем создаем процедуру, которая будет изменять значение объекта Application и создавать дочернюю форму. Процедура может выглядеть примерно так:
procedure ShowMDIChild(MainApp : TApplication); var Child : TMDIChild; begin if not Assigned(DllApp) then begin DllApp := Application; Application := MainApp; end; Child := TMDIChild.Create(Application.MainForm); Child.Show; end;
Все, что нам теперь необходимо сделать, - это предусмотреть возвращение значения объекта Application в исходное состояние. Делаем это с помощью процедуры MyDllProc:
procedure MyDLLProc(Reason: Integer); begin if Reason = DLL_PROCESS_DETACH then { DLL is выгружается.Восстанавливаем значение указателя Application} if Assigned(DllApp) then Application := DllApp; end;
WebOLTP в реальном мире
Каким образом корпорации могут использовать эту новую технологию? Рассмотрим несколько примеров.
Крупный дистрибьютор продовольственных товаров разрабатывает приложение для публикации в Интернет информации о ценах и запасах товаров таким образом, чтобы те, кто доставляет товары, могли обеспечивать более персонализированное обслуживание заказчиков и даже выписывать счета-фактуры, когда продукты уже доставлены. При более чем 10,000 маршрутов ежедневно и приблизительно 100,000 выданных счетов, такой подход даст возможность дистрибьютору поддерживать и улучшать отношения с клиентами при максимальной эффективности персонала и офисных систем и более равномерной загруженности в отличие от нынешней неравномерности. Компания планирует оборудовать средства доставки бортовым устройством, которое свяжет их с системой прейскурантов и товарных остатков по Сети. В конечном счете, система даст возможность ввести персональные ценовые соглашения, что будет способствовать привлечению заказчиков и достижению конкурентных преимуществ.
В другой отрасли, большая национальная сеть книжных магазинов разрабатывает Интернет-приложение для поиска имеющихся книг и регистрации заказов. В настоящее время если заказчик, посещающий один из магазинов сети, не может найти нужную книгу, представитель подразделения обслуживания заказчиков может предложить заказать книгу и вызывать заказчика, когда она прибудет. Однако, при большом количестве складов по всей стране весьма вероятно, что книга имеется где-нибудь в наличии, т.е. ее можно было бы продать и спланировать доставку прямо по адресу заказчика. Разрабатываемое в настоящее время Интернет-приложение позволит представителям подразделения обслуживания заказчиков отыскивать нужную книгу по всем магазинам сети, размещать заказ на нее, отсылать команды на доставку в то место, где она есть и которое ближе к покупателю.
Большой государственный университет в настоящее время(постоянно) разрабатывает приложение, которое упростит и рационализирует громоздкий процесс в университетских городках по всей стране.
Студенты будут скоро способны регистрировать для классов над Интернетом. Сначала, конечно, они будут хотеть проверять, где они стоят в терминах требований за их майоров. Затем они будут способны выбрать их ходы в течение текущего (актуального) семестра и подтверждать их регистрацию документов. С завершенным, студенты будут двигаться в другой экран, который перечисляет книги для хода, приобретение те они хотят, и упорядочение подбирать их или их поставленные. Если они хотят обвинять(наполнять) книги их счету студента, они могут делать это; или, в случае необходимости, они могут упорядочивать, чтобы переместить фонды от их банковского счета до их счета студента, чтобы покрыть приобретение.
Если имеются финансовые выдачи(проблемы) помощи, которые должны быть обработаны, они будут способны адресовать над Сетью также. Для таковых нас, кто потратили(провели), часы, ждущие в строке, чтобы регистрировать для ходов, чтобы приобрести книги, или выработать подробности наших финансовых программ помощи, значение этой новой системы немедленно очевидны.
Загрузка DLL
Прежде чем начать использование какой-либо процедуры или функции, находящейся в динамической библиотеке, вам необходимо загрузить DLL в оперативную память. Загрузка библиотеки может быть осуществлена одним из двух способов: статическая загрузка и динамическая загрузка. Оба метода имеют как преимущества, так и недостатки.
Статическая загрузка означает, что динамическая библиотека загружается автоматически при запуске на выполнение использующего ее приложения. Для того чтобы использовать такой способ загрузки, вам необходимо воспользоваться ключевым словом external при описании экспортируемой из динамической библиотеки функции или процедуры. DLL автоматически загружается при старте программы, и Вы сможете использовать любые экспортируемые из нее подпрограммы точно так же, как если бы они были описаны внутри модулей приложения. Это наиболее легкий способ использования кода, помещенного в DLL. Недостаток метода заключается в том, что если файл библиотеки, на который имеется ссылка в приложении, отсутствует, программа откажется загружаться.
Смысл динамического метода заключается в том, что вы загружаете библиотеку не при старте приложения, а в тот момент, когда вам это действительно необходимо. Сами посудите, ведь если функция, описанная в динамической библиотеке, используется только при 10% запусков программы, то совершенно нет смысла использовать статический метод загрузки. Выгрузка библиотеки из памяти в данном случае также осуществляется под вашим контролем. Еще одно преимущества такого способа загрузки DLL - это уменьшение (по понятным причинам) времени старта вашего приложения. А какие же у этого способа имеются недостатки? Основной, как мне кажется, - это то, что использование данного метода является более хлопотным, чем рассмотренная выше статическая загрузка. Сначала вам необходимо воспользоваться функцией Windows API LoadLibrary. Для получения указателя на экспортируемой процедуры или функции должна использоваться функция GetProcAddress. После завершения использования библиотеки DLL должна быть выгружена с применением FreeLibrary.
Загрузочный сектор (boot.S)
Сознательно не буду приводить листингов программ. Так станут понятней основные идеи, да и вам будет намного приятней, если все напишите своими руками.
Для начала определимся с основными константами.
START_HEAD = 0 - Головка привода, которою будем использовать.
START_TRACK = 0 - Дорожка, откуда начнем чтение.
START_SECTOR = 2 - Сектор, начиная с которого будем считывать наше ядрышко.
SYSSIZE = 10 - Размер ядра в секторах (каждый сектор содержит 512 байт)
FLOPPY_ID = 0 - Идентификатор привода. 0 - для первого, 1 - для второго
HEADS = 2 - Количество головок привода.
SECTORS = 18 - Количество дорожек на дискете. Для формата 1.44 Mb это количество равно 18.
В процессе загрузки будет происходить следующее. Загрузчик BIOS считает первый сектор дискеты, положит его по адресу 0000:0x7c00 и передаст туда управление. Мы его получим и для начала переместим себя пониже по адресу 0000:0x600, перейдем туда и спокойно продолжим работу. Собственно вся наша работа будет состоять из загрузки ядра (сектора 2 - 12 первой дорожки дискеты) по адресу 0x100:0000, переходу в защищенный режим и скачку на первые строки ядра. В связи с этим еще несколько констант:
BOOTSEG = 0x7c00 - Сюда поместит загрузочный сектор BIOS.
INITSEG = 0x600 - Сюда его переместим мы.
SYSSEG = 0x100 - А здесь приятно расположится наше ядро.
DATA_ARB = 0x92 - Определитель сегмента данных для дескриптора
CODE_ARB = 0x9A - Определитель сегмента кода для дескриптора.
Первым делом произведем перемещение самих себя в более приемлемое место. cli xor ax, ax mov ss, ax mov sp, #BOOTSEG mov si, sp mov ds, ax mov es, ax sti cld mov di, #INITSEG mov cx, #0x100 repnz movsw jmpi go, #0 ; прыжок в новое местоположение загрузочного сектора на метку go
Теперь необходимо настроить как следует сегменты для данных (es, ds) и для стека. Это конечно неприятно, что все приходится делать вручную, но что делать. Ведь нет никого в памяти компьютера, кроме нас и BIOS. go: mov ax, #0xF0 mov ss, ax mov sp, ax ; Стек разместим как 0xF0:0xF0 = 0xFF0 mov ax, #0x60 ; Сегменты для данных ES и DS зададим в 0x60 mov ds, ax mov es, ax
Наконец можно вывести победное приветствие.
Пусть мир узнает, что мы смогли загрузиться. Поскольку у нас есть все-таки еще BIOS, воспользуемся готовой функцией 0x13 прерывания 0x10. Можно конечно презреть его и написать напрямую в видеопамять, но у нас каждый байт команды на счету, а байт таких всего 512. Потратим их лучше на что-нибудь более полезное.
mov cx,#18 mov bp,#boot_msg call write_message
Функция write_message выгдядит следующим образом write_message: push bx push ax push cx push dx push cx mov ah,#0x03 ; прочитаем текущее положение курсора, дабы не выводить сообщения где попало. xor bh,bh int 0x10 pop cx mov bx,#0x0007 ; Параметры выводимых символов : видеостраница 0, аттрибут 7 (серый на черном) mov ax,#0x1301 ; Выводим строку и сдвигаем курсор. int 0x10 pop dx pop cx pop ax pop bx ret
А сообщение так
boot_msg: .byte 13,10 .ascii "Booting data ..." .byte 0
К этому времени на дисплее компьютера появится скромное "Booting data ..." . Это в принципе уже "Hello World", но давайте добьемся чуточку большего. Перейдем в защищенный режим и выведем этот "Hello" уже из программы написаной на C. Ядро 32-разрядное. Оно будет у нас размещаться отдельно от загрузочного сектора и собираться уже gcc и gas. Синтаксис ассемблера gas соответсвует требованиям AT&T, так что тут уже все проще. Но для начала нам нужно прочитать ядро. Опять воспользуемся готовой функцией 0x2 прерывания 0x13.
recalibrate: mov ah, #0 mov dl, #FLOPPY_ID int 0x13 ; производим переинициализацию дисковода. jc recalibrate call read_track ; вызов функции чтения ядра jnc next_work ; если во время чтения не произошло ничего плохого то работаем дальше bad_read: ; если чтение произошло неудачно то выводим сообщение об ошибке mov bp,#error_read_msg mov cx,7 call write_message inf1: jmp inf1 ; и уходим в бесконечный цикл. Теперь нас спасет только ручная перезагрузка
Сама функция чтения предельно простая: долго и нудно заполняем параметры, а затем одним махом считываем ядро. Усложнения начнуться, когда ядро перестанет помещаться в 17 секторах ( то есть 8.5 kb), но это пока только в будущем, а пока вполне достаточно такого молниеносного чтения.
read_track: pusha push es push ds mov di, #SYSSEG ; Определяем mov es, di ; адрес буфера для данных xor bx, bx mov ch, #START_TRACK ;дорожка 0 mov cl, #START_SECTOR ;начиная с сектора 2 mov dl, #FLOPPY_ID mov dh, #START_HEAD mov ah, #2 mov al, #SYSSIZE ;считать 10 секторов int 0x13 pop ds pop es popa ret
Вот и все. Ядро успешно прочитано и можно вывести еще одно радостное сообщение на экран.
next_work: call kill_motor ; останавливаем привод дисковода mov bp,#load_msg ; выводим сообщение mov cx,#4 call write_message
Вот содержимое сообщения
load_msg: .ascii "done" .byte 0
А вот функция остановки двигателя привода.
kill_motor: push dx push ax mov dx,#0x3f2 xor al,al out dx,al pop ax pop dx ret
На данный момент на экране выведено "Booting data ...done" и лампочка привода флоппи-дисков погашена. Все затихли и готовы к смертельному номеру - прыжку в защищенный режим. Для начала надо включить адресную линию A20. Это в точности означает, что мы будем использовать 32-разрядную адресацию к данным.
mov al, #0xD1 ; команда записи для 8042 out #0x64, al mov al, #0xDF ; включить A20 out #0x60, al
Выведем предупреждающее сообщение, о том, что переходим в защищенный режим. Пусть все знают, какие мы важные.
protected_mode: mov bp,#loadp_msg mov cx,#25 call write_message
(Сообщение:
loadp_msg: .byte 13,10 .ascii "Go to protected mode..." .byte 0 )
Пока еще у нас жив BIOS, запомним позицию курсора и сохраним ее в известном месте ( 0000:0x8000 ). Ядро позже заберет все данные и будет их использовать для вывода на экран победного сообщения.
save_cursor: mov ah,#0x03 ; читаем текущую позицию курсора xor bh,bh int 0x10 seg cs mov [0x8000],dx ;сохраняем в специальном тайнике
Теперь внимание, запрещаем прерывания (нечего отвлекаться во время такой работы) и загружаем таблицу дескрипторов
cli lgdt GDT_DESCRIPTOR ; загружаем описатель таблицы дескрипторов.
У нас таблица дескрипторов состоит из трех описателей: Нулевой (всегда должен присутствовать), сегмента кода и сегмента данных
.align 4 .word 0 GDT_DESCRIPTOR: .word 3 * 8 - 1 ; размер таблицы дескрипторов .long 0x600 + GDT ; местоположение таблицы дескрипторов .align 2 GDT: .long 0, 0 ; Номер 0: пустой дескриптор .word 0xFFFF, 0 ; Номер 8: дескриптор кода .byte 0, CODE_ARB, 0xC0, 0 .word 0xFFFF, 0 ; Номер 0x10: дескриптор данных .byte 0, DATA_ARB, 0xCF, 0
Переход в защищенный режим может происходить минимум двумя способами, но обе ОС , выбранные нами для примера (Linux и Thix) используют для совместимости с 286 процессором команду lmsw.Мы будем действовать тем же способом
mov ax, #1 lmsw ax ; прощай реальный режим. Мы теперь находимся в защищенном режиме. jmpi 0x1000, 8 ; Затяжной прыжок на 32-разрядное ядро.
Вот и вся работа загрузочного сектора - немало, но и немного. Теперь мы попрощаемся с ним и направимся к ядру. В конце ассемблерного файла полезно добавить следующую инструкцию.
.org 511 end_boot: .byte 0
В результате скомпилированный код будет занимать ровно 512 байт, что очень удобно для подготовки образа загрузочного диска.
в рамках статьи изложить все
Конечно, в рамках статьи изложить все особенности продукта и технологии невозможно. Мы рассказали об архитектуре, затронули стратегические вопросы архитектуры клиент-сервер, и показали на примерах, как можно строить приложения различного типа при помощи достаточно необычного подхода к архитектуре клиент-сервер. Но лучше один раз увидеть, чем сто раз услышать. Компания Epsylon Technologies в то время, когда писалась статья, планировала выпустить 5 версий сервера Baikonur. Самый младший, Baikonur Free Web App Server, предназначается для бесплатного ознакомления с продуктом и представляет из себя полнофункциональный сервер, правда, с ограниченной нагрузочной способностью. Его можно без ограничений загрузить с корпоративного сервера компании Epsylon Technologies. Добро пожаловать в новые технологии!
Автор не претендует на полноту изложения материала по проблеме конфигурационного управления. Данная статья — попытка показать, продемонстрировать мощные возможности как CMM, так и в их совместном использовании для улучшения качества выпускаемого ПО. В следующей части статьи будет более подробно рассказано о настройке и конфигурации программных продуктов , и в соответствии с Key Process Area. Также планируется осветить вопросы, присланные автору на В работе над статьей автор активно пользовался материалами с сайтов: (корпоративный сайт Rational) (сайт для клиентов Rational) (все материалы по CMM)
Решения, обеспечивающие взаимодействие между распределенными компонентами в рамках одной прикладной системы, (например клиент-серверное решение от одного разработчика) чаще всего не обеспечивают взаимодействия между различными прикладными системами, особенно если это взаимодействие не было спланировано еще на этапе разработки. Именно в возможностях поддержки межсистемной интеграции заключается особая ценность систем передачи сообщений. Использование ПО, предоставляемого системами очередей сообщений в качестве асинхронного механизма для организации взаимодействия между программами позволяет создать унифицированную транспортную шину для транзакционных и информационных вычислительных систем различного масштаба. При создании информационной инфраструктуры в России с ее географической протяженностью и множеством часовых поясов весьма актуально, а порой жизненно необходимо использовать системы очередей сообщений.
Мы сравнили две платформы: Java/AWT/Swing и C++/Qt, оценив их пригодность для эффективной разработки высокопроизводительных приложений с пользовательским графическим интерфейсом. В то время, как Java-платформа обеспечивает разработчикам сравнимую продуктивность программирования, платформа C++/Qt обеспечивает приложениям лучшую производительность и эффективность использования памяти. Также C++ выигрывает за счет более лучших средств разработки. Что касается сравнения GUI-библиотек, Swing и Qt, то видно, что более худшая производительность Java-программ делает платформу Java/Swing менее подходящей для разработки GUI-приложений, даже при сравнимом опыте программирования. В отличие от Swing, Qt не навязывает программисту парадигму программирования Model-View-Controller, поэтому в результате Qt-программы получаются более краткими. Независимое научное исследование и полученный практический опыт эксплуатации показывают, что предпочитаемость использования Java во многих случаях чаще всего неоправданна, а комбинация C++/Qt является более лучшей. Главными причинами этого являются более низкие производительность и эффективность использования памяти в Java (особенно при использовании инструментария Swing) при такой же обеспечиваемой продуктивности программирования. Во многих выполненных нами проектах начинающие программисты осваивали быстрее Java, более опытные и профессиональные разработчики (занимающиеся проектированием приложений и реализацией критичных участков программ) достигали быстрее лучших результатов с помощью C++. Java/Swing может подойти для разработки некоторых программ, особенно если они без GUI-интерфейса или с ограниченной GUI-функциональностью. В целом, C++/Qt является более лучшим решением, в особенности для разработки GUI-приложений.
Для полноценного знакомства с продуктом Rapid Developer, конечно же, недостаточно прочитать одну или даже несколько статей. Статьи не могут заменить реальной работы с инструментарием.
Поскольку Rapid Developer - совсем новый продукт и пока еще сложно найти разработчиков, имеющих достаточный опыт работы с ним хотя бы на некотором этапе отдельного проекта, специалистами компании было предпринято использование Rapid Developer в ряде небольших пилотных проектов.
Проведенные испытания позволили более глубоко оценить возожности Rapid Developer и выявить следующие ключевые особенности этого продукта:
возможность визуальной разработки различных аспектов информационной системы, что напрямую приводит к ускорению процесса разработки и резкому снижению количества ошибок. наличие единого рабочего пространства для информационных систем, использующих различные элементы технологии J2EE. возможность быстрого развертывания информационной системы и ее тестирования в любой временной точке проекта. возможность быстрого автоматического документирования разрабатываемой информационной системы. хранение тестовых данных, предназначенных для заполнения проектируемых баз данных, прямо в проекте Rapid Developer. возможность импорта существующих наработок из других источников. огромные возможности организации взаимодействия с существующими распределенными системами, построенными по технологии J2EE.
Все это, вне всяких сомнений, значительно повышает ценность продукта и позволяет участникам проектов достичь главной цели - сделать процесс разработки более эффективным.
Трудно описать такой инструмент, как SoDA, в рамках одной статьи - данный продукт очень тесно связан с технологиями RUP и UML (ссылка на: http://www.interface.ru/fset.asp?Url=/rational/umltend.htm). Но надеюсь, что это не помешало вам оценить мощь и обоснованность использования данного инструмента, даже основываясь на стандартных шаблонах отчетов. SoDA - гибко настраиваемый продукт, имеющий собственный механизм составления отчетов по любым проектным данным. А это значит, что менеджер проекта может всего один раз сформировать шаблоны отчетов, соответствующие внутренней политике компании, и впредь пользоваться только ими. О том, как конструировать комбинированные отчеты и соотносить технологии качества CMM с технологиями RUP, читайте во второй части статьи. Подробности о SoDA и ознакомительную версию продукта можно найти на компании Rational Software Corporation. Дополнительная информация Eсли вы хотите регулярно получать новости и ссылки на свежие статьи по Rational, Oracle, Microsoft, Inprise, системам автоматизации и т.д., советую подписаться на рассылку службы Subscribe.ru
Мы рассмотрели основные черты средств активной отладки и мониторинга для распределенных систем реального времени, а также ошибки, характерные для РСРВ, и способы их обнаружения. Существующие активные отладчики играют важную роль в разработке ПО при поиске логических ошибок, предоставляя широкий набор средств, включающих поддержку исходных текстов, трассировку выполнения приложения, динамическую модификацию памяти, и.т.д. Однако они не позволяют выявлять специфические ошибки СРВ. Описанные в работе средства мониторинга имеют схожие методы сбора, обработки и представления отладочных данных. Благодаря им становится возможным локализовывать ошибки СРВ, связанные с планированием и синхронизацией. В случае РСРВ пока не существует общего подхода к отладке, поскольку ошибки, обусловленные связью, имеют разное проявление. В работе приведено описание некоторых способов отладки, позволяющих выявлять такие ошибки. Разработка универсальных методов отладки РСРВ - тема дальнейшего исследования.
В заключении хочу сказать, что руководитель среднего программного проекта является ключевой фигурой. Изъятие его из проекта или замена будет иметь катастрофические последствия и может поставить крест на многих месяцах работы целого коллектива программистов. Во время реализации проекта его руководитель должен постоянно заниматься уточнением графика работы, контролем выполнения заданий и служить дополнительным «справочным пособием» к спецификации системы, которую реализуют программисты.
Запуск Excel с поиском ячейки
Q: Как запустить Excel, чтобы оказаться на ячейке содержимое которой известно заранее?
A:Вот как я решил бы твою задачу:
' Sub GotoFixedCell:
' Делает активной ячейку, содержащую значение vVariant на
' рабочем листе sSheetName в активной рабочей книге.
'
' Note: Содержимое ячеек интерпретируется как 'значение'!
'
Public Sub GotoFixedCell(vValue As Variant, sSheetName As String)
Dim c As Range, cStart As Range, cForFind As Range
Dim i As Integer
On Error GoTo errhandle:
Set cForFind = Worksheets(sSheetName).Cells ' Диапазон поиска
With cForFind
Set c = .Find(What:=vValue, After:=ActiveCell, LookIn:=xlValues, _
LookAt:= xlРart, SearchOrder:=xlByRows,_
SearchDirection:=xlNext, MatchCase:=False)
Set cStart = c
While Not c Is Nothing
Set c = .FindNext(c)
If c.Address = cStart.Address Then
c.Select
Exit Sub
End If
Wend
End With
Exit Sub
errНandle:
MsgBox Err.Descriрtion, vbExclamation, "Error #" & Err.Number
End Sub
Нint: Достаточно выполнить этот код из макроса Auto_Oрen()!
Нint: Протестировано и отлажено в Excel'97.
ЗНАКОМСТВО С MICROSOFT COMMERCE SERVER
В настоящее время среди специалистов, занимающихся автоматизацией предприятий малого и среднего бизнеса, наблюдается повышенный интерес к системам электронной коммерции (e-commerce). Под системами e-commerce понимают системы, функционирующие в среде Интернет и направленные на автоматизацию бизнес-процессов компании в сфере организации торговли товарами или услугами через глобальную сеть.
Системы электронной коммерции условно подразделяют на системы ориентированные на конечного потребителя - business-to-customer и системы, регулирующие взаимоотношения с партнёрами по бизнесу (business-to-business), в число которых обычно входят дистрибьюторские торговые сети, склады, службы доставки и т. п.
Новый продукт компании Microsoft, о котором пойдёт речь в этой статье, является инструментом для быстрого создания комплексных программных решений для электронной коммерции. Commerce Server (CS) содержит комплекс средств, для построения business-to-customer (B2C) и business-to-business (B2B) систем.
С помощью CS можно разработать весь спектр основных подсистем, характерных для Web-проектов в области электронной коммерции: электронную витрину с подробной информацией о предлагаемых товарах базу данных с информацией о пользователях, с возможностями анализировать их предпочтения систему обработки и размещения заказов систему динамического создания персонализированных Web-страниц
Commerce Server предлагает набор подсистем, выполненных с использованием единой технологии, имеющих похожий внешний прикладной программный интерфейс и объединённых в единое готовое интегрированное решение.
Использовать CS можно только вместе с другими продуктами платформы Microsoft, в составе: MS Windows 2000 Server, MS SQL Server, MS Internet Information Server.