C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
DLL — Quick Report — BDE, Помогите кто сможет !!!
Rush
Отправлено: 13.07.2004, 22:04


Ученик-кочегар

Группа: Участник
Сообщений: 3



Написал прогу по учету компьютерной и оргтехники для предприятия где работаю (предложения по использванию одной из многих уже написанных программ по этой теме просьба не присылать, т.к. моя программа работает так как мне надо и по максимуму автоматизирует мою конкретную работу, в том числе и бумажную). Программе необходимо создавать различные отчеты (к примеру quick report). Я хочу оформить каждый отчет в виде подключаемой в runtime-е dll (вот такой бзик снизошел), причем возможно-ли передавать в функцию dll-ки, формирующую отчет, указатель на используемую в проге таблицу для формирования данных этого отчета. Теперь собственно просьба:
дать пример исходника dll на C++Builder-е с одной экспортируемой функцией, формирующей Quick Report.
AVC
Отправлено: 14.07.2004, 08:38


Ветеран

Группа: Модератор
Сообщений: 1583



Мой совет — переходите на FastReport — макет отчета можно хранить как во внешнем файле, так и в поле БД, загружать простыми функциями, редактировать и создавать новые прямо из клентского приложения.
Если настаиваете именно на QuickReport, сообщите — пришлю пример (сечас нет под рукой, надо искать по старым проектам).
Rush
Отправлено: 14.07.2004, 08:51


Ученик-кочегар

Группа: Участник
Сообщений: 3



QUOTE (AVC @ 14/07/2004, 09:40)
Если настаиваете именно на QuickReport, сообщите — пришлю пример (сечас нет под рукой, надо искать по старым проектам).

У меня есть и FastReport и Rave, но есть потребность сделать именно через DLL (просто с DLL-ками не работал вообще никогда, надо когда начать), так что если есть возможность, пришлите плиз примечик. Заранее благодарен !!!
AVC
Отправлено: 14.07.2004, 09:14


Ветеран

Группа: Модератор
Сообщений: 1583



Если "по-быстрому" — недавно на этом форуме обсуждалась тема по работе с dll, посмотрите её. Приложению все равно — это форма или report, так что приёмы те же.
Пример выложу позже.
AVC
Отправлено: 14.07.2004, 09:59


Ветеран

Группа: Модератор
Сообщений: 1583



Тема обсуждалась здесь
AVC
Отправлено: 14.07.2004, 16:09


Ветеран

Группа: Модератор
Сообщений: 1583



Еще не расхотелось использовать QuickReport? Тогда пример (кусок кода BCB5)
CODE

void __fastcall TForm1::Bt_QRTestClick(TObject *Sender)
{
AnsiString str = OpenDll->FileName;
if (str.IsEmpty()) OpenDll->InitialDir = ExtractFilePath(Application->ExeName);
if (!OpenDll->Execute()) return;
QReport_FromDLL(OpenDll->FileName);
}

//---------------------------------------------------------------------------

#include "QR_Print.h"
typedef TQuickRep* __fastcall    TGetQuickRep_bpl (bool);
typedef __declspec(dllimport) TQuickRep* TGetQuickRep_dll (bool);

//- — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - -
// *AVC 26.09.2002
// Так как все точки входа называются одинаково
// GetQuickRep можно использовать только в подгружаемых библиотеках
// библиотека обязательно должна быть выгружена после использования
//
// *AVC 14.07.2004
// Перечень runtime bpl у загружаемого отчета должен быть подмножеством
// переченя runtime packages у приложения
//- — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - -

PACKAGE void __fastcall QReport_FromDLL (const AnsiString& pLibName, TDataSet *pDS)
{
AnsiString lname = pLibName.Trim().UpperCase();
if (lname.IsEmpty()) return;

AnsiString ltype = ExtractFileExt(lname);
if (ltype.Length() > 1 && ltype[1] == '.') ltype = ltype.SubString(2,100);

int    hlib;
int    funadr;
AnsiString  funname;
bool   libisdll;
if  (ltype == "DLL") { libisdll = true; funname = "_GetQuickRep";  }
else if (ltype == "BPL") { libisdll = false; funname = "@GetQuickRep$qqro"; }
else
{
ShowMessage("Неизвестный тип библиотеки " + ltype);
return;
}


if (libisdll) hlib = (int)LoadLibrary(lname.c_str());
else   hlib = (int)LoadPackage(lname);
if (hlib <= 32)
{ int err = (int)GetLastError();
AnsiString text ="Error: LoadLibrary " + lname + "\r\n" + AnsiString(err) + ": ";
AnsiString str = AnsiString::StringOfChar(' ', 250);
FormatMessage(
 FORMAT_MESSAGE_FROM_SYSTEM,
 NULL,
 err,
 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
 str.c_str(),
 str.Length(),
 NULL
);
text += str.Trim();

throw Exception(text);
}

funadr = (int)GetProcAddress((HMODULE)(hlib), funname.c_str());

if (!funadr)
{ if (libisdll) FreeLibrary  (HMODULE(hlib));
else   UnloadPackage(HINST(hlib));
throw Exception("Error: GetProcAddress('" + funname + "')");
}

try {
TQuickRep *QRep;
if (libisdll) QRep = ((TGetQuickRep_dll*)funadr)(true);
else   QRep = ((TGetQuickRep_bpl*)funadr)(true);
if (QRep)
{ QRep->DataSet = pDS;
QR_Print(QRep);
}
}
__finally
{ // destroy
if (libisdll)
 { ((TGetQuickRep_dll*)funadr)(false);
 FreeLibrary  (HMODULE(hlib));
 }
else
 { ((TGetQuickRep_bpl*)funadr)(false);
 UnloadPackage(HINST(hlib));
 }
}

}



Полный действующий пример (exe + исходники) можно получить здесь.

User Attached Image Скачать файл
QREP.ARJ


Rush
Отправлено: 14.07.2004, 18:07


Ученик-кочегар

Группа: Участник
Сообщений: 3



Спасибо огромное, почикал все лишнее — работает !!! Буду знать как все это делается, а то времени не хватает копаться в километровых хелпах biggrin.gif

Вернуться в Вопросы программирования в C++Builder