StringGrid verliert beim Tauschen von Zeilen Daten



  • 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