Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

Синхронизация таблиц БД   Найти похожие ветки 

 
Loginov Dmitry ©   (2006-02-16 16:47) [0]

Добрый день, мастера! Проблема следующая: имеется база данных Interbase (одна табличка), dll-библиотека и основная прога. Работа с табличкой выполняется как в dll, так и в основной программе. Т.е. и там и там имеется TDataModule с компонентами TIBDataBase, TIBSataSet, TIBDataSource, TIBTransaction.
Нужно, чтобы при перемещении по табличке в основной проге, выполнялось перемещение по такой же табличке в dll (И наоборот). Причем, при добавлении, удалении и редактировании записи (как в основной программе, так и в dll) изменения происходили синхронно.

Пока я добился только синхронного перемещения по записям. Для этого использовал метод OnAfterScroll(), однако при любых изменениях данных этот метод уже не годится (во многом благодаря тнанзакции).

Вопрос такой: можно ли установить ссылку в основной программе на набор данных, находящийся в dll (т.е. чтобы DBGrid из основной проги ссылался в итоге на набор данных в dll)? Если нет, то как еще можно осуществить сабж?


 
Desdechado ©   (2006-02-16 17:19) [1]

а зачем тебе эта "синхронизация"? любитель трудностей?

> можно ли установить ссылку в основной программе на набор данных, находящийся в dll
можно, передай через параметры функции инициализации DLL место, куда потом присвоишь этот указатель
но, имхо, лучше наоборот - датасет в основной программе (и один на EXE+DLL), а отображение можно в DLL
но все равно неявно назначение плясок...


 
Loginov Dmitry ©   (2006-02-16 18:01) [2]


> Desdechado ©   (16.02.06 17:19) [1]
>
> а зачем тебе эта "синхронизация"?


В dll я храню различные формы и процедуры, которые могут использоваться различными приложениями. Имеется таблица пациентов и дочерняя таблица посещений. Допустим, в основной проге пользователь выбирает пациента и жмет на кнопку "Снять ЭКГ". В результате вызывается форма для снятия ЭКГ, хранимая в dll. После снятия ЭКГ происходит запись сигналов ЭКГ в таблицу посещений (при этом добавляется новая запись). Далее необходимо обработать сигналы ЭКГ в основной проге - но этих сигналов в ней не видно - мешает транзакция.


> любитель трудностей?


Скорее наоборот, хочу обойти трудности, поэтому и прошу совета мастеров.


> можно, передай через параметры функции инициализации DLL
> место, куда потом присвоишь этот указатель


Нужно не любое место, а правильное место, а вот что является правильным местом - я не знаю.


> датасет в основной программе (и один на EXE+DLL), а отображение
> можно в DLL


Вот как это сделать - один датасет на EXE+DLL?

>DesWind ©   (16.02.06 17:22) [1]

>Передай в основную программу DataSource из dll.


Invalid Pointer Operation


 
Desdechado ©   (2006-02-17 12:34) [3]

как вариант, можно сделать:
1. основная прога вызывает некую функцию из DLL, в которую передает TIBDataBase
2. DLL его использует, создавая свои объекты, манипулируя с ними. Все формы в DLL - модальные. Завершение главной формы DLL выдает статус основной программе. Данные сохраняются или откатываются.
3. Основная программа на основе анализа статуса при необходимости обновляет датасеты у себя, вычитывая изменения, сделанные в DLL.


 
Desdechado ©   (2006-02-17 12:37) [4]

да, не забудь:
1. в DLL передать Application.Handle для
function MyFunc( App: HWND; db: TSQLConnection ): CARDINAL; stdcall;
var
 hOldHandle: HWND;
begin
 hOldHandle := Application.Handle;
 Application.Handle := App;
 result := ProcessData( db );
 Application.Handle := hOldHandle;
end;

2. помни, что DLL и EXE должны быть скомпилированы одной версией Delphi для корректной работы объектных ссылок


 
Loginov Dmitry ©   (2006-02-17 15:50) [5]

