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

Вниз

DataSet+DLL+Connection   Найти похожие ветки 

 
delpfir   (2011-08-11 10:52) [0]

Здравствуйте уважаемые.

Как в DLL передать указатель на соединение с БД, при условии, что Application общий.

В общем как работать с DataSet который находится в DLL, а Connection в основном приложении.

Спасибо.


 
Ega23 ©   (2011-08-11 11:02) [1]

Передавай ConnectionString и открывай свой экземпляр коннекта.


 
OW ©   (2011-08-11 11:19) [2]


> Как в DLL передать указатель на соединение с БД

как передать integer знаете?
далее MyConnection = TConnection(переданное)


 
delpfir   (2011-08-11 12:21) [3]


> Ega23 ©   (11.08.11 11:02) [1]
> Передавай ConnectionString и открывай свой экземпляр коннекта.
>


А так целесообразно вообще, просто форма логин на нее еще конекшин, как то не хотелось бы...


> OW ©   (11.08.11 11:19) [2]
>
> > Как в DLL передать указатель на соединение с БД
>
> как передать integer знаете?
> далее MyConnection = TConnection(переданное)


Integer(MyConnect) -> conn

-> DllConnect := TConnect(conn);

?


 
OW ©   (2011-08-11 12:34) [4]

делал так

msg: Tmessage;

DllConn := TSession(Pointer(Msg.LParam));


 
Ega23 ©   (2011-08-11 12:44) [5]


> А так целесообразно вообще, просто форма логин на нее еще
> конекшин, как то не хотелось бы...


Если вопрос в целесообразности, то тогда целесообразно форму подключить к проекту и не парить себе мозги с dll.


 
Dennis I. Komarov ©   (2011-08-11 13:02) [6]

И почему все любят "хотеть странного"?


 
OW ©   (2011-08-11 13:05) [7]

т.е.
Главная всем своим dll шлет message
for i = 0,dllattachcount-1
SendMessage(RegisterDll[i].MainHandle, SEND_CONNECT, 0, Integer(MyConnect));

ну и все юзают один модуль
Const
 BASIC = WM_USER + $200;
 SEND_HANDLE_PLUGIN = BASIC + $01;
..

и что-то далее такое в каждой главной форме в длл
 if (TMessage(Message).Msg >= BASIC) and (TMessage(Message).Msg <= LAST) then
 begin
   case TMessage(Message).Msg of
//-----------------------------------------------------------------------
     SEND_CONNECT:
       begin
          if INeedConnect then
            DllConn := TSession(Pointer(Msg.LParam));
       end;
     SELECT_ADDRESS:
       begin
=============================

еще смешнее можно передавать так
 TSubjectFor = record
   ID: Cardinal;
   IsNew: Boolean;
   IsJur: Boolean;
   Name: string;
   H: Cardinal;
 end;
 TContract = record
   H: THandle;
   IdContract: Integer;
   CNumber: string;
   DateBegin: TDateTime;
   DateEnd: TDateTime;
   Agent: TAgent;
   Subject: TSubjectFor;
 end;
 TMsgContract = packed record
   Msg: LongInt;
   Contract: TContract;
 end;

и передаём
var
 Msg: TMsgContract;
begin
 MSG.Msg := ESBD_SELECT_CONTRACT;
 Msg.Contract.H := ForThisHWNDSelect;
 Msg.Contract.IdContract := oqBase.FieldByName("ID_CONTRACT").AsInteger;
 Msg.Contract.CNumber := oqBase.FieldByName("CNUMBER").AsString;
 Msg.Contract.DateBegin := oqBase.FieldByName("DATE_BEGIN").AsDateTime;
 Msg.Contract.DateEnd := oqBase.FieldByName("DATE_END").AsDateTime;
 Msg.Contract.Agent.ID_AGENT := oqBase.FieldByName("ID_AGENT").AsInteger;
 Msg.Contract.Agent.AName := oqBase.FieldByName("ANAME").AsString;
 Msg.Contract.Subject.ID :=  oqBase.FieldByName("ID_SUBJECT").AsInteger;
 Msg.Contract.Subject.Name := oqBase.FieldByName("SNAME").AsString;
 MainForm.Send(MSG);

и ловим
 if (TMessage(Message).Msg >= ESBD_BASIC) and (TMessage(Message).Msg <= ESBD_LAST) then
 begin
   case TMessage(Message).Msg of
     ESBD_SELECT_CONTRACT:
       begin
         if FINeedContract then
              InitPriceByContract(TMsgContract(Message).Contract);
       end;

