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

 
Отчет, Помогите с отчетом
Pan-SQL
Отправлено: 09.02.2005, 12:17


Не зарегистрирован







Здравствуйте! Если кто-нибудь знает решение моей задачи, подскажите, очень нужно. А задача собственно такая: мое приложение имеет две формы Form1 и Form2. Первая форма имеет таблицу (Table1) и кнопку для просмотра отчета (Button1). Вторая форма содержит отчет (QuckRep1), и компонент просмотра отчета (Preview1). При нажатии кнопки на первой форме должна открываться вторая форма которая показывает отчет в режиме просмотра. Отчет имеет событие OnPreview:

TQRPRinter* qrPrinter = dynamic_cast(Sender)
Preview1->QRPrinter=qrPrinter;

Вторая форма имеет два события OnActivate:
QuickRep1->Preview();
и OnClose():
Action=caNone;
Preview1->QRPrinter->ClosePreview(Preview1);
Preview1->QRPrinter=NULL;
Action=caFree;

Кнопка на первой форме имеет событие OnClick:

Form2->Shom();

Первый раз все проходит нормально, но при попытке просмотреть отчет второй раз происходит исключение: Access violation at address 00000000. read of address 00000000.
Заранее благодарю.
Gedeon
Отправлено: 09.02.2005, 12:37


Ветеран

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



При
CODE

Action=caFree;

У Вас уничтожается вторая форма и соответственно при попытке показать ее второй раз Вы отхватываете AV. Выход — либо не уничтожать форму, либо создавать заново перед показом и не плохо тогда ее сделать не автосоздаваемой.
Guest
Отправлено: 09.02.2005, 12:39


Не зарегистрирован







На форму 1 можно положить такой код

CODE

TForma2 *f2 = new TForma2(Application);
f2->QuckRep1->Preview();

должно работать
Pan-SQL
Отправлено: 09.02.2005, 12:48


Не зарегистрирован







На форму 1 куда? В кнопку?
Gedeon
Отправлено: 09.02.2005, 12:56


Ветеран

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



QUOTE (Pan-SQL @ 09/02/2005, 11:50)
На форму 1 куда? В кнопку?

На самом деле вот так будет достаточно
CODE

TForm2 *f2 = new TForm2(Application);
Form2->Shom(); // ?? Show();
AVC
Отправлено: 09.02.2005, 15:19


Ветеран

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



Имелось ввиду без этих глупостей OnActivate/OnClose

допустим на кнопку
CODE

TForma2 *f2 = new TForma2(Application);
// f2->QuckRep1->DataSet = Table1; // так можно добиться незивисимости от dataset

if (needPreview) f2->QuckRep1->Preview();
else f2->QuckRep1->Print();
delete f2;

Gedeon
Отправлено: 09.02.2005, 15:24


Ветеран

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



Да я то понял, вообще как-то все у автора несказанно мудрено сделано, проще надо быть biggrin.gif .
AVC
Отправлено: 09.02.2005, 15:30


Ветеран

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



QUOTE
проще надо быть biggrin.gif .

Еще бы.
Я и пытался показать автору более простой способ. В первый раз начальство дернуло — не успел нормально пост набрать.

Вернуться в Работа с базами данных в C++Builder