Да уж, похоже, что без трудностей здесь никак не обойтись :)

А можно ли проделать такой фокус: в DLL находится форма с панелькой. На панельке находится куча всяких элементов, в т.ч. и DBGrid. Можно ли данную панельку разместить на форме в основной проге. Если да, то как это сделать? (Мои попытки сводятся пока к Invalid Pointer Operation)


> 2. помни, что DLL и EXE должны быть скомпилированы одной
> версией Delphi для корректной работы объектных ссылок


А вот это дельный совет. Учтем :)


 
Desdechado ©   (2006-02-17 16:21) [6]

> Можно ли данную панельку разместить на форме в основной проге.
Наверно, можно. Передав в DLL указатель на эту форму. А зачем такие изыски?


 
Loginov Dmitry ©   (2006-02-17 18:57) [7]


> Наверно, можно. Передав в DLL указатель на эту форму.


Я тоже считал, что можно, но сколько ни пытался - ничего не выходит :(


> А зачем такие изыски?


Какие уж тут изыски. Просто проект на самом деле очень серьезный и хочется обеспечить максимальню функциональность с минимальными усилиями.


 
Desdechado ©   (2006-02-17 19:02) [8]

> ничего не выходит
Юнит с этой формой должен быть прикомпилирован к DLL.
Я уже говорил о соблюдении одинаковости описания классов. Свои формы - тоже классы.


 
Desdechado ©   (2006-02-17 19:04) [9]

и еще раз - попробуй Desdechado ©   (17.02.06 12:34) [3]
в этом случае разделяетсятолько подключение к БД, остальное независимо и легко управляемо
твой вариант вместо "максимальню функциональность с минимальными усилиями" будет "с максимальными проблемами"


 
atruhin ©   (2006-02-17 19:31) [10]

Не нужно ничего сихронизировать. В dll передаешь только ID пациента. После того как она отработала, обновляешь данные в приложении. Я писал диспетрчер событий, каждое окно может подписаться на любые события производимые с данными другими окнами (например событие обновления списка пациентов или кардиограмм), окно производящее изменения вызывает события, т.е. на этапе проектирования окна друг о друге знать не знают.
Как в IBDatabase не помню, но в fibDatabase можно передать Handle подключенного fibDatabase и тот будет использовать данное подключение.
Все взаимодействие лучше описать как интерфейс .


 
Loginov Dmitry ©   (2006-02-17 20:17) [11]


> atruhin ©   (17.02.06 19:31) [10]


Так и думал, что без гемора здесь не обойдешься :)
Похоже, придется обмениваться ключами, а что делать?

Как я понял, между основной прогой и DLL-кой вообще невозможно осуществить обмен элементов форм. Только и знает, что "Cannot assign a TFont to a TFont".


 
Desdechado ©   (2006-02-17 21:01) [12]

atruhin ©   (17.02.06 19:31) [10]
в общем то, что я и описал :)


 
API   (2006-02-17 21:14) [13]

Как я понял, между основной прогой и DLL-кой вообще невозможно осуществить обмен элементов форм

Отчего же, возможно. Навскидку, три варианта:

- WinAPI;
- COM;
- "велосипед", но его изобретать придется.

P.S. ICQ в анкете - "мертвая"?


 
Джо ©   (2006-02-17 21:17) [14]


> [11] Loginov Dmitry ©   (17.02.06 20:17)
> Как я понял, между основной прогой и DLL-кой вообще невозможно
> осуществить обмен элементов форм.
> assign a TFont to a TFont".


Разработай интерфейс взаимодействия DLL с основной программой.
Например, DLL, желающая создавать кнопки на тулбаре, должна экспортировать следующие функции:
function GetButtosCount: Integer;
function GetButtonCaption (Index: Integer): PChar;
function GetButtonBitmap (Index: Integer): HBitmap
procedure ClickButton (Index: Integer);

