StringGrid verliert beim Tauschen von Zeilen Daten



  • Hallo Leute,

    ich habe ein Stringgrid mit 6 Spalten und einer Variablen anzahl Reihen zum Anzeigen von Daten.

    Jetzt möchte ich die Daten sortieren. Und bin an dem Punkt wo man Reihen austauschen muß.

    String sBuf;
    
    OutputDebugString(pGrid->Rows[i]->Text).c_str());
    OutputDebugString(pGrid->Rows[i+1]->Text).c_str());
    sBuf = pGrid->Rows[i]->Text;
    pGrid->Rows[i]->Text = pGrid->Rows[i+1]->Text;
    pGrid->Rows[i+1]->Text = sBuf;
    OutputDebugString(pGrid->Rows[i]->Text).c_str());
    OutputDebugString(pGrid->Rows[i+1]->Text).c_str());
    

    Jetzt tritt relativ häufig der Fall ein das die Daten nachdem Tauschen nicht mehr stimmen (Es verschwinden die Strings einzelner Zellen nie die ganze Reihe)

    Woran könnte dies liegen?

    MfG



  • Enthalten deine Zellen evtl. einen oder mehrere Zeilenumbrüche, dann paßt die Zuordnung nicht mehr. Probiere mal stattdessen die Eigenschaft 'CommaText'.



  • nein sie enthalten keine Zeilenumbrüche

    mit CommaText zeigt sich das selbe Fehlerbild

    ich habe auch noch dieses Tutorial gefunden aber der macht das auch so
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39156.html

    Woran könnte dies liegen?



  • hat keiner eine Idee?



  • kann es irgendwie damit zusammen hängen, dass ich mir ein eigenes OnDraw Ereignis das die Zellen färbt programmiert habe?



  • Das kann schon sein. Zeig doch mal etwas mehr Code (aus OnDrawCell).



  • void __fastcall TFormMain::SGDrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
    	tStringGridObjectEntry *pStringGridObjectEntry;
    
        if(ARow == 0)
        {
            if(ACol == iLastSortedColumn && bLastSortAsccending)
            {
                SG->Canvas->Draw(Rect.right - bmpSortUp->Width - 5,
                (SG->RowHeights[0]-bmpSortUp->Height)/2+1, bmpSortUp);
            }
            else if(ACol == iLastSortedColumn && !bLastSortAsccending)
            {
                SG->Canvas->Draw(Rect.Right - bmpSortDown->Width - 5,
                (SG->RowHeights[0]-bmpSortDown->Height)/2+1, bmpSortDown);
            }
            Rect.Right = Rect.Right - bmpSortDown->Width - 6;
        }
    
        if ((!State.Contains(gdFixed)) && (SG->Cells[0][ARow].c_str()[0]) && (SG->Objects[0][ARow]))
        {
    //OutputDebugString(AnsiString().sprintf("brush color %d row %d",(tStringGridObjectEntry *) SG->Objects[0][ARow],ARow).c_str());
    //assert(((tStringGridObjectEntry *) SG->Objects[0][ARow]));
            pStringGridObjectEntry = (tStringGridObjectEntry *) SG->Objects[0][ARow];
            if (pStringGridObjectEntry)
            {
            	switch (pStringGridObjectEntry->ubColor)
            	{
            	case 0: SG->Canvas->Brush->Color = (TColor) COLOR_FIVE;
                    break;
    			case 1: SG->Canvas->Brush->Color = (TColor) COLOR_ONE;
    				break;
            	case 2: SG->Canvas->Brush->Color = (TColor) COLOR_TWO;
    				break;
    			case 3: SG->Canvas->Brush->Color = (TColor) COLOR_THREE;
    				break;
    			case 4: SG->Canvas->Brush->Color = (TColor) COLOR_FOUR;
    				break;
    			case 5: SG->Canvas->Brush->Color = (TColor) COLOR_FIVE;
    				break;
    			case 6: SG->Canvas->Brush->Color = (TColor) COLOR_SIX;
    				break;
    			case 7: SG->Canvas->Brush->Color = (TColor) COLOR_SEVEN;
    				break;
    			case 8: SG->Canvas->Brush->Color = (TColor) COLOR_EIGHT;
    				break;
    			case 9: SG->Canvas->Brush->Color = (TColor) COLOR_NINE;
    				break;
    			default:SG->Canvas->Brush->Color = (TColor) COLOR_FIVE;
    				break;
            	}
        	}
            else SG->Canvas->Brush->Color = (TColor) COLOR_FIVE;
    	}
    
        SG->Canvas->FillRect(Rect);
    
        //align of font 0/1/2 - Left/Center/Right
        DrawText(SG->Canvas->Handle, SG->Cells[ACol][ARow].c_str(),
    		-1, &Rect, DT_SINGLELINE | DT_VCENTER | 0);
    }
    

    aber ich kann ja nicht beeinflussen wann die Aufgerufen wird oder kann ich irgendwie dem StringGRid sagen während ich sortiere soll es nicht upgedatet werden?



  • Leider kennt StringGrid sowas wie BeginUpdate nicht. Du könntest aber am Ende des Sortierens einfach Update() aufrufen um ein solches zu erzwingen.



  • oder ein bool locked einführen, welches beim Sortieren auf true gesetzt wird und dadurch die Drawfunktion gleich am Anfang returned. Nach dem Sortieren wieder auf false und es kann weitergezeichnet werden.

    greetz KN4CK3R



  • wenn ich das mit der Variable mache ist erst mal das Problem gelöst, dass das umkopieren beim sortieren klappt. Nur leider bleiben jetzt einzelne Zellen weiß. Bestimmt die die nicht gezeichnet werden



  • wie hast dus denn gemacht? ich meinte es so:

    bool locked = false;
    
    void sortieren()
    {
        locked = true;
        String sBuf;
    
        OutputDebugString(pGrid->Rows[i]->Text).c_str());
        OutputDebugString(pGrid->Rows[i+1]->Text).c_str());
        sBuf = pGrid->Rows[i]->Text;
        pGrid->Rows[i]->Text = pGrid->Rows[i+1]->Text;
        pGrid->Rows[i+1]->Text = sBuf;
        OutputDebugString(pGrid->Rows[i]->Text).c_str());
        OutputDebugString(pGrid->Rows[i+1]->Text).c_str());
        locked = false;
    }
    
    void __fastcall TFormMain::SGDrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
        if(locked)
            return;
        tStringGridObjectEntry *pStringGridObjectEntry;
    
        if(ARow == 0)
        {
            if(ACol == iLastSortedColumn && bLastSortAsccending)
            {
                SG->Canvas->Draw(Rect.right - bmpSortUp->Width - 5,
                (SG->RowHeights[0]-bmpSortUp->Height)/2+1, bmpSortUp);
            }
            else if(ACol == iLastSortedColumn && !bLastSortAsccending)
            {
                SG->Canvas->Draw(Rect.Right - bmpSortDown->Width - 5,
                (SG->RowHeights[0]-bmpSortDown->Height)/2+1, bmpSortDown);
            }
            Rect.Right = Rect.Right - bmpSortDown->Width - 6;
        }
    
        if ((!State.Contains(gdFixed)) && (SG->Cells[0][ARow].c_str()[0]) && (SG->Objects[0][ARow]))
        {
    //OutputDebugString(AnsiString().sprintf("brush color %d row %d",(tStringGridObjectEntry *) SG->Objects[0][ARow],ARow).c_str());
    //assert(((tStringGridObjectEntry *) SG->Objects[0][ARow]));
            pStringGridObjectEntry = (tStringGridObjectEntry *) SG->Objects[0][ARow];
            if (pStringGridObjectEntry)
            {
                switch (pStringGridObjectEntry->ubColor)
                {
                case 0: SG->Canvas->Brush->Color = (TColor) COLOR_FIVE;
                    break;
                case 1: SG->Canvas->Brush->Color = (TColor) COLOR_ONE;
                    break;
                case 2: SG->Canvas->Brush->Color = (TColor) COLOR_TWO;
                    break;
                case 3: SG->Canvas->Brush->Color = (TColor) COLOR_THREE;
                    break;
                case 4: SG->Canvas->Brush->Color = (TColor) COLOR_FOUR;
                    break;
                case 5: SG->Canvas->Brush->Color = (TColor) COLOR_FIVE;
                    break;
                case 6: SG->Canvas->Brush->Color = (TColor) COLOR_SIX;
                    break;
                case 7: SG->Canvas->Brush->Color = (TColor) COLOR_SEVEN;
                    break;
                case 8: SG->Canvas->Brush->Color = (TColor) COLOR_EIGHT;
                    break;
                case 9: SG->Canvas->Brush->Color = (TColor) COLOR_NINE;
                    break;
                default:SG->Canvas->Brush->Color = (TColor) COLOR_FIVE;
                    break;
                }
            }
            else SG->Canvas->Brush->Color = (TColor) COLOR_FIVE;
        }
    
        SG->Canvas->FillRect(Rect);
    
        //align of font 0/1/2 - Left/Center/Right
        DrawText(SG->Canvas->Handle, SG->Cells[ACol][ARow].c_str(),
            -1, &Rect, DT_SINGLELINE | DT_VCENTER | 0);
    }
    

    greetz KN4CK3R



  • ja genau so und da passiert es das immer mal Felder weiß sind.

    aber ich habe es jetzt so gemacht da meine Daten in ein struct geschrieben werden und ich dieses als objekt der Zeile anhänge. Die OnPaint Rutiene bediehnt sich dann nur noch in dem struct. Und beim Sortieren tauscht die Sortierfunktionen nur noch die Objekte aus.

    MfG



  • Hi,

    frag mich nur warum Du es so kompliziert machst. Leite doch einfach von TStringGrid eine neue Komponente ab, in der Du MoveRow als Public veröffentlichst.

    Gruß Mümmel


Anmelden zum Antworten