Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Alineación en StringGrid (https://www.clubdelphi.com/foros/showthread.php?t=31508)

CamiloU 10-05-2006 00:51:15

Alineación en StringGrid
 
Quisiera saber si es posible alinear en forma independiente las columnas de un StringGrid, por ejemplo, los datos de la columna 1 centrados, la columna 2 a la izquierda y la columna 3 a la derecha.

Aprovecho para otra pregunta. Si en alguna de las columnas del StringGrid manejo valores es posible que me haga separación de miles con punto?

Muchas gracias.

Acanol 10-05-2006 01:49:20

Muy buenas Camilou, no te lo tomes a mal pero podrias molestarte en buscar un poco antes de hacer la pregunta, ya que es un tema que se ha tratado y no pocas veces en este foro.

En este hilo y en este otro.

Espero te sirvan de ayuda.

Un saludo.

//Antes de formular preguntas, intetemos encontra nosotros la respuesta
//Todos los dias se aprende algo, Por que no enseñarlo nosotros¿?


CamiloU 10-05-2006 03:15:57

No lo tomo a mal, al contrario, muchas gracias por la colaboracion y tienes razon en lo de la busqueda. Di un primer vistazo y no encontre el tema y no profundice la busqueda.

Respecto a la segunda pregunta, tienes alguna idea?

Acanol 10-05-2006 08:37:51

Buenas, me alegro de que te sirvan los hilos,si solamante quieres poner los puntos para indicar que son miles (sin tener que hacer calculos luego), se podria hacer una funcion que introdujese un punto en determinadas posiciones, yo tngo una funcion que elimina los espacios en blanco supongo que se podria hacer algo asi pero para poner los puntos. Si te parece bien lo miro y te digo si consigo algo.

Neftali [Germán.Estévez] 10-05-2006 09:32:30

Cita:

Empezado por CamiloU
Si en alguna de las columnas del StringGrid manejo valores es posible que me haga separación de miles con punto?

Debes formatear ese valor para que se visualice con puntos en los miles.
Busca en la ayuda de Delphhi "Format function"; en la parte inferior de la pantalla tienes información sobre "Format Strings".

Revisa la opción m (para Money) que te formateará el correspondiente número utilizando los separadores definidos por la variables ThousandSeparator y DecimalSeparator.

CamiloU 01-06-2006 02:41:45

Segui el procedimiento que encontre en otro hilo, pero no me funciona. Me podrían indicar donde esta el error. Anexo el codigo.

Código Delphi [-]
procedure TComPagoDetalleACD.IngresosDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
   if ACol = 0 then
      Display(Ingresos, Ingresos.Cells[ACol,ARow], taCenter);
  if ACol = 2 then
      Display(Ingresos, Ingresos.Cells[ACol,ARow], taRightJustify);
end;

procedure TComPagoDetalleACD.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;
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 TComPagoDetalleACD.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, B, S, Formats[Alignment]);
end;


Muchas Gracias.

Neftali [Germán.Estévez] 01-06-2006 10:48:34

Funciona perfectamente, sólo que en lugar de B (?¿?¿) que tienes aquí (que no se de dónde sale):
Código Delphi [-]
  WriteText(StringGrid, StringGrid.Canvas, B, S, Formats[Alignment]);

debes poner el parámetro Rect.

Código Delphi [-]
  WriteText(StringGrid, StringGrid.Canvas, Rect, S, Formats[Alignment]);

CamiloU 02-06-2006 14:46:17

En la declaración de variables de la Form tengo lo siguiente:
B, R: TRect;

Sin embargo, segui el consejo y me genero el siguiente error:
[Error] ComPago_DetalleACD.pas(389): There is no overloaded version of 'Rect' that can be called with these arguments.

Me podrian dar una ayuda. Muchas Gracias.

Neftali [Germán.Estévez] 02-06-2006 15:31:38

ARect, perdón. Debes usar el que viene como parámetro.

CamiloU 02-06-2006 16:18:48

No me funciona. :confused:

