StringGrid Zeile kopieren unter Bedingung schlägt fehl



  • Hallo auch. Ich bin am verzweifeln. Ich versuche die gesamte Zeile eines StringGrid in ein weiteres zu kopieren. Das geht alles solange gut, wenn es an keine Bedingung geknüpft ist. Bei einer Bedingung erhalte ich Kauderwelsch aber keine Fehlermeldung. Ich hoffe ihr könnt mir helfen...

    void __fastcall TMainForm::Select_KBereich_TabChange(TObject *Sender)
    {
     int Tabellenzeilen = StringGrid1->RowCount;
     int KBereich = Select_Tab->ItemIndex;
    
     StringGrid2->RowCount=1;
    
     for(int i=1; i<Tabellenzeilen; i++)
     {
    //  if(StringGrid1->Cells[2][i] == 3)
      {
       StringGrid2->Cells[2][i-1] = StringGrid1->Cells[2][i];
       StringGrid2->RowCount++;
      }
     }
     StringGrid2->RowCount--;
    }
    

    Lasse ich die if() Bedingung weg, so kopiert er mir Zeile für Zeile 1:1 rüber. So wie erwartet. Frage ich aber mit der Bedingung ab, das er mir nur bestimmte Zeilen kopiert, schreibt er Leerzeilen oder völlig falsche Zahlen in das neue StringGrid.

    Das StringGrid ist in etwa so aufgebaut:

    ID; Name; ID2
    1; Test Name; 4
    2; Test Name 2; 3

    Kann mir wer helfen oder nen Tip geben ?

    PS: Dasselbe passiert auch wenn ich StringGrid2->Rows[i-1] = StringGrid1->Rows[i]; verwende...



  • bilbo_b schrieb:

    Frage ich aber mit der Bedingung ab [...] schreibt er Leerzeilen oder völlig falsche Zahlen in das neue StringGrid.

    Bist du sicher, dass du die richtige Zelle abfragst?
    Bist du sicher, dass du in die richtigen Zellen schreibst?

    PS.
    Mit "bist du sicher" ist gemeint "hast du per Debugger überprüft".



  • Also mit dem Debugger hab ichs nicht überprüft. Aber ich hab mir testweise für jede Zeile das Ergebniss in ShowMessage(); ausgeben lassen danach ist es in die neue Tabelle gewandert. In den Dialogboxen kamm alles so rüber und auch genau das was ich in der Bedingung abgefragt habe. Der Schreibvorgang baut dann aber wieder Mist.



  • Mit ddeiner Bedingung schreibst du in eine Reihe des StringGrid2, die es noch garnicht gibt.(Schau dazu mal im Debugger was in deiner Variablen i in der Schleife steht).



  • Ich bin zu dooooooof. Grrr man sollte wirklich nicht programmieren wenn n Haufen Kinder um einen drumherum ist 🙂

    Die Zeile in die ich schreibe gibt es schon. Aber was es nicht gibt, ist dieselbe Anzahl von Zeilen in beiden Tabellen, der soll ja die neue Tabelle erst aufbauen. Es funktioniert nun. Korrekt müsste das ganze in etwa so aussehen:

    void __fastcall TMainForm::Select_KBereich_TabChange(TObject *Sender)
    {
     GridPfarrbereich2->RowCount=1;
    
     for(int i=1; i<GridPfarrbereich1->RowCount; i++)
     {
      if(GridPfarrbereich1->Cells[2][i] == Select_KBereich_Tab->ItemIndex)
      {
       GridPfarrbereich2->Cells[0][GridPfarrbereich2->RowCount-1] = GridPfarrbereich1->Cells[0][i];
       GridPfarrbereich2->Cells[1][GridPfarrbereich2->RowCount-1] = GridPfarrbereich1->Cells[1][i];
       GridPfarrbereich2->Cells[2][GridPfarrbereich2->RowCount-1] = GridPfarrbereich1->Cells[2][i];
       GridPfarrbereich2->RowCount++;
      }
     }
     GridPfarrbereich2->RowCount--;
    }
    

    Jansen hatte also wie so oft recht oder hat mich zumindest auf die richtige Idee gebracht. Nun kann ich wieder besser schlafen ...



  • Mit dem hier schreibst du ins StringGrid2 ohne zu wissen, ob es die Zeile dort schon gibt.

    StringGrid2->Cells[2][i-1] = StringGrid1->Cells[2][i];
    

    und so

    GridPfarrbereich2->Cells[0][GridPfarrbereich2->RowCount-1] = GridPfarrbereich1->Cells[0][i];
    

    eben nicht.


Anmelden zum Antworten