Announcement

Collapse
No announcement yet.

StringGrid über QuickReport drucken

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • StringGrid über QuickReport drucken

    Hallo Leute,
    _
    ich gebe zu, dass mir auf diesem Gebiet die Übung fehlt. Leider fand ich über die Suche keine passende Antwort für mein Problem (vorallem in Bezug auf BCB).
    _
    Ich bin schon soweit, dass ich 2 Formulare erstellt habe. Eines mit dem StringGrid, Drucken-, Druck-Vorschau-Button usw. Und das andere mit dem QuickReport. Mit der Methode Preview() lässt sich auch schon was anzeigen. Aber leider bisher nur sie statischen Bänder Title und ColumnHeader (hier habe ich schon die Grid-Spaltentitel mit QRLabel angelegt). Das dynamische Detail-Band bleibt bisher noch leer (hier befinden sich ebenfalls QRLabels, die dynamisch wiederholt gefüllt werden sollen).
    _
    Ich weiß, dass die Übergabe der Daten aus dem StringGrid an den QRep. irgendwie mit OnDataNeed und BeforePrint funktioniert. Nur leider fehlt mir ein konkretes Beispiel. Damit ich den Vorgang verstehe und ihn auf mein Problem anwenden kann.
    _
    Ich hoffe Ihr könnt mir mit einem BCB-Beispiel helfen. Oder mir die Sache erklären.
    _
    Danke.
    _
    VG,
    Tschela Baumann

    (im Ordner QuickReport lässt sich keine Diskussion erstellen O_o)

  • #2
    Hi Tschela,
    das ist richtig!
    In BeforePrint setzt du einen Zähler auf 0. In OnDataNeed füllst du deine Labels mit den Werten der StringGrid->Cells[x][Zähler] und erhöhst am Ende von OnDataNeed den Zähler. Der Quickreport arbeitet dann so lange bis du den übergebenen Parameter MoreData auf false setzt. Z.B. MoreData = (Zähler < StringGrid->RowCount);

    Fertig!

    Bye - Pete

    Comment


    • #3
      Hi Peter,

      danke schonmal für Deine Antwort, nur hättest Du mir vielleicht auch ein kleines Anwendungs-Beispiel. z.B. wie fülle ich genau die Daten in das Detail-Band mit onNeedData (wir haben es vorher beide falsch geschrieben).

      Gruss,
      Tschel

      Comment


      • #4
        Hi Tschela,

        in deinem Detail Band müssen sich natürlcih QRLabels befinden und in OnDataNeed schreibst du dann eben jeweils QRLabel1->Caption = StringGrid->Cells[0][Zaehler], QRLabel2->Caption = StringGrid->Cells[1][Zaehler] ..... usw.

        Bye - Pete

        Comment


        • #5
          Hi Peter,

          QRLabels sind im Detail-Band schon vorhanden.

          Ich bin glaub zu blöd die Anwendung zu kapieren. Kannst du mir vielleicht ein kleines Beispiel mit der kompletten Funktion oder Event OnNeedData posten. Ich finde im ganzen Internet einfach kein BCB Beispiel dafür. Nur ein paar Delphi-Scripts aber die helfen mir auch nicht weiter:
          _
          procedure TReportForm.ReportNeedData(Sender : TObject;var MoreData : Boolean);
          begin
          MoreData:=Index < 10;
          if MoreData then begin
          Label1.Caption:=DataArray[Index].Field1;
          Label2.Caption:=DataArray[Index].Field1;
          Label3.Caption:=DataArray[Index].Field3;
          end;
          Inc(Index);
          end;
          _
          Gruss
          T

          Comment


          • #6
            Hi Tschela,
            das Delphi-Beispile ist doch prima! Das sieht in C++ ganz ähnlich aus:

            <CODE>
            void __fastcall TQRForm::QuickRepBeforePrint(TCustomQuickRep *Sender,
            bool &PrintReport)
            {
            Row = 1; // private Variable -> int Row
            }
            //--------------------------------------------------------------------------

            void __fastcall TQRForm::QuickRepNeedData(TObject *Sender, bool &MoreData)
            {
            MoreData = (Row < Main->StringGrid->RowCount);

            if (MoreData)
            { QRLabel1->Caption = Main->StringGrid->Cells[0][Row];
            QRLabel2->Caption ........ u.s.w.
            }
            Row++;
            }
            //--------------------------------------------------------------------------
            </CODE>

            ferti

            Comment


            • #7
              Hi,

              ich hoffe ich hab das einigermaßen richtig umgesetzt:
              Es gibt trotzdem noch einen Fehler, dem ich schon den ganzen Tag nicht auf die Schliche komme: [C++ Fehler] guiForm.cpp(64): E2451 Undefiniertes Symbol 'StringGrid1' in QuickRepNeedData(...)
              _
              Der Code sieht folgendermaßen aus:
              _
              class TForm1 : public TForm
              {
              friend class TPrintSheet;
              __published: // Von der IDE verwaltete Komponenten
              TButton *ButVorschau;
              TStringGrid *StringGrid1;
              void __fastcall ButVorschauClick(TObject *Sender);
              private: // Anwender-Deklarationen
              public: // Anwender-Deklarationen
              __fastcall TForm1(TComponent* Owner);
              };
              //---------------------------------------------------------------------------
              class TPrintSheet : public TQuickRep
              {
              __published:

              private:
              int Row;
              public:
              __fastcall TPrintSheet::TPrintSheet(TComponent* Owner);
              void __fastcall TPrintSheet::QuickRepBeforePrint(TCustomQuickRep *Sender, bool &PrintReport);
              void __fastcall TPrintSheet::QuickRepNeedData(TObject *Sender, bool &MoreData);
              };
              //----------------------------------------------------------------------------
              void __fastcall TPrintSheet::QuickRepBeforePrint(TCustomQuickRep *Sender, bool &PrintReport)
              {
              Row = 1; // private Variable - > int Row
              }
              //---------------------------------------------------------------------------

              void __fastcall TPrintSheet::QuickRepNeedData(TObject *Sender, bool &MoreData)
              {
              MoreData = (Row < StringGrid1->RowCount);

              if(MoreData)
              {
              PrintSheet->QRHInput1->Caption = StringGrid1->Cells[0][Row];
              }
              Row++;
              }
              //--------------------------------------------------------------------------

              Comment


              • #8
                Hab den Fehler gefunden:
                statt: StringGrid1->Cells...
                From1->StringGrid1->Cells...
                _
                Hab trozdem noch ne Frage:
                Wie mache ich das jetzt, dass das DetailBand weiterläuft. Bis jetzt ist es so, dass ich die alten Werte immer mit den neuen überschreibe. Bin also genauso weit wie vorher :-

                Comment


                • #9
                  Hi Tschela,

                  das verstehe ich nicht. Siehst du denn nur eine Zeile? Wie schaffst du es dann, die Werte jeder Zeile so schnell zu lesen ?:-)
                  Das DetailBand wird normalerweise sooft erzeugt, wie MoreData den Wert true erhält.

                  Bye - Pete

                  Comment


                  • #10
                    Ich habe ein TitleBand angelegt mit einem QRLabel als Überschrift, darunter ein ColumnHeaderBand mit Labels als Spaltenköpfe (wird nicht angezeigt) und das DetailBand (QRList). Wenn ich nun 2 mal nacheinander die Methode PrintSheet->PrintSheetNeedData(PrintSheet->QRList, PrintSheet->MoreData) aufrufe überschreibt der zweite Aufruf wieder die erste Zeile im Report, springt also nicht in die Nächste.
                    _
                    Ich verstehe eh noch nicht ganz, wie das DetailBand überhaupt wiederholt erzeugt werden kann, in der Methode PrintSheetNeedData ist ja keine Schleife oder so.
                    _
                    Bye,
                    Tschel

                    Comment


                    • #11
                      Hi Tschela,

                      schick mir doch einfach mal dein Project zu und ich schau es mir mal an.

                      Bye - Pete

                      Comment


                      • #12
                        Hi Tschela,

                        ich habe deinen Code geändert, kann ihn dir aber gerade aus irgend einem unerfindlichen Grunde nicht zurück mailen. Ich versuche es morgen von einem anderen Rechner.

                        Bye - Pete

                        Comment


                        • #13
                          Hi Peter,
                          _
                          1000 Dank für deine Hilfe, jetzt kann ich das Programm endlich abschließen.
                          _
                          Aber die Sache womit ich immernoch ein Verständnisproblem habe ist:
                          _
                          Wo werden diese Methoden aufgerufen und von wem?
                          _
                          void __fastcall QuickRepBeforePrint(TCustomQuickRep *Sender,
                          bool &PrintReport);
                          void __fastcall QuickRepNeedData(TObject Sender,
                          bool &MoreData);

                          _
                          Achja, cool das jetzt auch das ColumnHeader-Band angezeigt wird ;-)
                          _
                          Da ich sehr sehr sehr lange, nach soeinem Beispiel zu StringGrid und QuickReport gesucht habe. Hänge ich Deine Lösung an diese Antwort, für jedermann zugänglich :-)
                          _
                          VG,
                          Tschel

                          Comment


                          • #14
                            Hi Tschela,

                            wenn du bei der TQuickRep Komponente in Objekinspekor auf die Ereignisse schaust, siehst du die Events "BeforePrint" und "OnNeedData".
                            Klick die Eingabefelder einfach doppelt an und die Routinen werden dir erstellt. Damit ist auch schon klar wer sie aufruft, oder ?

                            Aber wie gesagt: Beim C++Builder unter Examples gibt es das alles in einem prima Beispiel.

                            Bye - Pete

                            Comment


                            • #15
                              Hi Peter,

                              ok danke ;-)
                              Bei den Examples hab ich bei mir nur ein DB-Beispiel gefunden. Aber jetzt klappt ja alles.

                              Du hast von einem guten Buch erzählt, verrätst du uns welches.

                              Vg,
                              Tschel

                              Comment

                              Working...
                              X