Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   dbgrid pero 2 renglones por registro (https://www.clubdelphi.com/foros/showthread.php?t=50717)

smessina 26-11-2007 18:49:11

dbgrid pero 2 renglones por registro
 
hola como estan?

ando buscando un componente del tipo dgrid (en lo posible free) que permita
poner 2 renglones por registro.

asi http://s1.subirimagenes.com/imagen-d...s-1678394.html

desde yas muchas gracias por su tiempo.

fjcg02 26-11-2007 22:36:11

Hola,
si tienes ganas de trabajar, puedes simularlo tú mismo.
Para ello.
1.- pon las propiedades del DBGrid Font-size =25 por ejemplo. Con esto consigues que tus lineas sean tres veces más altas.
2.- A partir de aqui, puedes redibujar todos los campos. Para ello, en el evento drawncolumnCell del DBGrid pones algo parecido a esto, que te los dibuja de forma habitual:

Código Delphi [-]
 
(Sender as TDBGrid).Canvas.Font.Size:= 8;
(Sender as TDBGrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);

3.- Los campos que sean 'especiales' , tendrás que currartelo vía drawntext y funciones similares, jugando con el canvas del grid , el rect, ... De todo esto tienes información a patadas en el foro. Sólo tienes que buscar.

Espero que te sirva de ayuda.

Saludos

smessina 27-11-2007 19:08:18

gracias fjcg02 por responder.

mira probe lo que me dices pero con esto solo consigo que cada renglon sea como vos decis tres veces mas grande que lo normal poniento el fontsize del dbgrid en 25 y luego que la letra del renglon de cada linea sea de 8, osea tengo un renglon grande y la letra chica pero con esto no consigo tener dos renglones por registro.

Por favor insisteme si no te entendi bien u orientame un poco mas sobre que metodos, eventos o propiedades debe utilizar con esto que me dices asi pueda obtener dos renglones por registro.

de todas formas si alguien tiene idea de algun dbgrid que permita configurar para que cada registro ocupe dos renglones como se muestra en la figura estare muy agradecido.

Lepe 27-11-2007 20:02:38

Esa imagen que pones tiene toda la pinta de ser un JFControls, un grid muy tuneable. Son componentes de pago.

Buscando por mis bibliotecas he encontrado una forma "fácil" de usar el método de fjcg02. Copia todo en una nueva unidad y ponle el nombre lpCanvas.pas:
Código Delphi [-]
unit lpCanvas;

interface
  uses Graphics,windows;

type TAlignText = (atTopLeft=0, atTopCenter, atTopRight,
                   atCenterLeft, atCenter, atCenterRight,
                   atBottomLeft, atBottomCenter, atBottomRight);

procedure PaintText(ACanvas: TCanvas; const ARect: TRect;
                       const Line:string; Align:TAlignText;
                       const FillBackground:Boolean = false);

implementation

uses sysutils;

const
 Offset = 2;

procedure PaintText(ACanvas: TCanvas; const ARect: TRect;
                       const Line:string; Align:TAlignText;
                       const FillBackground:Boolean = false);
var x,y,CenterX, CenterY:integer;
   Options :integer;
   S: array[0..255] of Char;
begin
  Options := ETO_CLIPPED;

  if FillBackground  then
    Options := options or ETO_OPAQUE;

  with ARect, Acanvas do
  begin
    CenterY := (Bottom - Top - TextHeight(Line)) div 2;
    CenterX := (Right - Left - TextWidth(line)) div 2;
    x:= Offset;
    y:= Offset;
    case Align of
     atTopLeft      :begin
                      x := left + Offset ;
                     end;
     atTopCenter    :begin
                      x := left + CenterX;
                     end;
     atTopRight     :begin
                      x := Right - Offset - TextWidth(Line);
                     end;
     atCenterLeft   :begin
                      x:= Left+ Offset;
                      y:= CenterY;
                     end;
     atCenter       :begin
                      x:= CenterX;
                      y:= CenterY;
                     end;
     atCenterRight  :begin
                      x:= Right - Textwidth(line) - Offset;
                      y:=  CenterY;
                     end;
     atBottomleft   :begin
                      y:=  Bottom - Textheight(Line) - Offset;
                     end;
     atBottomCenter :begin
                      x:= CenterX;
                      y:= Bottom - Offset - Textheight(Line);
                     end;
     atBottomRight  :begin
                      x:= Right - TextWidth(line) - Offset;
                      y:= Bottom - Textheight(Line)-Offset;
                     end;
    end;
    ExtTextOut(Handle, x, y, options,@ARect,  StrPCopy(S,Line),length(line),nil);
  end;
end;


end.

Forma de uso:
Código Delphi [-]
uses lpCanvas;

// Al dbGrid, le pones a false la propiedad DefaultDrawing
//En el evento OnDrawColumnCell del grid, escribes:
PaintText(Canvas, Rect,                      //parámetros del propio evento OnDrawColumnCell
             'Mi texto Linea1', atTopLeft,
             true); // aqui decimos que pinte el fondo

PaintText(Canvas, Rect,                      //parámetros del propio evento OnDrawColumnCell
             'Mi texto Linea 2', atBottomRight,  //segunda línea alineada a la derecha
             False); // Ahora no pintamos el fondo, porque se borraría la primera línea.

Como ves tienes 9 formas de alinear texto dentro de la celda, más que suficiente ;).

