0

我正在使用 Cbuilder XE,我想将 Rave Report 与 Mydac 组件一起使用,但在我看来,Rave 只识别标准 TQuery 组件并忽略 Mydac 版本。

我会问你是否有一种方法可以使用 TMyQuery 组件和 possiby 提供 Rave 报告,这是一个简单的示例,它打印此类查询结果的普通列表。

4

2 回答 2

1

我只知道如何在 Delphi 中执行此操作,因此您必须将其转换为 CBuilder 等价物。我很确定 Delphi 和 CBuilder 在 RAVE 组件方面是相同的。我不知道如何以编程方式执行此操作,但使用 RAVE 报表设计器相对容易。

我使用 RAVE TRvDataSetConnection 组件将 TMyQuery 组件链接到报告。

您通常将 TRvDataSetConnection 组件连同您的查询一起放在数据模块上 - 每个 TMyQuery 一个 TRvDataSetConnection。您必须将所有 SQL 字段添加到您的 TMyQuery 组件中,以使字段名称显示在报表设计器中。您可以通过打开 TMyQuery 的字段编辑器并点击 ^F 来自动执行此操作。如果您有与 MySQL 服务器的有效连接,则这些字段将填写并分配正确的数据类型。

接下来,在 RAVE 报表设计器中创建一个新数据对象并选择直接数据视图项。将 DataView 连接到数据模块中的 RvDataSetConnections。现在您可以访问 TMyQuery 的所有字段。您将 RAVE 设计器中的 DataView 链接到要在其中显示查询内容的报表带区。

B 计划是购买和安装 FastReports。RAVE 很糟糕 :-)

于 2012-12-21T20:35:05.820 回答
0

我自己使用 Rave 作为通用打印实用程序的方法

void __fastcall TFormMain::Action_ReportExecute(TObject * Sender)
{
    __try
    {
        Screen->Cursor = crHourGlass;
        int maxrow     = 0;
        RvSystem1->Execute();
    }
    __finally
    {
        Screen->Cursor = crDefault;
    }
}

RvSystem1Print :是 RvSystem 组件的 onPrint 事件我无法在运行时构建它,因此我必须为每个需要打印实用程序的表单添加一个组件

void __fastcall TFormMain::RvSystem1Print(TObject * Sender)
{
    int maxrow = 0;
    String Fun = "[FormMain::RvSystem1Prin] ";
    try
    {
        RvSystem1->SystemPreview->FormWidth  = ( Screen->Width > 900 ) ? 900 : Screen->Width ;
        RvSystem1->SystemPreview->FormHeight = Screen->Height * 0.9;
        TBaseReport * report                 = (TBaseReport*) Sender;
        UtilClientPmv::DBGridToRaveReport(DBGrid1, report, maxrow);
    }
    catch (Exception & ex)
    {
        Mylog(Fun + Sysutils::Format("ERROR=[%s] ", ARRAYOFCONST((ex.Message))));
    }
}

DBGridToRaveReport:扫描并打印链接到 dbgrid 的表中的所有记录(包括图像)

int __fastcall UtilClientPmv::DBGridToRaveReport(TDBGrid * grid, TBaseReport * report, int maxrow)
{
    String Fun         = "[UtilClientPmv::DBGridToRaveReport] ";
    TMWTable * mwTable = NULL;
    int iret           = IRET_OK;

    try
    {
        mwTable = (TMWTable*) grid->DataSource->DataSet;
        iret    = MWTableToRaveReport(mwTable, report, maxrow);
    }
    catch (Exception & ex)
    {
        Util::mylog(Fun + Sysutils::Format("ERROR=[%s] ", ARRAYOFCONST((ex.Message))));
    }
    return iret;
}

MWTableToRaveReport:扫描并打印表格中的所有记录(包括图像)

