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