Page 1 of 1

RichViewEdit problem

Posted: Tue Apr 29, 2014 10:50 am
by hacqing
1. convert TRVMarkerItemInfo to TRVTextItemInfo
i use the RichViewEdit controller in my application¡£
i use ctrl + c in word(*.docx 2007) file, ctrl + v to rve, rve can accept the TRVMarkerItemInfo item£¬
i use the following code convert TRVMarkerItemInfo to TRVTextItemInfo£¬but it result WideString is null

Code: Select all

    s = "";
    this->rve->GetListMarkerInfo(i, listNo, level, startFrom, useStartFrom);
    if (listNo >= this->rve->Style->ListStyles->Count) {
        listNo = this->rve->Style->ListStyles->Count - 1;
     }

    if (listNo >= 0) {
          listStyle = this->rve->Style->ListStyles->Items[listNo];
          if (level >= listStyle->Levels->Count) {
              level = listStyle->Levels->Count - 1;
          }

           if (level >= 0) {
               if (listStyle->Levels->Items[level]->ListType == rvlstUnicodeBullet) {
                   s = listStyle->Levels->Items[level]->FormatStringW;
               } else {
		       //use debug, run in here
                    s = WideString(TRVMarkerItemInfo(this->rve->GetItem(i)).DisplayString);
               }
           }
      }

       // result: s is ""
please tell me, how convert TRVMarkerItemInfo to TRVTextItemInfo? thanks.


2. i want iterator all items in rve and get image size:

Code: Select all

    TCustomRVItemInfo *curItemInfo = NULL;
    for (int i=0; i< this->rve->ItemCounts; i++) {
        curItemInfo = this->rve->GetItem(i);
        printf("WxH: %dx%d.\n", curItemInfo->GetImageWidth(), curItemInfo->GetImageHeight());
    }
out:
WxH: 0x0.

can you tell me, how to get to the item image size? thanks.


note: i use RichView 14.12.6 version.

thank you very much¡£

Posted: Tue Apr 29, 2014 5:55 pm
by Sergey Tkachenko
1) Your code seems to be correct, please send me a simple project showing the problem to richviewgmailcom

2) GetImageWidth() and GetImageHeight() return nonzero values only for items containing images and controls (rvsPicture, rvsHotpicture, rvsComponent, rvsBullet, rvsHotspot, and rvsListMarker, if list type is one of rvlstImageList, rvlstImageListCounter, rvlstPicture).

Posted: Wed Apr 30, 2014 1:53 am
by hacqing
i want draw all item in single line, my method is as follows:
a. get all item's size in rve.
b. calc all item's max height: maxHeight
c. sum all item's width: sumWidth
d. set rvhelper's pages size

Code: Select all

         this->rvh_->Init(this->Canvas, sumWidth);
         this->rvh_->DrawPage(1, bmp->Canvas, true, maxHeight);
    
e. convert bmp32 to png rgba, and save.

but, i cannot get item size, can you help me? thanks :D

Posted: Wed Apr 30, 2014 8:06 am
by Sergey Tkachenko
Assign rvh->RichView->WordWrap = false (before calling Init()).
Call Init with a small value as Width, then get a real width as rvh->RichView->RVData->DocumentWidth + rvh->RichView->LeftMargin+rvh->RichView->RightMargin.

Posted: Wed Apr 30, 2014 10:22 am
by hacqing
i use the following method to solve my problem:

Code: Select all

    this->rvh_->RichView->WordWrap = false;
    this->rvh_->Init(this->Canvas, smallWidth);
    while (rvh_->FormatNextPage(Height));

    int realWidth = 0, realHeight = 0;
    realWidth = this->rvh_->RichView->RVData->DocumentWidth + this->rvh_->RichView->LeftMargin + this->rvh_->RichView->RightMargin;
    realHeight = this->rvh_->RichView->RVData->DocumentHeight + this->rvh_->RichView->BottomMargin + this->rvh_->RichView->TopMargin;
    
    //correct realWidth
    imageWidth = realWidth ;
    imageHeight = realHeight;
    this->rvh_->Init(this->Canvas, imageWidth);
    while (rvh_->FormatNextPage(Height));
thanks again. :P


:cry: now, i has other problem:
a. i set rvhelper's size.
b. i can get page counts.
c. i want get current item (rve item) at page number.
can you help me? :D

Posted: Wed Apr 30, 2014 5:11 pm
by Sergey Tkachenko
Sorry, I do not understand your question about "get current item (rve item) at page number."
But you may look at the methods GetPageNo() and GetFirstItemOnPage().

Posted: Thu May 01, 2014 3:16 pm
by hacqing
GetPageNo() is right. can you give me about TRVReportHelper.GetPageNo's example?
my code: the GetPageNo() method return -1.

Code: Select all

     int nil = 0;
    int imageWidth = 52;
    int imageHeight = 29;
    bool ret = false;

    this->rvh_->RichView->Style = this->rvhStyle_;
    this->rvhStyle_->FontQuality = TFontQuality::fqNonAntialiased;
    this->rvh_->RichView->Color = Graphics::clNone;
    this->rvh_->RichView->LeftMargin = this->rve->LeftMargin;
    this->rvh_->RichView->TopMargin = this->rve->TopMargin;
    this->rvh_->RichView->RightMargin = this->rve->RightMargin;
    this->rvh_->RichView->BottomMargin = this->rve->BottomMargin;
    TMemoryStream* dataStream = new TMemoryStream;
    ret = this->rve->SaveRVFToStream(dataStream, false);
    if (ret == false) {
        Application->MessageBox(L"save rvf to stream is failed!", L"Error",
            MB_OK | MB_ICONSTOP);
        return;
    }
    else {
        dataStream->Position = 0;
    }

    this->rvh_->TransparentBackground = True;

    ret = this->rvh_->RichView->LoadRVFFromStream(dataStream);
    if (ret == false) {
        Application->MessageBox(L"Cannot Open File", L"Error",
            MB_OK | MB_ICONSTOP);
    }
    else {
        delete dataStream;
        dataStream = 0;
    }

    this->rvh_->RichView->WordWrap = false;
    this->rvh_->Init(this->Canvas, imageWidth);
    while (rvh_->FormatNextPage(Height));
    printf("page no: %d.\n", this->rvh_->GetPageNo(this->rve->RVData, this->rve->CurItemNo, 1));
    return ;
out: page no: -1.

thanks.

Posted: Thu May 01, 2014 4:49 pm
by Sergey Tkachenko
For TRVReportHelper, you must pass a location in rvh->RichView.

If documents in rve and in rvh_->RichView are identical, you can call

Code: Select all

this->rvh_->GetPageNo(this->[color=red]rvh_->RichView[/color]->RVData, 
  this->rve->CurItemNo, this->rve->OffsetInCurItem)
However, it's more complicated when the caret is in a table cell.

Posted: Sat May 03, 2014 2:48 am
by hacqing

Code: Select all

this->rvh_->GetPageNo(this->rvh_->RichView->RVData,
  this->rve->CurItemNo, this->rve->OffsetInCurItem); 
is right.

thank you very much! :lol: :D