Pan-SQL |
Отправлено: 15.06.2005, 11:28 |
|
Не зарегистрирован
|
Здравствуйте! Нужна помощь по выводу количества страниц в отчёте. Проблема такая: приложение имеет 2 формы Form1 и Form2 соответственно. Форма Forn2 является собственным окном предварительного просмотра отчета. Она содержит следующие компоненты: непосредственно сам отчет (QuickRep1) и компонент предварительного просмотра отчета (QRPreview1)
Событие OnPreview компонента QuickRep1 выглядит следующим образом:
TQRPrinter *qrPrinter = dynamic_cast(Sender);
QRPreview1->QRPrinter=qrPrinter;
Событие OnClose формы Form2 выглядит так:
Action=caNone;
if (QRPreview1->QRPrinter)
{
QRPreview1->QRPrinter->ClosePreview(QRPreview1);
QRPreview1->QRPrinter=NULL;
}
Action=caFree;
Вторая форма открывается путем нажатия на кнопку Button1, находящуюся на форме Form1.
Ее код выглядит так:
TReportViewForm* frm = new TReportViewForm(Application);
if (!frm) return;
frm->Show();
Событие onActivate формы Form2 выглядит так:
QuickRep1->Preview();
Форма Form2 также имеет строку состояния (StstusBar1), в которую необходимо выводить информацию о текущей странице и общем количестве страниц в отчете.
Я пробовал добавлять в событие onActivate формы Form2 строку
StatusBar1->SimpleText= QRPreview1->QRPrinter->PageCount;
В строку состояния выводится ноль. Кто знает решение, подскажите. Заранее благодарю.
|
|
Guest |
Отправлено: 15.06.2005, 11:51 |
|
Не зарегистрирован
|
OnStartPage не помогает? |
|
Pan-SQL |
Отправлено: 15.06.2005, 11:54 |
|
Не зарегистрирован
|
К сожалению нет |
|
Guest |
Отправлено: 15.06.2005, 12:24 |
|
Не зарегистрирован
|
Странно, а мне помогает.
.h
private: int FCurPage;
.cpp
конструктор
FCurPage = 0;
обработчик
void __fastcall TForm2::QuickRep1StartPage(TCustomQuickRep *Sender)
{
ShowMessage(++FCurPage);
}
Предано выводит номера всех создаваемых страниц.
Или я не так понял вопрос, и нужны номера просматриваемых страниц? |
|
Pan-SQL |
Отправлено: 16.06.2005, 10:06 |
|
Не зарегистрирован
|
При открытии формы просмотра отчета в строке состояния должно выводиться "Страница (№ страницы) из (Количество страниц)" |
|
AVC |
Отправлено: 16.06.2005, 12:44 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE | При открытии формы просмотра отчета в строке состояния должно выводиться "Страница (№ страницы) из (Количество страниц)"
|
Вот так в "первом приближении" работает
CODE |
private:
int FTotalPages;
void __fastcall SetPageNumber (int value, bool isdelta = true);
//---------------------------------------------------------------------------
void __fastcall TForm2::QuickRep1StartPage(TCustomQuickRep *Sender)
{
FTotalPages++;
SetPageNumber(1, false);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Bt_StartClick(TObject *Sender)
{
FTotalPages = 0;
QuickRep1->Preview();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Bt_NextClick(TObject *S) { SetPageNumber( 1); }
void __fastcall TForm2::Bt_PrevClick(TObject *S) { SetPageNumber(-1); }
//---------------------------------------------------------------------------
void __fastcall TForm2::SetPageNumber (int value, bool isdelta)
{
int pgn = (!isdelta)? value : (QRPreview1->PageNumber + value);
if (pgn < 1) pgn = 1;
if (pgn > FTotalPages) pgn = FTotalPages;
QRPreview1->PageNumber = pgn;
StatusBar1->Panels->Items[0]->Text = AnsiString(QRPreview1->PageNumber) + " / " + AnsiString(FTotalPages);
}
//---------------------------------------------------------------------------
|
PS. Уже успел подзабыть насколько QR капризен. |
|
Pan-SQL: |
Отправлено: 27.06.2005, 21:57 |
|
Не зарегистрирован
|
CODE | void __fastcall TForm2::SetPageNumber (int value, bool isdelta)
{
int pgn = (!isdelta)? value : (QRPreview1->PageNumber + value);
if (pgn < 1) pgn = 1;
if (pgn > FTotalPages) pgn = FTotalPages;
QRPreview1->PageNumber = pgn;
StatusBar1->Panels->Items[0]->Text = AnsiString(QRPreview1->PageNumber) + " / " + AnsiString(FTotalPages);
};
|
В строку состояния выводится нормально, но при попытке вывести эту инфу внизу каждой страницы отчета (в компонент QRLabel, который находится в полосе:PageFooter ( QRLabel->Caption= AnsiString(QRPreview1->PageNumber) + " / " + AnsiString(FTotalPages);
) выводиться 1/1, при переходе на следующую страницу выводиться 2/2 и т.д. Т. е. в том месте, где должно выводиться общее количество страниц в отчете, выводится номер текущей страницы. Возможно ли решение данной проблемы? Заранее благодарен!!!!!!!
Отредактировано Георгий — 27/06/2005, 23:02 |
|
AVC |
Отправлено: 29.06.2005, 10:34 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
выводиться 1/1, при переходе на следующую страницу выводиться 2/2 и т.д. Т. е. в том месте, где должно выводиться общее количество страниц в отчете, выводится номер текущей страницы.
|
Все правильно, ведь для получения FTotalPages используется событие StartPage, а на момент заполнения QRLabel текущая страница и является последней.
QUOTE |
Возможно ли решение данной проблемы?
|
Да, на этом уровне, если использовать два прохода (сначала считаем, потом показываем). |
|
Pan-SQL |
Отправлено: 30.06.2005, 17:37 |
|
Не зарегистрирован
|
Как это реализовать, какое событие использовать? |
|
AVC |
Отправлено: 01.07.2005, 08:18 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
Как это реализовать, какое событие использовать?
|
Пока не знаю, будет время — поэкспериментирую. А лучше переходите на FastReport — удобная вещь! |
|
AVC |
Отправлено: 01.07.2005, 09:17 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Вариант решения.
Небольшая модификация моего предыдущего примера.
CODE |
private:
bool FIsPrepareMode;
//---------------------------------------------------------------------------
void __fastcall TForm2::QuickRep1StartPage(TCustomQuickRep *Sender)
{
if (FIsPrepareMode) FTotalPages++;
else SetPageNumber(1, false);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Bt_StartClick(TObject *Sender)
{
FTotalPages = 0;
try {
FIsPrepareMode = true;
QuickRep1->Prepare();
FIsPrepareMode = false;
QuickRep1->Preview();
}
catch(Exception &xcp) { ShowMessage(xcp.Message); }
SetPageNumber(1, false);
FIsPrepareMode = false;
}
//---------------------------------------------------------------------------
на рэпорте в PageFoter лежат
QRExpr1 — PAGENUMBER и
QRLabel1 с событием OnPrint
void __fastcall TForm2::QRLabel1Print(TObject *sender, AnsiString &Value)
{
Value = AnsiString(FTotalPages);
}
| |
|