...

     else inherited;
   end;
 end else
 inherited;
--
фактически передаём всегда integer
а интерпретирует его получатель уже так как надо.

ну, как-то так, в общем :)


 
Inovet ©   (2011-08-11 13:18) [8]

> [7] OW ©   (11.08.11 13:05)

А чем хуже в ДЛЛ функцию предусмотреть SetConnection?


 
tesseract ©   (2011-08-11 13:21) [9]


> И почему все любят "хотеть странного"?


Самоучителей начитаются, а логика пока не работает.


 
OW ©   (2011-08-11 13:26) [10]

>> Inovet ©   (11.08.11 13:18) [8]
да ничем не хуже.

Просто так мы всем dll шлем все.
Мы не переписываем dll если она не знает какое-либо сообщение и что с ним делать. Она его просто проигнорирует.
А иначе мы должны проверить, есть ли dll функция SetConnection.

Как только мы разработаем новую dll у нее можем ввести некую реакцию на некое сообщение. Например, сменился X.
Остальные dll ничего не знают про X, но мы вынуждены делать getprocaddr для всех.. чтоб выяснить, а не нужно ли ему SetX сделать.
А так мы ничего не трогаем, просто пуляем всем. Кому надо - обработает.


 
delpfir   (2011-08-12 10:52) [11]


> OW ©   (11.08.11 13:05) [7]


))) нифига, не когда бы не подумал ... ппц


 
OW ©   (2011-08-12 11:28) [12]

:)
ИМХО
монолитный exe все равно лучше.
Только так теперь и делаю. Каналы у всех широкие пошли, ничего страшного.
Зато проблем ГОРАЗДО меньше.


 
OW ©   (2011-08-12 11:43) [13]

а так моделька вполне ничего, передаем все что хотим. Это понятно.
Если что модуль захочет чего - передает главному окну мессагу, главное эту мессагу веером по всем.
Кому адресовано - либо главному ответит, либо напрямую спрашивальщику, если предусмотрен handle обратной связи в сообщении.
А если ответ главному - Главное ответ опять веером всем.
Кто не знает о чем речь - молчит/игнорит. Ну а если даже не он спрашивал или не ему ответ, но ему тоже интересно - может и отреагировать как-то.

Данный подход стырен и немного перепилен у Мельникова Петра aka StarWind.
Не думаю, что он тут бывает, но спасибо все равно :)

пока не вижу проколов в таком подходе.


 
_Юрий   (2011-08-12 19:29) [14]


> как передать integer знаете?
> далее MyConnection = TConnection(переданное)


При сборке без пакетов так делать нельзя.
Если не хотите поиметь "мистических" проблем в случайных местах. Прямой путь к порче памяти. Хотя прямо сейчас вроде работает.


 
sniknik ©   (2011-08-12 21:32) [15]

> Самоучителей начитаются, а логика пока не работает.
самовредителей.


 
delpfir   (2011-08-15 09:01) [16]

Хочу одну кнопку, при нажатии которой все бы работало. Поделитесь исходным кодом.


 
delpfir   (2011-08-15 10:00) [17]

Хочу кнопку "бабло".


 
KSergey ©   (2011-08-16 11:55) [18]

> delpfir   (15.08.11 10:00) [17]
> Хочу кнопку "бабло".

Обратитесь на форекс-форумы, там таких кнопок вагонами: и за деньги продают, и бесплатно иногда раздают.


 
KSergey ©   (2011-08-16 11:56) [19]

А DataSet какой? обычный или ADO?
Для ADO есть свой трюк


 
delpfir   (2011-08-18 13:24) [20]


> KSergey ©   (16.08.11 11:56) [19]
> А DataSet какой? обычный или ADO?
> Для ADO есть свой трюк


ADO


 
delpfir   (2011-08-19 08:02) [21]


> Для ADO есть свой трюк

Какой, а если bpl использовать RTI вроде как одно, так проще?



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

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

Наверх





Память: 0.5 MB
Время: 0.005 c
15-1314337996
DelphiN!
2011-08-26 09:53
2011.12.11
Безопасность в Windows 7


2-1314256395
Gevs
2011-08-25 11:13
2011.12.11
DBGrid


1-1276603042
AIV2104
2010-06-15 15:57
2011.12.11
DCPcrypt для Delphi 7 и 2009 не ставиться из-за rtl.bcp


2-1314263285
Константин
2011-08-25 13:08
2011.12.11
Возможно ли создать массив с именем в процессе выполнения пр...?


2-1313982989
Konstantin
2011-08-22 07:16
2011.12.11
DCOMConnection





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский