Shagg |
Отправлено: 10.12.2006, 09:10 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 69
|
Всем привет!!! У меня есть dll'ка, в которой хранятся все отчетные формы. Вот функция, которая экспортируется из длл:
CODE | extern "C"
{
__declspec(dllexport) void ShowRep(Classes::TComponent *AOwner, AnsiString RepName, TDateTime Date)
{
TReportForm *f = new TReportForm(AOwner);
f->showrep(RepName, Date);
delete f;
}
} |
А эта функция собственно выводит отчет:
CODE | void __fastcall TReportForm::showrep(AnsiString repname, TDateTime Date)
{
TQuickRep *rep;
if ((rep = dynamic_cast<TQuickRep*>(FindChildControl(repname))) == NULL)
return;
ADOQuery1->Active = false;
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->AddStrings(rep->Description);
int pos;
AnsiString dt = FormatDateTime("mm.dd.yyyy hh:nn", Date);
AnsiString str;
for (int i=0; i<ADOQuery1->SQL->Count; i++)
{
str = ADOQuery1->SQL->Strings[i];
while ((pos = str.AnsiPos("<date>")) > 0)
{
str.Delete(pos, 6);
str.Insert("'"+dt+"'", pos);
}
ADOQuery1->SQL->Strings[i] = str;
}
ADOQuery1->Active = true;
rep->Preview();
}
|
В свойстве Description кажлого QuickReport'а хранится шаблон запроса.
Проблема в том, что при закрытии Preview'а вываливается AV. Но, если поставить после строки "f->showrep(RepName, Date);" ShowMessage ничего подобного не происходит. Кто нибудь с подобным встречался? и как с этим бороться??? |
|
olegenty |
Отправлено: 10.12.2006, 11:43 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
1. явно укажи стандарт вызова как в самой DLL, так и при получении указателя на функцию в DLL (__stdcall, __fastcall, __cdecl, __pascal) — это для уверенности, что стек правильно чистится после вызова функции
2. разбор "полёта" с — детский лепет, существуют параметрические запросы, так вот именно ими и надо пользоваться
3. ADOQuery1 остаётся открытым. зачем? (я вижу, что он закроется при удалении формы, которое тут же и последует, однако не во всех случаях бывает именно так, и лучше писать универсальный правильный код)
внешне ошибки не видно
|
|
Romikgy |
Отправлено: 10.12.2006, 13:26 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
Измени этот вызов
__declspec(dllexport) void ShowRep(Classes::TComponent *AOwner, AnsiString RepName, TDateTime Date)
на что то типа
__declspec(dllexport) void ShowRep(Classes::TComponent *AOwner, char * RepName, TDateTime Date)
PS да и вообще пытайся в dll передавать ссылки а не сами объекты , имхо
Отредактировано Romikgy — 10.12.2006, 13:27 |
|
Shagg |
Отправлено: 11.12.2006, 17:54 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 69
|
Всем спасибо. Заработало |
|
|