DrawCell in StringGrid - Farbige Zellen verändern sich bei MouseOver!



  • Hallo,

    ich verändere mit dem DrawCell-Ereignis des StringGrid die Farbe bestimmter Zellen. Die Funktion des Programms sieht ungefähr so aus, dass ich mit der Maus ein Panel per Drag & Drop über eine Zelle des StringGrids ziehe, und dann dort ablege. Die Farbe ändert sich auch an der richtigen Stelle!
    Aber wenn ich dann wieder ein Panel per Drag & Drop über eine schon "bemalte" Zelle ziehe, dann verändert sich genau an dieser Stelle die Farbe in weiß oder die davor benutzte Farbe!
    Wie kann ich das umgehen? Alle abgelegten Farben in einem Array speichern und dann immer wieder DrawCell aufrufen, wenn ich das Panel ziehe?
    Oder kann man irgendwo einstellen, dass sich das StringGrid/Formular die Farben "merkt"?

    Lieben Gruß Michel :xmas1:



  • Dann scheinst du die DrawCell-Methode nicht richtig implementiert zu haben: diese sollte immer den aktuellen Status (d.h. bei dir die Farbe) kennen und entsprechend zeichnen. Du mußt extern nichts weiter programmieren!

    Evtl. zeig mal deine DrawCell-Methode.



  • void __fastcall TKTPMainForm::StundenplanGridDrawCell(TObject *Sender, int ACol, int ARow,
    		  TRect &Rect, TGridDrawState State)
    {
    	// Farben festlegen:
    
    	if ((MarkedRow >= 0) && (ARow == MarkedRow) && (MarkedCol >= 0) && (ACol == MarkedCol)) {
    		StundenplanGrid->Canvas->Brush->Color = StringToColor(qry_akt_erzieher->FieldByName("er_farbe")->AsString) ;
    		StundenplanGrid->Canvas->Font->Color = clHighlightText ;
    	}
    
    	// Zellen zeichnen
    	StundenplanGrid->Canvas->FillRect(Rect);
    
    	// Standardfarben für selektierte Zelle(n)
    	int hAlign;   // text align, 0/1/2 - Left/Center/Right
    	hAlign = 1;
    	// und zum Schluss den Text in die Zelle malen
    	DrawTextW(StundenplanGrid->Canvas->Handle, (wchar_t*)StundenplanGrid->Cells[MarkedRow][MarkedCol].c_str(), -1, &Rect, DT_SINGLELINE | DT_VCENTER | hAlign);
    }
    

    MarkedRow und MarkedCol geben bei mir die Zeile und Spalte an, welche gezeichnet werden soll!

    Wann wird denn DrawCell immer aufgerufen?

    So siehts aus, wenn ich mitm Panel über andere Zellen gezogen bin:

    http://img13.imageshack.us/img13/305/unbenanntma.jpg



  • Im Event

    DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
    

    wird immer nur die Zelle ACol und ARow gezeichnet, also wenn du mit

    DrawTextW(StundenplanGrid->Canvas->Handle, (wchar_t*)StundenplanGrid->Cells[MarkedRow][MarkedCol].c_str(), -1, &Rect, DT_SINGLELINE | DT_VCENTER | hAlign);
    

    als Zellenposition MarkedRow bzw. MarkedCol verwendest greifst du damit auf einen andere Zelleninhalt zu als der grade gezeichnet wird.
    Auch ist mir schleierhaft wiso du Überhaupt MarkedRow/MarkedCol benötigst den
    mit TGridDrawState State im Event kannst du herausfinden ob die Zelle markiert ist.

    Auch ein StundenplanGrid->Cells[0][0].w_str() reicht aus, den dein String ist doch schon ein WideString oder? (Projektoptionen TCHAR=wchar_t eingestellt?)

    Wenn du unterschiedliche Farben hast in den Zellen, dann muss jedesmal im DrawCell Ereignis die Farbe angegeben werden.

    TCanvas *zf = StundenplanGrid->Canvas;
    
    	//Markierte Zelle
    	if (State.Contains(gdSelected)) {
    		zf->Brush->Color = clHighlight;
    		zf->Font->Color = clHighlightText;
    	}
    	//Überprüfen ob es einen Zelleninhalt gibt
    	else if (!StundenplanGrid->Cells[ACol][ARow].IsEmpty()) {
    		zf->Brush->Color = clRed;
    		zf->Font->Color = clBlack;
    	}
    
    	GradientFillCanvas(zf, clWhite, zf->Brush->Color, Rect, gdVertical);
    
    	zf->Brush->Style = bsClear; //keine Texthintergrundfarbe
    	DrawText(zf->Handle, StundenplanGrid->Cells[ACol][ARow].w_str(), -1, &Rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS);
    


  • VergissEs schrieb:

    Wenn du unterschiedliche Farben hast in den Zellen, dann muss jedesmal im DrawCell Ereignis die Farbe angegeben werden.

    Das heißt doch aber dann, dass ich die Farben irgendwo (z.B. in einem Array) abspeichern muss, oder nicht?


Anmelden zum Antworten