aams01 te está dando parte de la solución.
Piensa que estás escribiendo textos en las rejillas dos veces, una centrado con DrawTextW y la otra a la izquierda con TextOutA. Lo propio es añadir los nuevos textos en otro procedimiento, de carga o en todo caso, con DrawTextW para poder centrarlos.
Pero aún te falta otra cosa. La VCL escribe por su cuenta las celdas a la izquierda. Si quieres redibujarlas debes borrarlas previamente y luego reescribirlas.
Código:
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
TStringGrid *grid = dynamic_cast<TStringGrid*>(Sender);
InflateRect(&Rect, -1, -1);
// Ajusto los colores de las celdas a las preestablecidos
if(State.Contains(gdFixed))
grid->Canvas->Brush->Color = grid->FixedColor;
else
grid->Canvas->Brush->Color = grid->Color;
// Borro las celdas
grid->Canvas->FillRect(Rect);
DrawText(grid->Canvas->Handle, grid->Cells[ACol][ARow].c_str(), grid->Cells[ACol][ARow].Length(), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
// Restauro el Rect que se pasó por referencia, no por valor...
InflateRect(&Rect, 1, 1);
}
Saludos.