QuickReport neue Seite



  • Hallo leute,

    ich erstelle einen bericht mit quickreports und 3 TQRBands (Heater, Details, Feeter), ich FÜlle den Detailbereich mit dynamscih erstellten Labels (je nach anzahl der anzuzeigenden Werte)

    jetzt werden maximal 9 angezeigt (dann is seite voll), und ich möchte das er auf der nächsten Seite ganz oben weitermacht!

    Bei mir gibt es aber immer nur eine seite

    erstellen der labels:

    DynamicArray<TQRLabel*>QLabels;
     DynamicArray<TQRLabel*>qDate;
     DynamicArray<TQRLabel*>qValue;
    
     int qlabelcount = StringGrid1->RowCount-1;
     QLabels.Length = qlabelcount;
     qDate.Length = qlabelcount;
     qValue.Length = qlabelcount;
    
     int top = 568;
     int left1 = 16;
     int left2 = 312;
     int left3 = 504;
    
     for (int i = 0;i<qlabelcount;i++)
     {
      top = top +32;
    
      QLabels[i] = new TQRLabel(Form2->QuickRep1);
      QLabels[i]->Parent = Form2->QRBand2;
      QLabels[i]->Caption = "Abruf " + IntToStr(i+1)+":";
      qDate[i] = new TQRLabel(Form2->QuickRep1);
      qDate[i]->Parent = Form2->QRBand2;
      qDate[i]->Caption = StringGrid1->Cells[1][i+1];
      qValue[i] = new TQRLabel(Form2->QuickRep1);
      qValue[i]->Parent = Form2->QRBand2;
      qValue[i]->Caption = StringGrid1->Cells[2][i+1];
    
      QLabels[i]->Top = top;
      QLabels[i]->Left=16;
      qDate[i]->Left = 312;
      qDate[i]->Top = top;
      qValue[i]->Top = top;
      qValue[i]->Left = 504;
    
      qDate[i]->Show();
      QLabels[i]->Show();
      qValue[i]->Show();
       }
    

    wie kann ich das bewerkstelligen??



  • Du darfst nicht für jede neue Datenzeile neue Labels erstellen. Du erstellst einmal die Labels für eine Datenzeile und überschreibst einfach im Ereignis OnNeedData() die Caption des Labels.



  • hm...sorry, so ganz versteh ich das nciht!

    meinst du, ich sollte meine 9 labels statisch draufsetzen, und dann immer neu überschreiben?

    erstelllt er mir da auch eine 2te seite?

    viell kannst mir mal ein beispiel geben (arbeite zum ersten mal mit qreport)



  • Du kannst die ruhig dynamisch erstellen. So wie ich es verstehe, hast Du mehrere 'Datensätze', die Du untereinander ausgeben möchtest.
    Du erstellst genau die Anzahl Labels, die Du brauchst um eine Datenzeile darzustellen. Diese befüllst Du in dem Ereignis OnNeedData mit neuen Daten (sprich: Caption neu setzen). Für jeden Durchlauf in der OnNeedData wird automatisch eine komplette neue Zeile angehängt. Auch ein Seitenumbruch geschieht dann automatisch.
    Ich hoffe es ist so etwas deutlicher. Ich hätte hier nur Beispiele für QR + Datenbank... Würde Dir nicht helfen. Aber schau Dir doch einfach mal OnNeedData an. Wenn Du den letzten 'Datensatz' ausgegeben hast, setzt Du einfach MoreData auf false.



  • sorry aber wie soll ich das machen?

    Ich möchte eben soviele Sätze wie ich sätze in einem StirngGrid habe!

    Beispiel 9 Sätze im StringGrid
    Im Grid ca. so:

    Abruf1       10.01.05       00098
    Abruf2       10.02.05       00100
    Abruf3       09.03.05       00123
    ...
    ...
    Abruf9       13.10.05       00134
    

    und so soll es auch auf dem Report sein!

    Soll ich da jetzt 3 Labels machen (1 für Abruf, 1 für Datum und eins für Menge)?

    Wie kann ich dann den nächstenm satz ausm grid lesen?

    so gehtz net

    void __fastcall TForm2::QuickRep1NeedData(TObject *Sender, bool &MoreData)
    {
    int acount = Form1->StringGrid1->RowCount-1;
    
    static int number = 1;
    if(number == acount)
     MoreData=false;
    
    QRLabel54->Caption = "Abruf " + number;
    QRLabel55->Caption = Form1->StringGrid1->Cells[1][number];
    QRLabel56->Caption = Form1->StringGrid1->Cells[2][number];
    
    number++;
    
    }
    


  • asdasdsad schrieb:

    Soll ich da jetzt 3 Labels machen (1 für Abruf, 1 für Datum und eins für Menge)?

    Ja.

    Dein Ansatz sieht prinzipiell gut aus. Was funktioniert denn nicht?



  • er gibt mir nur den ersten abruf aus (also 1 zeile)
    im grid stehen aber mehr abrufe



  • zur info:

    die 3 labels habe ich zur entwurfszeit draufgelegt, dynamisch werden keine mehr erzeugt, d.h es sind die einzigsten auf dem bericht (ausser überschriften etc)



  • Versuch es mal so:

    if(number == acount)
     MoreData=false;
    else
     MoreData=true;
    

    Offensichtlich wird MoreData, ab dem zweiten Durchlauf, mit false vorbelegt.



  • geht immernoch nciht

    hab mal zum test die static mir anzeigen lassen, also die zählt korrekt hoch, soviele einträge im grid sind!

    hm...?!

    Ein frage zum verständnis:

    Da ich ja für Abruf, Datum und Menge jeweils nur ein Label habe, ich aber eine "Tabelle" auf dem Report ausgeben möchte, wird da wirklich bei MoreDate aus den 3 labels irgendwie soviele wie ich brauche, oder wie muss ich mir das vorstellen?

    denn bei 9 säzen sind es dann ja eigentl 9*3 Labels



  • Die Labels für die Datensätze befinden sich in eine Detail-Band?

    Ich hab das eben hier ausprobiert: Ein Title-Band (für die Überschrift), Ein Colomn-Header-Band (für die Spaltenbeschriftung) und ein Detail-Band (für die einzelnen 'Datensätze'). Funktioniert wie gewünscht.


Log in to reply