Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.11;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.009 c
2-1314743749
Lamer6666
2011-08-31 02:35
2011.12.11
IdHttp.Post и точка


15-1313667310
Кто б сомневался
2011-08-18 15:35
2011.12.11
А на каких языках пишуться высокоресурсные 3D игры?


2-1314451245
Vladimir
2011-08-27 17:20
2011.12.11
Сколько ресурсов требуется программе


2-1314555725
Mu
2011-08-28 22:22
2011.12.11
Функция и 2 массива.


2-1314285762
brother_home
2011-08-25 19:22
2011.12.11
форматирование integer с разделением по 1000 пробелом