PDA

Ver la Versión Completa : StringGrid, colores y alineación


Alexander
13-05-2005, 05:33:29
Foro una preguntica.

Tengo un StringGrid con dos columnas, el la primera quero colocar de color azul con negrilla y la segunda los valores alineados a la derecha, puedo hacer esto?.

Gracias.

Alexander

Neftali [Germán.Estévez]
13-05-2005, 09:33:16
Utiliza el evento OnDrawCell (para ambas cosas). Busca en los foros "StringGrid Color" (sin las comillas), verás como es un tema que ya se ha tratado.

El tema de la alineación es similar (OnDrawCell); Aquí tienes un ejemplo:


procedure TFormStringGrid.StringGrid1DrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);

//···············································································
procedure WriteText(StringGrid: TStringGrid; ACanvas: TCanvas; const ARect: TRect;
const Text: string; Format: Word);
const
DX = 2;
DY = 2;
var
S: array[0..255] of Char;
B, R: TRect;
begin
with Stringgrid, ACanvas, ARect do
begin
case Format of
DT_LEFT: ExtTextOut(Handle, Left + DX, Top + DY,
ETO_OPAQUE or ETO_CLIPPED, @ARect, StrPCopy(S, Text), Length(Text), nil);

DT_RIGHT: ExtTextOut(Handle, Right - TextWidth(Text) - 3, Top + DY,
ETO_OPAQUE or ETO_CLIPPED, @ARect, StrPCopy(S, Text),
Length(Text), nil);

DT_CENTER: ExtTextOut(Handle, Left + (Right - Left - TextWidth(Text)) div 2,
Top + DY, ETO_OPAQUE or ETO_CLIPPED, @ARect,
StrPCopy(S, Text), Length(Text), nil);
end;
end;
end;
//···············································································
procedure Display(StringGrid: TStringGrid; const S: string; Alignment: TAlignment);
const
Formats: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
begin
WriteText(StringGrid, StringGrid.Canvas, Rect, S, Formats[Alignment]);
end;
//···············································································
begin

// La columna 0 a la derecha
if ACol = 0 then begin
Display(StringGrid1, StringGrid1.Cells[ACol, ARow], taRightJustify);
end;

// La columna 1 a la centrada
if ACol = 1 then begin
Display(StringGrid1, StringGrid1.Cells[ACol, ARow], taCenter);
end;

// La primera fila (de titulos centrada)
if ARow = 0 then begin
Display(StringGrid1, StringGrid1.Cells[ACol, ARow], taCenter);
end;

end;

Crandel
13-05-2005, 09:35:34
Hola Alexander, si se puede hacer las dos cosas, pero no es tan simple.

El tema es que el StringGrid no tiene una propiedad directa para hacerlo. Asi que podes programarlo o buscar un compoenete que hay por ahi que ya alguien le agrego esas propiedades.

Si queres programarlo aca te doy un ejemplo (puede haber error en el código porque lo estoy acomodando de un programa que hice en CBuilder)


procedure TForm1.GrillaDrawCell(Sender: TObject, ACol: integer,
ARow: integer, Rect: TRect, State: TGridDrawState)
begin
Grilla.Canvas.Brush.Style := bsSolid;

case ACol of
1: Grilla.Canvas.Brush.Color := clBlue;
2: Grilla.Canvas.Brush.Color := clRed;
end;
Grilla.Canvas.FillRect(Rect);
end;


en este ejemplo se pintan las columans de acuerdo al numero que sean.

Para que se ejecute este método GrillaDrawCell tenes que escribir algo sobre cada celda.

Para la alineación no me acuerdo acuedo y no lo tengo a mano, pero con esto podes empesar.

Suerte

Crandel
13-05-2005, 09:37:22
Justo Neftali, te escribio sobre la alineación mientras yo escribia sobre el color :D

Suerte

Alexander
19-05-2005, 19:21:00
Caballeros muchas gracias.

Ya lo domino.

Alexander.

sakuragi
17-11-2005, 01:15:11
hola que tal

siguiendo con este tema otra duda.

en el evento "OnDrawCell" puedo validar que al dar enter se pinte una fila completa?

la que sigue de donde estoy posisionado, osea para abajo?


saludos

gracias