Alphabet in QuickReport drucken.....Problem!



  • Hallo!

    Ich würde gerne in meinem QuickReport ein Alphabet ausdrucken, also einzelne Bänder.

    Das Alphabet wird durch eine for-Schleife erzeugt.

    Wie schaffe ich es, dass pro Band ein Buchstabe benutzt wird.

    Kann ja als Dataset nicht meine Schleife angeben.....:-)

    Für eine kurze Hilfe wäre ich dankbar.

    Gruß

    Maik



  • Man kann mit dem QuickReport auch ohne Dataset drucken.
    Dafür ist das OnNeedData Ereignis zuständig.
    Setzte einfach in deinen Band ein QRLabel und weisse im OnNeedData den Caption
    den gewünschten Wert zu.

    Beispiel:

    void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData)
    {
      static int Row = 1; 
      AnsiString myString = "abcdefghijklmnopqrstuvwxyz";
      if (Row <= 26)
        MoreData = true;
      else
        MoreData = false;
    
      if (MoreData) {
        QRLabel1->Caption = myString[Row];
        Row++;
      }
      else
       Row = 1;
    }
    


  • Danke für die rasche Antwort, so funktionierts eigentlich auch schon ganz gut. Wollte aber eigentlich 4 Buchstaben pro Zeile haben.

    Leider häng ich hier schon wieder.

    Schöne Grüße

    Maik



  • Hallo!

    Ich habe nun versucht die Schleife zu ergänzen, leider ist das Ergebnis immer, dass dann 4 x derselbe Buchstabe pro Reihe vorkommt.

    Ich möchte ja aber 4 Buchstaben des Alphabets pro Zeile, also in Zeile 1
    A,B,C,D in Zeile 2 E,F,G,H usw.

    Kann mir da jemand weiterhelfen? ich komm sonst hier nicht weiter.

    Gruß

    Maik



  • Du musst hier ansetzen:

    if (MoreData) {
        QRLabel1->Caption = myString[Row];
        Row++;
      }
    

    Anstatt nur einen Buchstaben auszugeben, musst du halt gleich vier ausgeben und Row um vier erhöhen.

    P.S. Wenn du Beispielcode posten würdest, könnte man dir bestimmt besser helfen.



  • Ich hatte es so versucht:

    void __fastcall Tf_alphabetaufkleber_drucken::QuickRep1NeedData(
          TObject *Sender, bool &MoreData)
    {
    
      static int Row = 1;
      AnsiString myString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      if (Row <= 26)
        MoreData = true;
      else
        MoreData = false;
    
      if (MoreData) {
    
            QRLabel1->Caption = myString[Row];
        Row++;
            QRLabel2->Caption = myString[Row];
        Row++;
            QRLabel3->Caption = myString[Row];
        Row++;
            QRLabel4->Caption = myString[Row];
        Row++;
    
      }
      else
       Row = 1;
    

    Leider bricht er sofort mit einem Fehler ab.

    Auch andere Versuche sind gescheitert, weil er immer nur 2 Buchstaben geschrieben hat und dann in die nächste Zeile gesprungen ist.

    Für eine kurze Antwort wär ich dankbar

    Gruß

    Maik 😞 😞 😞



  • Die Fehlermeldung wäre jetzt auch hilfreich zu wissen.
    Ein Fehler in dem Beispielcode ist, das die Arraygrenze überschritten wird, d.h. du greifst auf myString[27] zu.



  • Die Fehlermeldung lautet:

    ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ??

    Wie kann ich das überschreiten verhindern?

    Gruß

    Maik



  • Z. B. so:

    if (Row <= 26)
       QRLabel2->Caption = myString[Row];
    

    oder so:

    AnsiString myString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ  ";
    

    ...



  • @Fincki

    Jetzt sind wir wieder am Anfang:

    if (Row <= 26) 
       QRLabel2->Caption = myString[Row];
    

    Dieser Code kommt bei mir bereits vor!

    Noch mal, was ich möchte:

    Pro Zeile 4 Buchstaben des Alphabets, solang bis das Alphabet durch ist!

    Schöne Grüße

    Maik



  • solange du 26 Buchstaben durch 4 teilen willst gibt das immer eine Überschreitung,
    also versuch einfach mal Finkis Tipp und mach an myString noch 2 Leerzeichen dran

    und denk dran: du willst was von uns, nicht wir von dir 😉



  • Ich hatte den Beitrag von Finki nicht richtig gelesen,

    aber so funktionierts.

    Vielen Dank.

    Wollte nicht unhöflich sein.

    Gruß

    Maik



  • void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData)
    {
      static int al = 0;
      TQRLabel *label[4]={QRLabel1,QRLabel2,QRLabel3,QRLabel4};
      int i;
      for(i=0;i<4;i++)
      {
          if(al+i<26) label[i]->Caption=char(65+al+i);
          else label[i]->Caption =EmptyStr;
      }
      al+=i;
      if(al<26) MoreData=true;
      else MoreData=true;
    }
    

Anmelden zum Antworten