Проблема с отрисовкой Stretcheable
Люди добрые, помогите кто может!
Создаю компонент-наследник TfrxStretcheable, в нем есть поля FMemo и FPartMemo (как в MemoView).
Переопределила методы CalcHeight, InitPart, DrawPart, Draw.
Если содержимое помещается на одну страницу, то все отрисовывается нормально. Но если содержимое разрывается и переносится на другую страницу, возникает проблема: отрабатывает CalcHeight, затем IntiPart.
Далее вызывается DrawPart, где я присваиваю FMemo ту часть, которую следует вывести, остальное - в FPartMemo, возвращаю высоту оставшейся части. Вроде бы все как описано в документации, но когда доходит до метода Draw, в оба части выводится полный текст из FMemo, а не только нужная часть.
Идеи закончились, требуется помощь.
Создаю компонент-наследник TfrxStretcheable, в нем есть поля FMemo и FPartMemo (как в MemoView).
Переопределила методы CalcHeight, InitPart, DrawPart, Draw.
Если содержимое помещается на одну страницу, то все отрисовывается нормально. Но если содержимое разрывается и переносится на другую страницу, возникает проблема: отрабатывает CalcHeight, затем IntiPart.
Далее вызывается DrawPart, где я присваиваю FMemo ту часть, которую следует вывести, остальное - в FPartMemo, возвращаю высоту оставшейся части. Вроде бы все как описано в документации, но когда доходит до метода Draw, в оба части выводится полный текст из FMemo, а не только нужная часть.
Идеи закончились, требуется помощь.
#include "macro.h"
//---------------------------------------------------------------------------
__fastcall frxMacroPDF::frxMacroPDF(Classes::TComponent* AOwner) : TfrxStretcheable(AOwner)
{
StretchMode = smActualHeight;
FMemo = new TStringList();
FMemo->Text = "1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n0\r\n";
Font->Name = "Arial";
Font->Size = 10;
}
//---------------------------------------------------------------------------
void __fastcall frxMacroPDF::Draw(Graphics::TCanvas* Canvas, System::Extended ScaleX, System::Extended ScaleY, System::Extended OffsetX, System::Extended OffsetY)
{
Graphics::TBitmap *FBMP = new Graphics::TBitmap();
TCanvas *bmp_canvas = FBMP->Canvas;
BeginDraw(Canvas,ScaleX,ScaleY,OffsetX,OffsetY);
bmp_canvas->Font->Assign(Font);
int w = FDX;
int h = -Font->Height*FMemo->Count;
FBMP->SetSize(w,h);
DrawBackground();
int y = 0;
for (int i=0; i < FMemo->Count; i++)
{ bmp_canvas->TextOutA(0,y,FMemo->Strings[i]);
y += bmp_canvas->TextHeight(FMemo->Strings[i]);
}
Canvas->StretchDraw(Rect(FX,FY,FX1,FY1),FBMP);
DrawFrame();
}
//---------------------------------------------------------------------------
System::Extended __fastcall frxMacroPDF::CalcHeight(void)
{
return FMemo->Count*(-1)*Font->Height;
}
//---------------------------------------------------------------------------
System::Extended __fastcall frxMacroPDF::DrawPart(void)
{
BeginDraw(NULL,1,1,0,0);
int h = -Font->Height;
int n = FDY/h;
FMemo->Clear();
for (int i = 0; i < n; i++)
{ int pos = FPartMemo.Pos("\r\n");
if (pos > 0)
{ FMemo->Add(FPartMemo.SubString(1,pos-1));
FPartMemo.Delete(1,pos+1);
}
else
{ FMemo->Add(FPartMemo);
FPartMemo = "";
return 0;
}
}
TStringList *temp = new TStringList();
temp->Text = FPartMemo;
int rest = temp->Count;
delete temp;
return rest*h;
}
//---------------------------------------------------------------------------
void __fastcall frxMacroPDF::InitPart(void)
{
FPartMemo = FMemo->Text;
}
//---------------------------------------------------------------------------
__fastcall frxMacroPDF::~frxMacroPDF()
{
delete FMemo;
}
//---------------------------------------------------------------------------
void __fastcall frxMacroPDF::BeforePrint(void)
{
FTempStr = FMemo->Text;
}
//---------------------------------------------------------------------------
void __fastcall frxMacroPDF::AfterPrint(void)
{
FMemo->Text = FTempStr;
}
Комментарии
Потребовалось переопределить метод Diff. В руководстве разработчика о нем видимо решили не упоминать.