Presento todo el proceso. En el primer procedimiento recorro la Tabla Nomina y lleno los StringGrid (Ingresos y Descuentos) de acuerdo al tipo. Después estan los procedimientos de alineacion, pero no hace nada.

Antes de estos procedimientos es necesario realizar alguna declaración o algun paso anterior. :confused:

Código Delphi [-]
procedure TComPagoDetalleACD.MPerSelect(Sender: TObject);
var
  i, suming, sumegr : integer;
begin
  for i := 0 to Ingresos.RowCount do
      Ingresos.Rows[i].Clear;
  for i := 0 to Descuentos.RowCount do
      Descuentos.Rows[i].Clear;
  SuelDocente.Clear;
  DescDocente.Clear;
  NetoRecibido.Clear;
  pmes := MPer.Text;
  pper := concat(pmes,'/',pano);
  TNomina.First;
  cont1 := 0;
  cont2 := 0;
  suming := 0;
  sumegr := 0;
  while (Not TNomina.Eof) do
    begin
      if (TNomina.FieldByName('cedula').AsString = ceddocente) and
         (TNomina.FieldByName('periodo').AsString = pper) then
        begin
          if TNomina.FieldByName('clase').AsString = 'D' then
            begin
              Ingresos.Cells[0,cont1] := TNomina.FieldByName('codigo').AsString;
              Ingresos.Cells[1,cont1] := TNomina.FieldByName('factor').AsString;
              suming := suming + strtoint(TNomina.FieldByName('valor').AsString);
              Ingresos.Cells[2,cont1] := TNomina.FieldByName('valor').AsString;
              cont1 := cont1 + 1;
            end;
          if TNomina.FieldByName('clase').AsString = 'C' then
            begin
              Descuentos.Cells[0,cont2] := TNomina.FieldByName('codigo').AsString;
              Descuentos.Cells[1,cont2] := TNomina.FieldByName('factor').AsString;
              sumegr := sumegr + strtoint(TNomina.FieldByName('valor').AsString);
              Descuentos.Cells[2,cont2] := TNomina.FieldByName('valor').AsString;
              cont2 := cont2 + 1;
            end
        end;
      TNomina.Next;
    end;
  SuelDocente.Text := inttostr(suming);
  DescDocente.Text := inttostr(sumegr);
  NetoRecibido.Text := inttostr(suming - sumegr);
end;

procedure TComPagoDetalleACD.IngresosDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  if ACol = 0 then
      Display(Ingresos, Ingresos.Cells[ACol,ARow], taCenter);
  if ACol = 2 then
      Display(Ingresos, Ingresos.Cells[ACol,ARow], taRightJustify);
end;

procedure TComPagoDetalleACD.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;
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 TComPagoDetalleACD.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, ARect, S, Formats[Alignment]);
end;

Muchas gracias y peronen por tanta molestadera.

CamiloU 03-06-2006 00:26:34

Queria comentarles que encontre en la red otro procedimiento y me funciono a la perfección. Anexo el código para la persona que lo necesite.

Otra cosa. Muchas gracias a las personas que me colaboraron, especialmente Neftaly, por el interes y la paciencia.

Código Delphi [-]
procedure TComPagoDetalleACD.IngresosDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  Grid : TStringGrid;
  Texto : String;
begin
  Grid := TStringGrid(Sender);
  Grid.Canvas.FillRect(Rect);
  Texto := Grid.Cells[ACol,ARow];
  if ACol = 0 then DrawText(Grid.Canvas.Handle, PChar(Texto), StrLen(PChar(Texto)), Rect, DT_CENTER);
  if ACol = 1 then DrawText(Grid.Canvas.Handle, PChar(Texto), StrLen(PChar(Texto)), Rect, DT_LEFT);
  if ACol = 2 then DrawText(Grid.Canvas.Handle, PChar(Texto), StrLen(PChar(Texto)), Rect, DT_RIGHT);
end;


La franja horaria es GMT +2. Ahora son las 14:03:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi