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 + исходники) можно получить здесь.
|
|
Rush |
Отправлено: 14.07.2004, 18:07 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 3
|
Спасибо огромное, почикал все лишнее — работает !!! Буду знать как все это делается, а то времени не хватает копаться в километровых хелпах |
|