Problem mit dem füllen eines StringGrid



  • Hallo,
    ich hätt da mal eine Frage...
    Ich habe einen Frame in dem ein StringGrid liegt welches mit Daten gefüllt werden soll die über Get-Methoden besorgt werden.
    Die Spalten-Überschriften klappen jetzt auch, aber wenn ich die Methode aufruf die die Inhalte zeichnen soll dann klappt's nicht!?
    Bekomme beim ausführen einene EA-Accessviolation, würde ja auch sagen das kein Specher reserviert ist, aber es klappt ja im Konstruktor von TFrameTable alles super... Wäre nett wenn mir jemand erklären könnte warum das so ist wie es ist und was genau ich falsch mache. (Bzw. wie's genau mit Speicher laufen muss) 😕

    Code der Klasse

    //-----------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "FrameTableU.h"
    //-----------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TFrameTable *FrameTable;
    
    //-----------------------------------------------------------------------
    //Konstruktor: Verfasser: Georg, Zweck: Beschriftet zuerst die einzelenen
    //						 Spalten. Schnittstellen: Keine
    //-----------------------------------------------------------------------
    __fastcall TFrameTable::TFrameTable(TComponent* Owner)
    	: TFrame(Owner)
    {
    	// Spalten-Überschriften eintragen:
    	for(int ilCol = 1; ilCol < Table->ColCount; ilCol++)
    	Table->Cells[0][0] = "ID";
    	Table->Cells[1][0] = "Variante";
    	Table->Cells[2][0] = "Höhe";
    	Table->Cells[3][0] = "Breite";
    	Table->Cells[4][0] = "Tiefe";
    	Table->Cells[5][0] = "Gewicht (kg)";
    }
    
    //-----------------------------------------------------------------------
    //FillList: Verfasser: Georg, Zweck: Bekommt eine Referenz der angelgten
    //					Liste und die Variablen der einzelnen Objekte aus und füllt
    //					damit die Tabelle. Schnittstellen: Keine
    //-----------------------------------------------------------------------
    void __fastcall TFrameTable::FillList( TList *_myList)
    {
    	int row = 1;
    	for( row = 1; row <= _myList->Count; row++)
    	{
    		TContainer *Container = ( TContainer *) _myList->Items[row-1];
    		int rcount = Table->RowCount; //nur zum Test. Hier kommt Fehler
    		Table->Cells[0][row-1] = IntToStr( Container->GetID( ));
    		Table->Cells[1][row-1] = IntToStr( Container->GetVariante( ));
    		Table->Cells[2][row-1] = FloatToStr( Container->GetHeight( ));
    		Table->Cells[3][row-1] = FloatToStr( Container->GetWidth( ));
    		Table->Cells[4][row-1] = FloatToStr( Container->GetDepth( ));
    		Table->Cells[5][row-1] = FloatToStr( Container->GetWeight( ));
    	}
    }
    


  • Hallo

    for( row = 1; row <= _myList->Count; row++)

    In C++ werden Arrays mit x Elementen von 0 bis x-1 indiziert. (Leider ist die VCL da nicht konzequent, bei AnsiString gilt die Delphi-Indizierung. Bei TList hingegen ist C++)

    Übrigens : was soll diese For-Schleife bezwecken?

    for(int ilCol = 1; ilCol < Table->ColCount; ilCol++)
        Table->Cells[0][0] = "ID";
        Table->Cells[1][0] = "Variante";
        Table->Cells[2][0] = "Höhe";
        Table->Cells[3][0] = "Breite";
        Table->Cells[4][0] = "Tiefe";
        Table->Cells[5][0] = "Gewicht (kg)";
    

    bis bald
    akari



  • 😉 ups, das sind noch Reste aus der "Inspiration" für die Überschriften!

    Hmm, aber in der Schleife sag ich ja durch das _myList->Count das für jedes Element in der Liste eine Zeile benutzt werden soll, oder? Die Zeile 0 laß ich weg weil diese schon durch die Überschrift belegt ist und der Rest folgt in der Schleife.
    Hab leider keinen blassen Schimmer von Delphi!

    Was ich nicht verstehe ist das ich im Konstruktor auf Table zugreifen kann aber sobald ich versuche in der FillList-Methode zuzugreifen ich die AccessViaolation bekomm!?

    Grüße
    Sascha



  • Hallo

    In C++ werden Arrays mit x Elementen von 0 bis x-1 indiziert

    Was ist daran nicht zu verstehen?

    So muß es korrekt aussehen, wenn man davon ausgeht das in der TList x Elemente sind, und in dem StringGrid x+1 Zeilen vorhanden sind, wobei die erste für die Titel reserviert ist

    for(int row = 0; row < _myList->Count; row++)
    {
      TContainer *Container = ( TContainer *) _myList->Items[row];
      int rcount = Table->RowCount; //nur zum Test. Hier kommt Fehler
      Table->Cells[0][row+1] = IntToStr( Container->GetID( ));
      Table->Cells[1][row+1] = IntToStr( Container->GetVariante( ));
      Table->Cells[2][row+1] = FloatToStr( Container->GetHeight( ));
      Table->Cells[3][row+1] = FloatToStr( Container->GetWidth( ));
      Table->Cells[4][row+1] = FloatToStr( Container->GetDepth( ));
      Table->Cells[5][row+1] = FloatToStr( Container->GetWeight( ));
    }
    

    bis bald
    akari



  • Das mit der C++ Indizierung hab ich verstanden, aber die von Deplphi kenn ich nicht! 😉
    Aber okay, jetzt hab ich das verstanden warum's vorher falsch war.

    Aber auf Table kann ich immer noch nicht zugreifen 😞 Im Debugger sind eigentlich alle Werte korekt, alerdings zeigt "this" in FillList auf NULL, das macht mich ein wenig stutzig. Ich bekomm nicht einmal die Zeile "rcount = Table->RowCount" ausgeführt...



  • Hallo

    und was sollen wir jetzt dazu sagen? in deinem Codeausschnitt ist nirgends zusehen, wo und wie Table deklariert und initialisiert wird. Außerdem ist nicht ersichtlich wo FillList aufgerufen wird. Denn wenn this NULL ist heißt das das du über einen NULL-Pointer als Form auf die Methode zugreifst.

    bis bald
    akari


Anmelden zum Antworten