Основная программа, загружая DLL, вызываеи их, создавая кнопки на тулбаре с нужными надписями, картинками и т.п. и выполняя ассоциированное действие при щелчке на них.


 
Loginov Dmitry ©   (2006-02-17 21:30) [15]


> P.S. ICQ в анкете - "мертвая"?


Нет, живая. Просто аська немного выключена :)


> Джо ©   (17.02.06 21:17) [14]


Ну это понятно, но в данном случае придется подключать все необходимые модули.


 
Джо ©   (2006-02-17 21:44) [16]

> [15] Loginov Dmitry ©   (17.02.06 21:30)
> Ну это понятно, но в данном случае придется подключать все
> необходимые модули.

Не понял.


 
Loginov Dmitry ©   (2006-02-17 22:00) [17]


> Не понял.


Насколько я понял, в основной проге должен создаваться объект, допустим TButton, свойства которого в дальнейшем и будут настраиваться. Класс кнопки объявлен в каком-то модуле, поэтому его придется подключить. Подключение некоторых модулей увеличивает размер exe"шки довольно значительно - вот это и имелось ввиду в предыдущем посту.


 
API   (2006-02-17 22:11) [18]

см. TWinControl.ParentWindow


 
Джо ©   (2006-02-17 23:16) [19]

> [17] Loginov Dmitry ©   (17.02.06 22:00)

Не вижу ничего страшного в увеличении размера "экешки", тем более, если речь идеть о 50-100-200 Кб. Впрочем, не настаиваю.


 
Loginov Dmitry ©   (2006-02-17 23:20) [20]

Ну все, вроде решил проблему. Синхронизацию сделал по ключу. Если в DLL изменили или добавили запись, то делается Commit и открываются заново таблички в DLL, после чего тоже самое делается в основной проге.

Спасибо всем, кто принял участие!


 
API   (2006-02-18 00:51) [21]

открываются заново таблички в DLL, после чего тоже самое делается в основной проге

А я все размышляю, к чему все эти процессорные гигагерцы и Gigabit Ethernet?


 
Игорь Шевченко ©   (2006-02-18 01:21) [22]

Я сильно извиняюсь, но по-моему напрашивается использование run-time packages с выносом необходимого datamodule c dataset в отдельный пакет. Он точно будет один для всех и никаких cannot assing tfont to tfont не будет...


 
Loginov Dmitry ©   (2006-02-18 09:40) [23]


> выносом необходимого datamodule c dataset в отдельный пакет


??? а как это сделать?


 
REA   (2006-02-18 14:06) [24]

Если не планируется других языков, то вариант [22] будет наменее болезненным.


 
Loginov Dmitry ©   (2006-02-18 19:34) [25]


> Если не планируется других языков, то вариант [22] будет
> наменее болезненным.


В дальнейшем другие языки планируются. Приложение серьезное, и за него деньги платить будут нашей "фирме", и не малые (но пока это в отдаленной перспективе :).

А как осуществить [22] я не знаю, еще не изучил данную технологию. Где про это можно почитать?


 
Desdechado ©   (2006-02-18 19:45) [26]

runtime package - это DLL специального вида, совместимая только с Дельфи той же версии, что и EXE сделан
в ней не хранятся копии описаний классов из основной ЕХЕ, что удобно с т.з. объема и лекгости программирования, но несовместимо с другими языкамии версиями Дельфи



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.011 c
15-1140066507
КаПиБаРа
2006-02-16 08:08
2006.03.12
Школа программирования


8-1128398305
Bizquit
2005-10-04 07:58
2006.03.12
Delphi. Вывод форматированного текста на канвас.


1-1139296063
Duncan
2006-02-07 10:07
2006.03.12
Шифрование - дешифрование MD5


2-1140677728
Новочеркасский Волк
2006-02-23 09:55
2006.03.12
Перехват клавиш сервера., {TClientSocket. TServerSocket}


11-1111965539
Stals
2005-03-28 03:18
2006.03.12
Пример добавления строк с различным форматированием в RichEdit...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский