|
||||||||
|
Вопросы и ответы о Delphi.
1.После того, как я использовал правый щелчок мыши для создания
функции-провайдера, как мне снова выполнить команду контекстного меню
"Export from Table"? Q>: A>: Как только Вы экспортировали интерфейс провайдера, эта команда контекстного меню перестает быть видимой. Чтобы снова включить ее, Вы должны удалить ассоциированное свойство в Редакторе Библиотеки Типов, и затем нажать кнопку обновления информации в Редакторе Библиотеки Типов (Type Library Editors Refresh button). Вы могли бы также удалить точку вхождения "Get_XXX" в исходном тексте RemoteDataModule. Q>: Как я могу избавиться от "зарегистрированного" имени сервера, если я не хочу использовать его далее?A>: Запустите исполняемый файл сервера с ключом /UNREGSERVER: MYSERVER.EXE /UNREGSERVER Это обычный путь разрегистрации саморегистрирующего сервера автоматизации OLE. Q>: Как осуществить минимальный тест на корректность глобального идентификатора (GUID), и интерфейсы, унаследованные от IDispatch (и, следовательно, поддерживающих методы автоматизации)?A>:
Вызовите CreateRemoteComObject, передав GUID интерфейса и имя компьютера, к
которому Вы пытаетесь подключиться. Если функция вернет ошибку, то наличествует
проблема сервера, иначе возможная проблема относится к клиенту.
Q>: Почему мои ISAPI-ориентированные библиотеки, созданные в Delphi 3, не могут обрабатывать несколько соединений?A>:
Волшебник по созданию ISAPI DLL в Delphi 3 создает полностью безопасную
многопоточную библиотеку, но не выставляет флаг, говорящий приложению,
что эта библиотека в этом отношении безопасна.
Это легко исправить, просто добавив строчку: Q>: Как я могу выбрать на клиента только часть данных с определенной позиции из набора данных на сервере?A>: Наиболее приемлемым является использование TQuery и Provider.SetParams. Но также Вы можете сделать это иначе: Сперва на клиенте Вам нужно считать с сервера только метаданные для набора данных. Это можно сделать, установив PacketRecords в 0, и затем вызвав Open. Затем Вы должны вызвать метод сервера (Вы должны определить этот метод на сервере), который спозиционирует курсор на первую нужную запись. И, наконец, установите PacketRecords в нужное значение, большее нуля, и вызовите GetNextPacket. Q>: Когда я применяю ApplyApdates на ClientDataSet, на серверной стороне не срабатывает событие OnNewRecord для оригинального набора данных. Как это исправить?A>: Никак. Эти обновления идут прямо через BDE, а не через компонент набора данных. Как обычно, можно посоветовать использование хранимых процедур, в данном контекте это будут методы сервера приложений. К сожалению, совет неприемлем для транспорта Sockets. Q>: В чем разница между сокетами, DCOM и ELE Enterprise при использовании их в качестве транспорта?A>: Sockets (TCP/IP): - на клиентах и сервере требуется наличие стека TCP/IP; - не требуется дополнительной настройки клиентов; DCOM: - на клиентах и серверах требуется наличие DCOM (входит в состав Windows NT 4.0, для Windows'95 доступен как опция) - требуется настройка клиентов (DCOM Configuration Utility - DCOMCNFG.EXE); - встроенная поддержка модели безопасности Windows NT; - поддержка обратных вызовов (методов). OLE Enterprise: - на клиентах и серверах требуется наличие OLE Enterprise; - требуется настройка клиентов; - поддержка обратных вызовов (методов). Q>: Предположим, что пользователь изменил строковое поле в Null. Как тогда я в обработчике OnUpdateData смогу определить, изменилось ли это поле на строку Null, или поле просто не было изменено?A>:
Используйте свойство NewValue класса TField при чтении второй записи
(той, которая содержит изменения). Если возвращаемое значение (variant)
пуст или неназначен, тогда поле не было модифицировано.
Здесь немного иллюстрирующего кода: Q>: Что я получаю от наличия ConstraintBroker (брокера ограничений)?A>: ConstraintBroker позволяет Вам включать проверки на ограничения в данные. Это означает, что когда Вы запрашиваете данные, Вы получаете правила. Эти правила автоматически без дополнительного кода входят в силу Поскольку это происходит без единой строчки кода, то Вам не требуется переписывать или обновлять приложение каждый раз при изменении правил. Фактически это простое решение задачи обновления клиентского приложения без выхода из него. Каждое приложение, использующее ConstraintBroker, автоматически получает это качество. Q>: Нужны ли мне формы в сервере приложений?A>:
Да. Необязательно, чтобы они были видимы, но должна присутствовать хотя бы одна.
Чтобы сделать главную форму невидимой, установите Q>: Как достучаться до методов сервера приложений из TClientDataSet?A>:
Вот так: Q>: Я включил dbclient.dll в секцию "additional files" опций распространения по web, но этот файл никогда не загружается на клиент. Как это исправить?A>:
Ваш INF-файл должен включать в себя строки наподобие: Q>: Как я могу определить доступные сервера приложений на этой машине через Registry?A>:
Прочитайте ключ под HKEY_CLASSES_ROOT\CLSID\*, просматривая его насчет
ключей, которые имеют подключ "Borland DataBroker".
Эти вхождения и являются серверами приложений.
Ниже пример, который загружает имена доступных серверов приложений в Listbox: Q>: Как передать UserName и Password в удаленный модуль данных (remote datamodule)?A>:
В Удаленный Модуль Данных бросьте компонент TDatabase, затем добавьте процедуру
автоматизации (пункт главного меню Edit | Add To Interface) для Login.
Убедитесь, что свойство HandleShared компонента TDatabase установлено в True.
Q>: Как можно использовать TClientDataSet в локальном приложении с таблицами Paradox, без использования компонент TProvider и TRemoteServer?A>:
Вы не сможете отделаться от Провайдера (хотя бросать его на форму/модуль
данных не придется), но Вы сможете использовать TClientDataSet
в одно-точечном (single-tier) приложении. Для того, чтобы открыть
Client DataSet, Вы должны назначить Провайдера Данных вручную.
Q>: Как работать с новыми, своими интерфейсами в RemoteDateModule?A>:
В редакторе библиотеки типов (typelib) Вы можете добавить свои
интерфейсы и сделать их членами оригинального coClass.
После этого Вы можете обращаться к этим интерфейсам,
используя следующий синтаксис:
| |||||||||
За содержание страницы отвечает Гончарова М.Н. © Кафедра СПиКБ, 2002-2017 |