Проблема с отрисовкой Stretcheable

отредактировано 05:46 Раздел: FastReport 4.0
Люди добрые, помогите кто может!
Создаю компонент-наследник 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;
}

Комментарии

  • отредактировано 05:46
    Проблема решилась.
    Потребовалось переопределить метод Diff. В руководстве разработчика о нем видимо решили не упоминать.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.