int __fastcall UtilClientPmv::MWTableToRaveReport(TMWTable * mwTable, TBaseReport * report, int maxrow)
{
    String fldName, fldValue, smsg, Fun = "[UtilClientPmv::MWTableToRaveReport] ";
    int tot_row, tot_fld, tot_rec, iret = IRET_OK;
    double x, y, y2, rpos, pgWidth;
    TField * fld = NULL;
    TBookmark bkMark;    // TBookmark == TByteDynArray
    Graphics::TBitmap * bitmap = NULL;

    try
    {
        if (maxrow == 0)
        {
            maxrow = 1000;
        }

        __try
        {
            if (mwTable->Active == false)
            {
                mwTable->Active = true;
            }
            tot_row = mwTable->Data->RecordCount;
            if (tot_row < 0)
            {
                throw Exception("RecordCount in Null");
            }
            if (tot_row > maxrow)
            {
                tot_row = maxrow;
            }

            report->StatusFormat = "Page %d";
            report->Units = unMM;
            pgWidth       = report->PageWidth;

            mwTable->DisableControls();
            bkMark = mwTable->GetBookmark();

            tot_fld = mwTable->FieldCount;
            tot_rec = mwTable->RecordCount;

            int irow = 1, icol;

            mwTable->First();

            report->SetFont("Courier New", 10);
            report->PrintCenter("Report PmvManager", pgWidth / 2);
            report->NewLine();
            report->SetTab(10, pjLeft, 160, 0, 0, 0);

            while (!mwTable->Eof)
            {
                smsg = Sysutils::Format("Record %03d / %03d", ARRAYOFCONST((irow, tot_row)));
                report->PrintTab(smsg);
                report->NewLine();

                for (int icol = 0; icol < tot_fld; icol++)
                {
                    String NumberFormat, strValue;
                    fld     = mwTable->Fields->Fields[icol];
                    fldName = fld->DisplayName;

                    // int lnum = report->LineNum;
                    int lleft = report->LinesLeft();
                    if (lleft == 0)
                    {
                        report->NewPage();
                    }
                    if (fld->DataType == ftBlob)
                    {
                        smsg = Sysutils::Format("%30s : ", ARRAYOFCONST((fldName)));
                        report->PrintTab(smsg);
                        x = report->XPos;
                        y = report->YPos;
                        if (!fld->IsNull)
                        {

                            bitmap = new Graphics::TBitmap();
                            __try
                            {
                                TGraphicField * gFld = (TGraphicField*)fld;
                                if (gFld)
                                {
                                    TMemoryStream * memStream = new TMemoryStream();
                                    __try
                                    {
                                        gFld->SaveToStream(memStream);
                                        if (memStream->Size > 1)
                                        {
                                            memStream->Seek(0, soFromBeginning);
                                            bitmap->LoadFromStream(memStream);
                                            report->PrintBitmapRect(x, y - 3, x + 12, y + 9, bitmap);
                                        }
                                        report->NewLine();
                                        report->NewLine();
                                    }
                                    __finally
                                    {
                                        delete memStream;
                                        memStream = 0;
                                    }
                                }
                            }
                            __finally
                            {
                                delete bitmap;
                                bitmap = 0;
                            }
                        }
                    }
                    else
                    {
                        fldValue = fld->AsString;
                        smsg     = Sysutils::Format("%30s : %s ", ARRAYOFCONST((fldName, fldValue)));
                        report->PrintTab(smsg);
                    }
                    report->NewLine();
                }
                irow++;
                mwTable->Next();

                x = report->XPos;
                y = report->YPos;
                report->MoveTo(2, y);
                report->LineTo(pgWidth - 4, y);
                report->MoveTo(x, y);

                report->NewLine();
                report->NewPara();
            }
        }
        __finally
        {
            mwTable->GotoBookmark(bkMark);
            mwTable->EnableControls();
            mwTable->FreeBookmark(bkMark);
        }

    }
    catch (Exception & ex)
    {
        Util::mylog(Fun + Sysutils::Format("ERROR=[%s] ", ARRAYOFCONST((ex.Message))));
    }
    return iret;

} // __________   UtilClientPmv::MWTableToRaveReport
于 2013-01-09T07:35:03.020 回答