0

Cbuilder XE を使用しており、Mydac コンポーネントで Rave Report を使用したいのですが、Rave は標準の TQuery コンポーネントのみを認識し、Mydac バージョンを無視しているように思えます。

TMyQuery コンポーネントと possiby を使用して Rave レポートをフィードする方法があるかどうかお尋ねします。これは、そのようなクエリの結果の単純なリストを出力する簡単な例です。

4

2 に答える 2

1

私は Delphi でこれを行う方法しか知らないので、CBuilder に相当するものに変換する必要があります。RAVE コンポーネントに関しては、Delphi と CBuilder が同一であると確信しています。プログラムでこれを行う方法はわかりませんが、RAVE レポート デザイナーを使用すると比較的簡単です。

RAVE TRvDataSetConnection コンポーネントを使用して、TMyQuery コンポーネントをレポートにリンクします。

通常、データ モジュールに TRvDataSetConnection コンポーネントをクエリと共にドロップします。TMyQuery ごとに 1 つの 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 に答える