StringGrid RowCound setzen



  • Hallo,

    weiß Jemand, wie man den RowCount vom Stringgrid per Variable setzen kann?

    Bei einen direkten Schreiben in das StringGrid->RowCount kommt eine Fehlermeldung.



  • Ja.



  • Helf einen Anfänger mal bitte.

    Wie geht das?



  • Was für eine Fehlermeldung kommt dann?

    Zeig doch mal Programm- Code, wie du die Eigenschaft StringGrid->RowCount beschreibst.



  • Wenn ich die Zeile "StringGrid1->RowCount = list -> Count+1;" heraus nehme, dann funktioniert es.

    Komisch ist aber, dass der Code in einen anderen Programm bereits läuft.

    Hier der Code:

    //Daten aus der Stunden_Zeit.txt Datei in das StringGrid1 laden
     TStringList *list = new TStringList();
     list->LoadFromFile("abcd.txt");
    
     StringGrid1->Cells[0][0]="D";
      StringGrid1->Cells[1][0]="F";
      StringGrid1->Cells[2][0]="A";
      StringGrid1->Cells[3][0]="S";
      StringGrid1->Cells[4][0]="B";
      StringGrid1->Cells[5][0]="U";
    
     StringGrid1->RowCount = list -> Count+1;
     for (int y = 0; y < list ->Count; y++)
    
     StringGrid1->Rows[y+1]->CommaText = list->Strings[y];
    
     delete list;
    

    Fehler:
    Zugriffsverletzung bei Adresse...in Modul Datei.exe. Lesen von Adresse...



  • Sieht erst ein mal ok aus. Was passiert denn, wenn du mit dem Debugger drüberläufst? An welcher Stelle tritt die Zugriffsverletzung denn auf?

    Btw:
    Meine obige Antwort ist eine indirekte Aufforderung mehr Details zu deinem Problem zu geben. Mit dem, was du in deinem Eingangspost lieferst, kann man nichts anfangen. Man weiss zwar, dass es irgendwas mit TStringGrid und dynamischer Zeilenanzahl zu tun hat, aber ohne den Quelltext und die exakte Fehlerbeschreibung bleibt das ein Ratespiel. Bitte lies das hier.



  • Der Fehler kommt beim:

    StringGrid1->RowCount = list -> Count+1;



  • Dann überprüfe mal, ob du nicht einen Speicherüberschreiber hast, also ob die Zeigerwerte von StringGrid1 und list (noch) korrekt sind (am besten per Einzelschritt im Debugger).



  • abcd schrieb:

    Der Fehler kommt beim:

    StringGrid1->RowCount = list -> Count+1;

    Nimm mal die Leerzeichen weg, das es so aussieht:

    StringGrid1->RowCount = list->Count+1;
    


  • Es geht hier um einen Laufzeitfehler:

    abcd schrieb:

    Fehler:
    Zugriffsverletzung bei Adresse...in Modul Datei.exe. Lesen von Adresse...

    Bzgl. der Leerzeichen ist es aber vollkommen egal, ob (und wieviele) davon vorhanden sind, nur "->" muß zusammengeschrieben sein.



  • Ich habe jetzt ein neues Projekt angelegt, damit läuft die Geschichte.
    Allerding nur kleiner Teil.

    Sobald ich in der Form1 was in die Form 2 schreibe, dann geht das Theater los.

    Die Units sind jeweils eingebunden.

    z.B. in der Unit1:

    Form2->Edit6->Text="ASDDA"; //Hier kommt der Fehler.



  • Wie schon gesagt, nutze den Debugger und schau dir deine Variablen an. Sind die Zeiger gültig? Ansonsten musst du einfach mehr Code zeigen. Am besten ein minimales Beispiel welches den Fehler zeigt.
    Wenn in der gezeigten Zeile eine Zugriffsverletzung auftritt ist entweder Form2 oder Edit6 kein gültiger Zeiger.



  • Th69 schrieb:

    Es geht hier um einen Laufzeitfehler:

    abcd schrieb:

    Fehler:
    Zugriffsverletzung bei Adresse...in Modul Datei.exe. Lesen von Adresse...

    Bzgl. der Leerzeichen ist es aber vollkommen egal, ob (und wieviele) davon vorhanden sind, nur "->" muß zusammengeschrieben sein.

    Volle Zustimmung, ich dachte, möglicherweise könnte es daran liegen, das der Compiler ev. den Inhalt der Adresse von der Eigenschaft list->Count plus 1 lesen will und das zu einer Zugriffsverletzung führen könnte, aber wie gesagt, das war reine Spekulation meinerseits, da ja die propertys beim C++Builder nicht Standard C++ sind.
    😉 😉

    @abcd:
    Wenn du in der FormCreate Methode von Form1 etwas in Form2 (bzw. eines seiner Komponenten) schreiben willst, kann das durchaus sein, denn wenn Form1 vor Form2 erzeugt wird, dann gibt es zu diesen Zeitpunkt halt noch kein Form2 Objekt.
    Eine mögliche Lösung für so einen Fall:
    Automatische Formerstellung für Form2 deaktivieren und Form2 in FormCreate von Form1 erzeugen



  • oder das ganze erst in OnShow machen. Da gibt es die Dialoge auf jedem Fall.



  • Hallo,

    sorry für die späte Antwort.

    Also, wenn ich das Tool auf Windows 7 compiliere, dann geht es.
    Unter Windows 10 kommen nur Probleme.

    Auch die erste Zeile von der StringList wird im StringGrid unter Windows 10 nicht angezeigt, in Windows 7 ist sie da. Getestet mit der .exe-Datei.

    Ich schreibe das Programm mal komplett neu.

    Oder muss unter Windows 10 was eingestellt werden???



  • Gerade habe ich festgestellt, dass wenn ich im StringGrid unter Option, einige Einstellungen ändere, dass dann die Zugriffsverletzung kommt.
    Bei Windows 10...



  • Welche Version des C++ Builder verwendest du?



  • Den kostenlosen con Codegear Builder 10.2


Anmelden zum Antworten