PDA

Ver la Versión Completa : Alineamiento y Estilo en celda de StringGrid


andre
23-06-2003, 15:15:45
Hola amigos,

Como puedo establecer el alineamiento y el estilo de fuente y color de fondo de una celda especifica o un grupo de celdas en un StringGrid, por ejemplo que la primera columna este alineada a la derecha o que una fila tenga un color de fondo distinto y la letra en negrita.

Muchas gracias.

elpinjum
23-06-2003, 15:36:06
Puedes usar el evnto de StringGrid DrawCell, el cual se ejecuta antes de que se dibuje cada celda, y en el cual puedes establecer las propiedades del canvas como quieras para que se el texto salga como quieras y el fondo del canvas igual.

El siguiente codigo si lo asocias a un StringGrid en el evento DrawCell, te escribra el texto Hola, en negrita en las columnas impares y normal en las pares.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
If (ACol div 2)=(ACol / 2) then
TStringGrid(Sender).Canvas.Font.Style:=[]
else
TStringGrid(Sender).Canvas.Font.Style:=[fsBold];
TStringGrid(Sender).Canvas.TextOut(Rect.Left,Rect.Top,'Hola');
end;

elpinjum
23-06-2003, 15:39:07
He olividado decir que si lo que estas es creando un componente, puedes sobreescribir el procedimiento DrawCell, lo cual tendría el mismo efecto.

andre
23-06-2003, 16:35:18
Muchas gracias por la solucion amigo aunque hay un problemita, cuando cambio el texto de la celda con la sentencia:
StringGrid1.Cells[0, 0] := 'Hola otra vez';
la palabra se escribe junto con la que se definio en el evento ondrawcell como me dijiste, se sobreescriben las dos.

Cuando intento recuperar el texto en la celda con la sentencia:
ShowMessage(StringGrid1.Cells[0, 0]);
me devuelve una cadena vacia.

Hay alguna solucion para que se cambie solamente los valores de alineamiento y estilo pero que el texto se ingrese en otro lado que no sea en el evento ondrawcell?

De nuevo muchas gracias.

elpinjum
24-06-2003, 09:11:58
No se si te servirá pero lo que puedes hacer es en el el evento onDrawCell, borrar todo el contenido de la celda con un rectangulo blanco, y despues pintar tu mismo el texto de la celda como te muestro en el siguiente codigo.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
StringGrid1.Canvas.Rectangle(Rect);
If (ACol div 2)=(ACol / 2) then
TStringGrid(Sender).Canvas.Font.Style:=[]
else
TStringGrid(Sender).Canvas.Font.Style:=[fsBold];
TStringGrid(Sender).Canvas.TextOut(Rect.Left,Rect.Top, StringGrid1.Cells[ACol,ARow]);
end;

andre
25-06-2003, 13:12:58
OK, muchas gracias.

Perdon que sea reiterativo pero realmente necesito recuperar el texto tambien, sabes de que manera puedo hacerlo?.

Saludos.

elpinjum
25-06-2003, 15:22:09
Con el último codigo que te he pasado tendrías que poder recuperarlo haciendo uso de la propiedad Cells, ya que lo que hace el procedimiento es primero borrar cada celda, y luego poner el texto de la propiedad Cells de la celda.

Es decir los valores que introduzca en la propiedad Cells[x,y] son los que se te van a pinter en la celda.

Prueba a recuperar el texto con la propiedad cells de cada columna, deberia funcionarte.

ShowMessage(StringGrid1.Cells[0, 0]);

andre
25-06-2003, 16:16:12
Muchisimas gracias Elpinjum,

Anda muy bien el codigo, es exactamente lo que necesito.

Saludos.