| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Exe, dll и соединение с БД |
| Автор: Serggggg 15.6.2004, 11:23 | ||||||
| И ещё раз здравствуйте! Приключения продолжаются. Возникают все новые и новые проблемы. 1. Handle базы данных все-таки передается в dll – для этого надо в uses подключить BDE – тогда Delphi распознают тип hDBIDb. У меня есть пара обработчиков, связанных с таймером:
Без подключения в список USES модуля BDE все это работало. Теперь – ошибка. Судя по всему – при обращении к виндовой функции Time. ‘(’ expected, but ‘;’ found Вопрос следующий: Что это за глюк и как с этим бороться? 2. Как я уже сказал, в dll передается хэндлер БД. Строка вызова процедуры такая:
После этого в самой DLL внутри InitPlugin происходит присвоение глобальной переменной типа hDBIDb нашего хэндлера (дескриптора). После InitPlugin срабатывает такая функция
Интересно то, что работает только строка FComp.Query1.Database.Handle:=HDB_; Строчка FComp.Query1.DBHandle:=HDB_; выдает ошибку – нельзя присвоить что-то свойству объекта, которое ReadOnly После этого (т.к. форма MDI – после Create она сразу становится видимой) в обработчике OnShow происходит открытие запроса. Но до метода OnShow мы не добираемся – при присвоении дескриптора вылетает Access Violation…… Вопрос тот же: Что это за глюк и как с этим бороться? Огромное спасибо за внимание. Подскажите, кто знает. |
| Автор: Pakshin A. S. 15.6.2004, 12:28 |
| Свойство доступно только для чтения!!! Присваивание не покатит! Вообще: забей на dll: засунь форму в приложение, настрой связи и работай спокойно... |
| Автор: Serggggg 15.6.2004, 12:36 |
| Pakshin A. S., я бы с удовольствием, но НАДО сделать это через DLL - если бы все было так просто, я бы и не спрашивал. |
| Автор: Pakshin A. S. 15.6.2004, 12:43 |
| По-моему, нужна связь такая: Database1.DataSource -> DataSource1 <- Query1.DataSource (*Мог и ошибку написать, работаю по памяти*) Следовательно надо создать переменную DS: TDataSource; вызов процедуры ....(...DataSource1...); в процедуре YourForm.Query1.DataSource:=DS; P. S. Интересная задачка, надо будет теорию на практику переложить. Получится - выложу. Добавлено @ 12:53 Даа, давно не работал с БД, такую фигню написать. В Query заполни только DatabaseName ( тип string) В Database есть то самое DatabaseName. => выбираешь Alias, заполняешь DatabaseName и запоминаешь, передаешь в Dll, заполняешь в Query и должно заработать... и ещё Может делать отдельный коннект? |
| Автор: Serggggg 15.6.2004, 14:02 |
| Если не юзать MDI, то элементарно! В таком случае нужно передать в DLL login и password и законнектиться автоматом (в DLL компоненте TDatabase присваивается LoginPromt=False, забиваются полученные параметры login и password, а потом Connected:=True - работает, как часы). А при работе с MDI это не совсем удобно. Чтобы законнектиться, надо сделать компоненте TDatabase Create. Это возможно при создании формы. А при создании MDI-формы её уже не спрячешь. Пихать по 1 компоненту TDatabase на каждую форму, ИМХО, не совсем рационально. А по поводу передачи датасетов - сейчас буду пробовать. Спасибо. |
| Автор: Pakshin A. S. 15.6.2004, 14:18 |
| Не Сет'ы, а Имя Базы Данных в компоненте DataBase Добавлено @ 14:19 Может это одно и то же?! |
| Автор: Serggggg 15.6.2004, 15:16 |
| Именно DataBaseName предлагаешь передать? Кто-то когда-то говорил мне, что под dll выделяется другое адресное пространство, а для нормальной работы с соединением надо, чтобы было одно адресное пространство. В принципе, я полагал, что передача TScreen и TApplication эту проблему решат, но, видимо, ошибался. Короче, я в тупике. |
| Автор: Pakshin A. S. 15.6.2004, 17:17 |
| Может наладить мосты с робительским окном напрямую, ведь у MDI-формы есть "родитель", к которому можно свободно обращаться... А в родителе есть компоненты доступа к БД и т. п... Добавлено @ 17:25 Ещё идея. В DLL делаешь фенкцию с возвратом TFrom. У любой формы есть такая штука: MDIChildren[i:integer]:TFrom. Значит управлять дочерней формой можно из родительской, а самое главное - это проще! |
| Автор: Serggggg 16.6.2004, 08:14 |
| Pakshin A. S., буду весьма благодарен, если поможешь куском кода в качестве примера. А последняя твоя идея весьма неплоха. Единственное - как именно? Я первый разработаю с MDI в DLL. |
| Автор: Pakshin A. S. 16.6.2004, 10:23 | ||
Идея такова... |
| Автор: Serggggg 16.6.2004, 17:34 | ||||
| Выход из ситуации был найден. Только, правда, пришлось задействовать 2 коннекта. Если кому пригодится, буду очень рад. Итак, внутри dll объявляется переменная типа TDatabase, которая в дальнейшем коннектится с сервером и позволяет нормально работать всем запросам и таблицам, находящимся внутри dll. Привожу мой код. Если кто-то найдет более рациональное решение, поделитесь пожалуйста. EXE-файл, главный модуль.
Теперь то, что происходит внутри dll (код целиком):
Надеюсь, кому-то это поможет. |
| Автор: Pakshin A. S. 16.6.2004, 17:49 |
| Всегда рад подкинуть идейки... если что, обращайся. |
| Автор: _hunter 17.6.2004, 20:08 |
| Сорри что раньше не писал ( сесия ссылка на DataSource ( о которой я раньше писал ) -- просто параметр типа Db::TDataSource т.е. создаеш где-то DataSource ( можно и на форме ) и передаеш в dll его в dll: Query.DataSourc = DataSource ( ссылка ) должно работать |