Форум: "Прочее";
Текущий архив: 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