TQRLabel erstellt -> ändern -> zugriffsverletzung



  • tach,
    ich habe, wie aus dem titel zu erahnen, ein tqrlabel erzeugt. das passiert in einer funktion mit folgendem code (gekürzt):

    void __fastcall TQRListForm::zeichnetab()
    {
    beschriftung[0][0] = new TQRLabel(QRListForm);
    beschriftung[0][0]->Parent =QRListForm->ChildBand1;
    beschriftung[0][0]->Size->Top=oben;
    beschriftung[0][0]->Size->Left=links+textlinks;
    beschriftung[0][0]->Brush->Style=bsClear;
    beschriftung[0][0]->BringToFront();
    beschriftung[0][0]->Transparent=1;
    beschriftung[0][0]->Font->Size=schriftgroesse;
    beschriftung[0][0]->Caption=bezeichnung->Strings[0];
    }
    

    ein stück weiter oben habe ich den array ausserhalb jeder funktion definiert:

    TQRLabel *beschriftung[2][100];
    

    wenn ich jetzt per preview den report anzeigen lasse, ist alles wunderbar und es läuft wie ich es will. jetzt möchte ich die werte ändern und auch das passiert in einer funktion:

    beschriftung[0][0]->Caption="irgendetwas";
    

    und an dieser stelle sagt er mir, dass ich ihn mal kann.



  • anmelden hilft fehler zu verbessern...
    es wäre nett, wenn mir jemand sagen könnte, wie ich es schaffen kann, die werte zu ändern.
    viel dank schon mal,
    klaus



  • emanreztuneb schrieb:

    beschriftung[0][0]->Caption="irgendetwas";
    

    und an dieser stelle sagt er mir, dass ich ihn mal kann.

    Sagt er das tatsächlich bei der Übergabe von "irgendwas" oder vielmehr bei der Übergabe von bezeichnung->Strings[0]? Wenn letzteres dann wird die entsprechende StringList zu der Zeit wohl (noch) nicht existieren.



  • nein.
    wenn ich zeichnetab() aufrufe, zeigt er die elemente an. nur wenn ich anschliessend noch mal versuche, etwas zu ändern, gibt es die zugriffsverletzung.
    ich weiß nicht, ob es etwas an der sache ändert, aber zeichnetab() wird von einer anderen form aufgerufen.



  • ich habe jetzt noch mal versucht, etwas daran zu ändern, um zu einem esseren ergebnis zu kommen, aber war nicht:
    erstens die definition:

    TQRShape *verline[6];
    TQRShape *horline[110];
    TQRLabel *beschriftung[2][300];
    

    Dann erstelle ich die Objekte:

    //---------------------------------------------------------------------------
    __fastcall TQRListForm::TQRListForm(TComponent* Owner)
            : TForm(Owner)
    {
    for(int i=0;i<300;i++)
    {
    beschriftung[0][0] = new TQRLabel(QRListForm);
    beschriftung[1][0] = new TQRLabel(QRListForm);
    };
    for(int i=0;i<6;i++)
    {
    verline[i] = new TQRShape(TQRListForm);
    };
    for(int i=0;i<110;i++)
    {
    horline[i] = new TQRShape(TQRListForm);
    };
    
    }
    //---------------------------------------------------------------------------
    

    und jetzt kommt der spassige teil, den ich nicht verstehe:
    ich habe wieder meine funktion, die zum ersten mal die werte setzt und in dieser funktion habe ich eine for-schleife und an der hängt er sich auf.

    //beschriftung[0][0] = new TQRLabel(Form);
    beschriftung[0][0]->Parent =QRListForm->ChildBand1;
    beschriftung[0][0]->Size->Top=oben;
    beschriftung[0][0]->Size->Left=links+textlinks;
    beschriftung[0][0]->Brush->Style=bsClear;
    beschriftung[0][0]->BringToFront();
    beschriftung[0][0]->Transparent=1;
    beschriftung[0][0]->Font->Size=schriftgroesse;
    beschriftung[0][0]->Caption=bezeichnung->Strings[0];
    
    //horline[1] = new TQRShape(Form);
    horline[1]->Parent = QRListForm->ChildBand1;
    horline[1]->Size->Width=zellenbreite1+zellenbreite2;
    horline[1]->Size->Height=linienbreite;
    horline[1]->Size->Top=oben+zellenhoehe;
    horline[1]->Size->Left=links;
    horline[1]->Shape=qrsHorLine;
    
    for(int i=1;i<bezeichnung->Count && i<51 ;i++)
    {
    //        beschriftung[0][o] = new TQRLabel(Form);
            beschriftung[0][i]->Parent = QRListForm->ChildBand1; // Wenn ich die funktion ausführen lasse, kommt die alte zugriffsverletzung und er markiert mir diese zeile. 
            beschriftung[0][i]->Size->Top=oben+(i*zellenhoehe);
            beschriftung[0][i]->Size->Left=links+textlinks;
            beschriftung[0][i]->Brush->Style=bsClear;
            beschriftung[0][i]->BringToFront();
            beschriftung[0][i]->Transparent=1;
            beschriftung[0][i]->Font->Size=schriftgroesse;
            beschriftung[0][i]->Caption=bezeichnung->Strings[i];
    

    Habe ich bei der Definition irgendetwas falsch gemacht? Was muss ich tun?
    Bitte helft mir!
    Es fängt langsam an, mich irre zu machen!



  • Sieh dir mal die for-Schleife zur Erstellung der QRLabel-Objekte an.
    Warum zählst du i hoch, wenn du es doch nicht verwendest. 😉



  • Ich habe in der Schleife jede Menge stehen und vergessen, sie hier abzuschliessen, aber prinzipiell endet sie natürlich erst nach dem block. und darin verwende ich doch ausgiebig is.

    for(int i=1;i<bezeichnung->Count && i<51 ;i++) 
    { 
            beschriftung[0][i]->Parent = QRListForm->ChildBand1; // Wenn ich die funktion ausführen lasse, kommt die alte zugriffsverletzung und er markiert mir diese zeile.  
            beschriftung[0][i]->Size->Top=oben+(i*zellenhoehe); 
            beschriftung[0][i]->Size->Left=links+textlinks; 
            beschriftung[0][i]->Brush->Style=bsClear; 
            beschriftung[0][i]->BringToFront(); 
            beschriftung[0][i]->Transparent=1; 
            beschriftung[0][i]->Font->Size=schriftgroesse; 
            beschriftung[0][i]->Caption=bezeichnung->Strings[i];
    }
    


  • Jansen schrieb:

    die for-Schleife zur Erstellung der QRLabel-Objekte



  • das tat weh! Aua!
    Jansen, wenn ich groß bin, möchte ich sein wie du!
    Verzeih bitte, dass ich deine Zeit dafür in Anspruch genommen habe.
    Vielen Dank!



  • Was ich noch hinzufügen wollte:
    Falls jemand auf diesen Beitrag stossen sollte, weil er vorhat, per Quickreport eine Tabelle zu zeichnen, möchteich ihm einen Tipp geben.
    Lass es! Nur Scherereien. Ich muss zugeben, dass ich aufgrund des Threads nicht besonders helle wirke, aber ich habe lange am Code gearbeitet und er funktionierte auch, gehorchte aber den Gesetzen der Quantenmechanik.
    Ich wollte die Werte in der Tabelle ändern und beim ersten Mal lief es auch perfekt, aber beim zweiten Mal nicht mehr. Soll heißen, dass ich es per preview habe anzeigen lassen und beim zweiten mal zog er alle einträge zusammen, sodass sie unlesbar wurden. Wenn ich jedoch nach der ersten Änderung es nicht anzeigen, sondern erst die Änderungen beliebig oft durchführen liess, führte er auch diese einwandfrei aus und zerstückelte es erst wieder beim zweiten anzeigen nach abermaliger änderung.
    Ich habe es jetzt über den Zwischenschritt einer html-Datei gelöst, die ich über den cppwebbrowser drucken lasse.
    mfg,
    emanreztuneb


Anmelden zum Antworten