Saludos

fjcg02 27-11-2007 23:01:47

smessina,
te adjunto la rutina que pinta lo que tú pides.
Para ello, haz lo que te he comentado anteriormente. Pon un grid con font.size = 20, y copiale el código que te adjunto.
PAra el ejemplo que te pongo, necesitas una tabla que tenga los campos Nombre1, Nombre2, Concepto, FEcha, CantidadDebe y CantidadHaber. Yo he utilizado una bbdd de access para hacer la prueba.

Suerte y un saludo

<a href="http://img122.imageshack.us/my.php?image=pantallazofk3.jpg" /a>

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, Grids, DBGrids, ADODB;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ADOTable1idregistro: TAutoIncField;
    ADOTable1Nombre1: TWideStringField;
    ADOTable1Concepto: TWideStringField;
    ADOTable1Nombre2: TWideStringField;
    ADOTable1fecha: TDateTimeField;
    ADOTable1Cantidaddebe: TFloatField;
    ADOTable1CAntidadhaber: TFloatField;
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Types;

{$R *.dfm}

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var WRect: TRect;
begin
(Sender as TDBGrid).Canvas.Font.Size:= 8;
if DataCol =0  then
begin
  WRect.Left:= Rect.Left;
  WRect.Top := REct.Top + ((Rect.Bottom-Rect.Top) div 2);
  WRect.Bottom := Rect.Bottom;
  WRect.Right:= Rect.Right;
  DBGrid1.Canvas.Rectangle(WRect); // pinto un rectangulo para separar los dos nombres
  DBGRid1.Canvas.TextOut(Rect.LEft,Rect.Top+2,ADOTable1Nombre1.AsString);
  DBGRid1.Canvas.TextOut( Rect.left ,Wrect.Top+2 ,ADOTable1Nombre2.AsString);
end
else
begin
  WRect.Left:= Rect.Left;
  WRect.Top := REct.Top + ((Rect.Bottom-Rect.Top) div 2);
  WRect.Bottom := Rect.Bottom;
  WRect.Right:= Rect.Right;
  DBGrid1.Canvas.Rectangle(WRect); // pinto un rectangulo para separar los dos nombres
  DBGRid1.Canvas.TextOut(Rect.LEft,Rect.Top+2,ADOTable1Concepto.AsString);
  DBGRid1.Canvas.TextOut( Rect.left ,Wrect.Top+2 ,ADOTable1Fecha.AsString);
  DBGRid1.Canvas.TextOut( Rect.left+ ((Rect.Right - Rect.Left) div 3)+50 ,Wrect.Top+2 ,ADOTable1CAntidadDEbe.AsString);
  DBGRid1.Canvas.TextOut( Rect.left+ (2*(Rect.Right - Rect.Left) div 3) +50,Wrect.Top +2,ADOTable1CantidadHaber.AsString);
end;

end;

end.

smessina 28-11-2007 00:07:59

Muchas Gracias chicos, voy a pegarle una mirada y les cuento como me va.

de verdad gracias por su tiempo.

fjcg02 28-11-2007 21:54:38

Ah, se me olvidaba una cosa. Lo que queda mal es cuando vas a editar un campo. Creo que no será difícil evitarlo con una ventana de edición de datos.

Por cierto, para calcular los cuadrados he utilizado la variable WRect, pero como ves podrías borrarla y utilizar un simple entero. En el ejemplo que te he puesto, en la segunda columna falta currarse las rayitas, etc.

Por otro lado, lo que no es posible ( al menos yo no lo sé ) es poner el título a dos filas.

Suerte y un saludo

smessina 28-11-2007 23:54:12

muchas gracias fjcg02 y lepe
 
La verdad que te agradesco muchisimo fjcg02 el tiempo que dedicaste a responderme estuve probando y efectivamente para editarlo me pasaba lo que dices pero ya vamos a solucionarlo de alguna manera.

voy a seguir viendo y vamos usar lo que me dijiste.

muchas gracias


La franja horaria es GMT +2. Ahora son las 22:03:42.

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