![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
В вопросе есть работа с бд, но сам вопрос сам по сути - о взаимодействии с dll. Потому в этом разделе.
Не так давно начал делать приложения с вызовом dll, в которой есть форма. Возникла проблема. У меня в главном приложении - есть DBGrid, в котором отображаются данные из бд baza.mdb. На главной форме есть кнопка Вызов - которая отображает форму из dll. Также на главной форме есть еще кнопки 2: удалить и добавить. Они добавляют или удаляют записи в бд. В форме из dll - есть тоже DBGrid и две кнопки удалить и добавить. Так вот вопрос: как сделать так чтобы в обоих этих DBGrid одновременно отображалась информация? Т.е. - я открыл форму из dll и удалил в ней запись - тогда информация также мгновенно должна обновиться в DBGrid на главной форме. И наоборот - я открыл форму в dll и удаляю запись через главную форму - тут же должна обновится информация и в открытой форме dll в DBGrid... Прикрепляю сделанные проекты. Mainn.dpr - проект главного приложения libr.dpr - проект dll Unit1.pas- модуль формы dll Примечание: ADOConnection.Caonnected и ADOTale1.Active в проекте в инспекторе объектов поставлены в значение false. Они активизируются при событии form1.Activate. Это сообщение отредактировал(а) Teleport - 7.12.2008, 17:01 Присоединённый файл ( Кол-во скачиваний: 20 )
dll_parametrs_ADO.rar 27,16 Kb |
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Teleport, ну... возможно глупая затея, но:
Может быть сделать 2 сообщения, одно на удаление записи, а другое на добавление. И соответственно слать друг дружке такие сообщения и выполнять соответствующие действия? |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
В библиотеке тоже создай подключение (ADOConnection и т.д.) и при вызове передавай из вызывающего приложения в библиотеку параметры подключения.
Добавлено через 1 минуту и 54 секунды Т.е. работай, как будто из двух разных приложений. |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
2 THandle - наверное, не глупая затея. Подробней мне нужно объяснить на моем примере?...
2 Akella - в библиотеке все создано! сразу создал. И что только из этого?? обновления-то не происходит одновременно... Как эти параметры подключения передать? Это сообщение отредактировал(а) Teleport - 7.12.2008, 17:38 |
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Teleport, покажу просто пример. Можно вообще использовать любой тип оповещения в принципе-то.
Пример с сообщениями в аттаче. Присоединённый файл ( Кол-во скачиваний: 30 )
Exumpel.rar 443,99 Kb |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
2 THandle - А вот в этих строках что такое 1001 и 1003?
|
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Teleport, цифры
Это номера сообщений. http://msdn.microsoft.com/en-us/library/ms644927(VS.85).aspx
|
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
THandle, да ему полностью нужно учить сообщения винды и работа с dll, что толку, что мы напишем ему сейчас примеры, он же всё равно не поймёт в них ничего.
Добавлено через 3 минуты и 50 секунд Как, как? А как ты что-то передаёшь в dll, так же и строку подключения передай! |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
тему считаю закрытой
|
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
|
||||
|
|||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
||||
|
||||
| Akella |
|
||||||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
думал, что по названиям догадаетесь.
Из вызывающего приложения порядок вызова процедур плагина
Каждый плагин создаёт в главном меню вызывающего приложения свой новый пункт меню. Через этот пункт меню можно вызвать главную форму плагина Создаём новый пункт меню:
Это сообщение отредактировал(а) Akella - 7.12.2008, 20:46 |
||||||||
|
|||||||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
2 THandle - не решил и решу не скоро.
Akella прав, мне эти примеры ни о чем просто. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Читай, как работать с плагинами. Я по-моему взял из DRKB, точно не помню.
|
|||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
Могу еще посоветовать экспортировать функции из *.exe , т.е. использовать exe как dll, для того чтобы функции нормально экспортировались из exe, их нужно поместить в *.dpr файл. Ну и вызывать нужные тебе функции в *.exe из dll.
Это сообщение отредактировал(а) lukas - 10.12.2008, 20:41 -------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
2 lukas - вот смотри, я тут немного освоил экспорт функций из dll. Вобщем если в моем основном приложении вызвать dll форму и нажать в этой форме Button3 - то изменение переменной произойдет одновременно и в dll и в основном приложении! Только вот никак не могу додуматься - как передать обновления DBGrid? Я думаю, что нужно передавать ADOTable1.Close и ADOTable1.Open - только вот как в моем примере их передать?
Присоединённый файл ( Кол-во скачиваний: 13 )
ADO_dll_parametrs.rar 28,73 Kb |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
lukas, прошу, не стоит давать таких советов, грязнее метода и нет наверное
Teleport, посмотрел аттач и ужаснулся. Брутфорс, и то с грубыми ошибками... Тебе же THandle предложил по сообщениям обновление организовать, это приемлемый и удобный метод. Чем не устраивает? Хотя THandle обучен еще одному эффективному методу решения подобных задач, придет, ответит |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
2 Rrader - подробнее насчет ошибок
Жду ответа. |
|||
|
||||
| Rrader |
|
||||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Передача объекта - небезопасна.
Передача строки String (наверняка у тебя это AnsiString) - еще более небезопасная затея. Темы избитые, статьи можно читать разные - "Тонкости работы со строками" и "Строки в Delphi" |
||||
|
|||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
читаю про строки...
|
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
я немного разобрался с примером, который мне дал Thandle. И присоединил его к своей программе с бд. Все работает, но не совсем так как надо - обновления в DBGrid-ах запаздывают. Т.е. далеко не с первого клика происходят обновления. Прошу рассмотреть мой проект и сказать, как исправить чтобы обновления были с первого клика по кнопке.
Mainn.dpr - проект главного приложения libr.dpr - проект dll Unit1.pas- модуль формы dll Присоединённый файл ( Кол-во скачиваний: 14 )
dll_parametrs_pop_ADO_wm.rar 27,81 Kb |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
проблема актуальна. Сообщения, как я понял, проходят сразу, а вот DBGrid - не обновляется сразу. Запаздыает обновления до следующего нажатия кнопки. :( в чем проблема не пойму... Какой совет может дадите? исходнике в посте выше.... :( :(
|
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Вот примерчик связи с помощью интерфейсов(в аттаче). Обновляется не сразу думаю потому, что это дело связано уже с базами данных) То есть все выполняется, Close|Open делается, но обновления не происходит. Teleport, тут уже копать в свойства базиальных компонентов... Присоединённый файл ( Кол-во скачиваний: 41 )
Interfaces.rar 63,05 Kb |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
2 THandle - спасибо за пример, скачал, разбираюсь. Работает. Обновляется не сразу, причем я думаю, что это дело не в самих бд... Просто вот смотри - когда с сообщениями работали - твой пример тоже, то там ведь ShowMessage - тоже невсегда с первого раза выскакивали? Все же думаю, что тут проблема в технологии передачи... Не утверждаю, конечно, но думаю, что именно так.
А за интерфейсы отдельное спасибо - пытаюсь разобраться. Про с пример с сообщениями почти все понятно. Спасибо. Пытаюсь, пока безуспешно, найти решение для обновления моментального... |
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Teleport, а ты во время отладки библиотеки посмотри - каждый ли раз срабатывает нужное действие. То есть отлаживай саму библиотеку.
|
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
хм...
Как я увижу-то каждый или некаждый раз? |
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Teleport, открываешь проект библиотеки.
В Project Options, Dubugger, ставишь в Host Application нашу программу (mainn.exe или как там её). Дальше на строки:
(это в методе TExuDllInterface.Release) ставишь брякпойнты. Дальше запускаешь все это дело(Run or F9) Жмешь "Вызов". А дальше жмешь в окне программы кнопки удалить/добавить и смотришь, заходит ли в код, на котором стоят бряки. |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
спасибо, пробую))
|
|||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
Teleport, ну правильно, если ты один и тот же используешь unit и в длл и в exe, это вообще небезопасно, и не известно к каким результатам это приведет.
Rrader, не знаю я пользуюсь, просто не нужно злоупотреблять таким способом. Сообщения вообще встают в очередь, а тут напрямую выполнение функции из exe. Главное знать где находиться exe, а загрузить функцию из exe можно также как и длл. Вообщем у меня еще проблем не возникало. Если могут возникнуть какие -нибудь проблемы, напишите тогда о них... мне самому интересно будет. -------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
lukas, для этого придуманы интерфейсы. Затрудняюсь назвать хотя бы одно преимущество в связи EXE и DLL через экспорт из EXE по сравнению с интерфейсами. Ненужное наследство от PE-файлов
|
|||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
Rrader, а разве интерфейсы не работают в разы медленнее...?
-------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
lukas, хотелось бы услышать обоснование
|
|||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
Rrader, я конечно профессионально не смогу объяснить, но если мне не изменяет память, то перед вызовом метода интерефейса происходит куча операций, т.к. программа даже не знает куда она обращается, а при вызове функции из dll или же из exe мы один раз находим адрес функции и используем ее в дальнейшем.
-------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Функция интерфейса вызывается также как обычная виртуальная функция, т.е. просто косвенный вызов. Фактически 2е операции 1я получение адреса по фиксированному смещению в таблице VMT интерфейса и переход по этому адресу. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Rrader |
|
||||||||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Alexeis, +1
Посмотрим, что же происходит.... Пишем библитоеку следующего содержания:
Здесь используются два вида связи - через экспорт и через интерфейс. Теперь пишем приложение, которое будет их вызывать.
Прямой вызов ExportFunc:
Вызов DoIt:
Это сообщение отредактировал(а) Rrader - 25.12.2008, 14:53 |
||||||||
|
|||||||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
Alexeis, вопрос, этот адрес вычисляется каждый раз при вызове или как то кешируется (запоминается)?
Я просто может что-то не понимаю, но как вычисляется адрес в dll функции, он вычисляется по названию 1 раз, т.е. мы нашли адрес (допустим через GetProcAddress() ), а далее при вызове мы его уже не ищем. -------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
lukas, вычисляется на лету, в этом и суть динамического связывания. Тебе что жалко одной операции сложения?
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
Вывод, вобщем, один - передача через интерфейсы. Правильно понял?
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |