Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Un tutorial de uso del stringgrid? (https://www.clubdelphi.com/foros/showthread.php?t=69244)

FGarcia 04-08-2010 02:27:15

Un tutorial de uso del stringgrid?
 
Pues eso ¿alguien tendra o sabra de un tutorial del stringgrid?

Nunca lo he usado y al parecer ahora lo voy a necesitar y no le entiendo nadita al bicho ese.

Gracias.

Caral 04-08-2010 03:09:48

Hola
No conozco ningun tutorial, pero no lo veo muy complicado y te lo dice un novato.
Que necesitas hacer?,
Que dudas tienes?.
A ver si te ayudo en lo que pueda, que sera poco......
Saludos

Neftali [Germán.Estévez] 04-08-2010 11:05:58

Estoy de acuerdo con Caral, en que es un componente bastante básuico e intuitivo.

Aun así le puedes echar un vistazo a esta página, donde explica las operaciones y propiedades básicas.
Si haces una búsqueda en los foros por StringGrid, posiblemente encontrarás cientos de mensajes sobre la mayoría de operaciones que puedes realizar con él.
Por último en el FTP del club, puedes encontrar varios ejemplos con código al respecto.

FGarcia 04-08-2010 19:27:36

Gracias por las respuestas.

Aun ando en "veremos" no defino exactamente lo que quiero, pero por lo mientras voy a ver esa pagina que recomienda Neftali. Tambien pense en NiceGrid pero no se si se podra instalar y funcione en d2010.

Amenazo con regresar.

FGarcia 04-08-2010 21:47:59

Pues si ya esta lo que necesito mostrar:

--------------------------------------------------------------------------------------------------------------------------
Primer Turno | Segundo Turno | Tercer Turno |
--------------------------------------------------------------------------------------------------------------------------
|Operaciones | Acumulado | |Operaciones | Acumulado | |Operaciones | Acumulado |
--------------------------------------------------------------------------------------------------------------------------
06:00 - 07:00 | 1500 | 75,000.00 |14:00 - 15:00 | 1500 | 75,000.00 |22:00 - 23:00 | 1500 | 75,000.00 |
--------------------------------------------------------------------------------------------------------------------------
07:00 - 08:00 | 1500 | 75,000.00 |15:00 - 16:00 | 1500 | 75,000.00 |23:00 - 00:00 | 1500 | 75,000.00 |
--------------------------------------------------------------------------------------------------------------------------
08:00 - 09:00 | 1500 | 75,000.00 |16:00 - 17:00 | 1500 | 75,000.00 |00:00 - 01:00 | 1500 | 75,000.00 |
--------------------------------------------------------------------------------------------------------------------------
09:00 - 10:00 | 1500 | 75,000.00 |17:00 - 18:00 | 1500 | 75,000.00 |01:00 - 02:00 | 1500 | 75,000.00 |
--------------------------------------------------------------------------------------------------------------------------
10:00 - 11:00 | 1500 | 75,000.00 |18:00 - 19:00 | 1500 | 75,000.00 |02:00 - 03:00 | 1500 | 75,000.00 |
--------------------------------------------------------------------------------------------------------------------------
11:00 - 12:00 | 1500 | 75,000.00 |19:00 - 20:00 | 1500 | 75,000.00 |03:00 - 04:00 | 1500 | 75,000.00 |
--------------------------------------------------------------------------------------------------------------------------
12:00 - 13:00 | 1500 | 75,000.00 |20:00 - 21:00 | 1500 | 75,000.00 |04:00 - 05:00 | 1500 | 75,000.00 |
--------------------------------------------------------------------------------------------------------------------------
13:00 - 14:00 | 1500 | 75,000.00 |21:00 - 22:00 | 1500 | 75,000.00 |05:00 - 06:00 | 1500 | 75,000.00 |
--------------------------------------------------------------------------------------------------------------------------
Resumen | 12,000 | 600,000.00 |Resumen | 12,000 | 600,000.00 |Resumen | 12,000 | 600,000.00 |
--------------------------------------------------------------------------------------------------------------------------


La idea es mostrar los datos de fabricacion de una sola vista, que el operador no tenga que mover el raton o el teclado para actualizarse al momento. Las columnas horario son fijas y las filas de titulos tambien.

Por lo que he visto con el stringgrid solo podre hacerlo en forma vertical y explorar con la barra vertical, o la otra chapucera meter un TPanel y dentro de el tres (3) TStringgrid.

¿Alguna otra idea?

Caral 04-08-2010 22:32:57

Hola
No entiendo amigo.
Segun lo que veo necesitas dos lineas horizontales fijas arriba para los titulos y nueve columnas verticales fijas para los horarios y el resumen.
El resto de la informacion me imagino que sera sacada de la BD.
No entiendo el problema, el stringgrid puede hacer eso sin problemas.
Tal vez entiendo mal.
Saludos

Caral 04-08-2010 23:10:15

Hola
Aqui tienes un ejemplo de lo que pides.
Espero te de alguna idea.
Saludos
PD: No le pidas mucho es hecho por un Novato.:D

ContraVeneno 05-08-2010 00:54:31

¿un TjvMemoryData? (jv = JEDI VCL)

lo puedes llenar con los campos que necesites y le puedes dar todo el manejo que le darías a una base de datos... al menos no tendrías que manejar todo como cadenas y tener que estar haciendo conversiones...

¿un clientdataset?
Este tiene las mismas ventajas que el TjvmemoryData más algunas otras monerías en caso de que lo fueras a enlazar a una base de datos...

FGarcia 05-08-2010 02:13:57

1 Archivos Adjunto(s)
Bueno a lo que habia llegado hasta el momento es:

Código Delphi [-]
unit UfrmCaptura;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, ComCtrls, TeEngine, ExtCtrls, TeeProcs, Chart;

type
  TfrmCaptura = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
  private
    { Private declarations }
    procedure InicializaStringGrid;
  public
    { Public declarations }
  end;

var
  frmCaptura: TfrmCaptura;

implementation

{$R *.dfm}

procedure TfrmCaptura.FormCreate(Sender: TObject);
begin
  InicializaStringGrid;
end;

procedure TfrmCaptura.FormShow(Sender: TObject);
begin
  //Unos datos solo para visualizar
  Stringgrid1.cells[1,2] := '12.000';
  StringGrid1.Cells[2,2]:= '50,000.00'; 
end;

//Este procedimiento llena las filas de la rejilla con los encabezados
procedure TfrmCaptura.InicializaStringGrid ;
var
  r,a,p: integer;
begin

   with StringGrid1 do
    begin
      Top := 8;
      Left := 8;
      Height := 279;
      Width := 246;

      ColCount := 3;
      RowCount:= 29;
      fixedRows := 2;
      fixedCols := 1;

      Cells[0,1] := 'Hora';
      ColWidths[0] := 80;

      Cells[1,1] := 'Operaciones';
      ColWidths[1] := 70;

      Cells[2,1] := 'Acumulado';
      ColWidths[2] := 70;
    end;
  
  //Aqui lleno los renglones de los horarios
  for r := 0 to 26 do  
    begin
      case r  of
        0 : begin
              a := 6;
              p := a + 1;
              StringGrid1.Cells[0,(r + StringGrid1.FixedRows )] := IntToStr(a)+ ':00' +
                                                      ' - ' +
                                                      IntToStr(p) + ':00';
            end;
        8,17,26 : StringGrid1.Cells[0,(r + StringGrid1.FixedRows )] := 'Resumen';
       20 : begin
              a := 0;
              p := a + 1;
              StringGrid1.Cells[0,(r + StringGrid1.FixedRows )] := IntToStr(a)+ ':00' +
                                                      ' - ' +
                                                      IntToStr(p) + ':00';
            end ;
       else
          begin
            a := p;
            p := p + 1;
            StringGrid1.Cells[0,(r + StringGrid1.FixedRows )] := IntToStr(a)+ ':00' +
                                                      ' - ' +
                                                      IntToStr(p) + ':00';
          end;
      end;
    end;


end;

//Este procedimiento alinea a la derecha el contenido de las celdas. Tambien da
//color a las columnas en el StringGrid 1
procedure TfrmCaptura.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var sCad: String;
    i: Integer;
begin
  If (ACol=1) Or (ACol=2) Then
    if ARow > 1 then //No quiero alinear la línea de títulos
      If StringGrid1.Cells[ACol,ARow] <> '' Then
        Begin
          sCad := StringGrid1.Cells[ACol,ARow];
          With StringGrid1 Do
            with Canvas,Rect do
              Begin
                Canvas.Brush.Style := bsSolid;
                case ACol of
                  1: Canvas.Brush.Color := clYellow;
                  2: Canvas.Brush.Color := clRed;
                end;
                i:=Right-TextWidth(sCad+' ');
                Canvas.FillRect(Rect);
                Canvas.TextOut(i,Top+2,sCad);
              End;
        End;
end;

end.

No pongo el archivo pues uso d2010 y parece ser que no es posible abrirlo con versiones anteriores. El formulario es un simple form con un StringGrid. El codigo de la Unit le da tamaño y posicion.

Editando: Caral como puedes ver para la columna horario estoy usando la propiedad FixedRows, tu ejemplo me dio otras ideas.

Contraveneno la verdad no me caen muy bien las jedi, ya d2010 se tarda años en arrancar y todavia cargar la JVCL..... De todos modos no hecho en saco roto tu propuesta.

Caral 05-08-2010 02:23:49

Hola
Me alegra que te sirviera de algo.
Lo hice en un ratito, pero se pueden hacer muchas cosas con este componente.
Yo lo uso en mi sistema en varios form, sobre todo en el de facturacion.
Saludos

FGarcia 05-08-2010 04:29:10

1 Archivos Adjunto(s)
Hice unas modificaciones para ver la rejilla como la necesito pero me he topado con problemas al dibujarla.

Del codigo anterior que puse modifique esta propiedad del StringGrid

Código Delphi [-]
//Este procedimiento alinea a la derecha el contenido de las celdas. Tambien da
//color a las columnas en el StringGrid 1
procedure TfrmCaptura.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var sCad: String;
    i: Integer;
begin
  //Aqui pinto las columnas "fijas"
  if (ACol = 0) or (Acol = 3) or (Acol = 6) then
    if ARow > 1 then
      If StringGrid1.Cells[ACol,ARow] <> '' Then
      begin
        sCad := StringGrid1.Cells[ACol,ARow];
        With StringGrid1 Do
          with Canvas,Rect do
            Begin
              Canvas.Brush.Style := bsSolid;
              case ACol of
                0: Canvas.Brush.Color := clMoneyGreen;
                3: Canvas.Brush.Color := clSkyBlue;
                6: Canvas.Brush.Color := clAqua;
              end;
              Canvas.FillRect(Rect);
              Canvas.TextOut(0,Top + 2,sCad);
            End;
      end;

  If (ACol=1) Or (ACol=2) Then
    if ARow > 1 then //No quiero alinear la línea de títulos
      If StringGrid1.Cells[ACol,ARow] <> '' Then
        Begin
          sCad := StringGrid1.Cells[ACol,ARow];
          With StringGrid1 Do
            with Canvas,Rect do
              Begin
                Canvas.Brush.Style := bsSolid;
                case ACol of
                  1: Canvas.Brush.Color := clYellow;
                  2: Canvas.Brush.Color := clRed;
                end;
                i:=Right-TextWidth(sCad + ' '); //Aqui se alinea a la derecha
                Canvas.FillRect(Rect);
                Canvas.TextOut(i,Top + 2,sCad);
              End;
        End;
end;

Una manita para ver por que no se redibuja correctamente.

Neftali [Germán.Estévez] 05-08-2010 10:14:55

Cita:

Empezado por FGarcia (Mensaje 372620)
l momento. Las columnas horario son fijas y las filas de titulos tambien.

No acabo de entender los de los tres paneles... :confused:
El stringGrid posee propiedades para definir cuantas filas y cuantas columnas fijas necesitas.

Neftali [Germán.Estévez] 05-08-2010 10:21:52

Cita:

Empezado por FGarcia (Mensaje 372663)
No pongo el archivo pues uso d2010 y parece ser que no es posible abrirlo con versiones anteriores. El formulario es un simple form con un StringGrid. El codigo de la Unit le da tamaño y posicion.

Puedes poner el código. Si usas componentes estandard, basta con ignorar algunas propiedades y se abre sin mayores problemas en Delphi 6.

Neftali [Germán.Estévez] 05-08-2010 10:25:09

Cita:

Empezado por FGarcia (Mensaje 372676)
Una manita para ver por que no se redibuja correctamente.

¿No entiendo qué es lo que te falta?
¿Se trata de que se dibuje como en la imagen que adjuntas?

Puedes automatizar las cosas; Por ejemplo, para rellenar las horas puedes usar algo así:

Código Delphi [-]
  // rellenar horas
  for i := 0 to 2 do begin
    // rellenar las horas
    for j := 0 to 8 do begin
      Str := Format('%.2d:00',[j+(i*8)]) + ' - ' + Format('%.2d:00',[(j+(i*8)+1) mod 24]);
      StringGrid1.Cells[i * 3, (j) + 2] := Str;
    end;
  end;

Neftali [Germán.Estévez] 05-08-2010 12:10:46

Lo bueno del TStringGrid es que el pintado es relatívamente sencillo; POr ejemplo, para el tema de los títulos con algo de código en el evento OnDrawCell puedes conseguir algo así:



Código Delphi [-]
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  sCad: String;
  i: Integer;

  procedure _PaintTitle1(ACol:integer);
  var
    ATitle:string;
  begin

    if (ACol=0) or (ACol=1) or (ACol=2) then begin
      ATitle := 'Primer turno';
    end
    else if (ACol=3) or (ACol=4) or (ACol=5) then begin
      ATitle := 'Segundo turno';
    end
    else if (ACol=6) or (ACol=7) or (ACol=8) then begin
      ATitle := 'Tercer turno';
    end;

    InflateRect(Rect, -1, -2);

    StringGrid1.Canvas.Pen.Color := clBlack;
    StringGrid1.Canvas.Brush.Style := bsSolid;
    StringGrid1.Canvas.Brush.Color := $00E6E6E6;
    StringGrid1.Canvas.Rectangle(Rect);
    Application.ProcessMessages;
    StringGrid1.Canvas.TextOut(Rect.Left + 5,Rect.Top + 3, ATitle);
    Application.ProcessMessages;
  end;

  procedure _PaintTitle2(ACol:integer);
  var
    ATitle:string;
  begin

    if (ACol=0) or (ACol=3) or (ACol=6) then begin
      ATitle := 'Hora';
    end
    else if (ACol=1) or (ACol=4) or (ACol=7) then begin
      ATitle := 'Operaciones';
    end
    else if (ACol=2) or (ACol=5) or (ACol=8) then begin
      ATitle := 'Acumulado';
    end;

    InflateRect(Rect, -1, -2);

    StringGrid1.Canvas.Pen.Color := clBlack;
    StringGrid1.Canvas.Brush.Style := bsSolid;
    StringGrid1.Canvas.Brush.Color := $00E6E6E6;
    StringGrid1.Canvas.Rectangle(Rect);
    Application.ProcessMessages;
    StringGrid1.Canvas.TextOut(Rect.Left + 5,Rect.Top + 3, ATitle);
    Application.ProcessMessages;
  end;

begin

  StringGrid1.Options := StringGrid1.Options - [goFixedVertLine];

  if (ARow = 0) then begin
    if (ACol=0) or (ACol=3) or (ACol=6) then begin
      Rect.Right := Rect.Right + StringGrid1.ColWidths[ACol+1] + StringGrid1.ColWidths[ACol+2];
      _PaintTitle1(ACol);
    end;
    if (ACol=1) or (ACol=4) or (ACol=7) then begin
      Rect.Left := Rect.Left - StringGrid1.ColWidths[ACol-1];
      Rect.Right := Rect.Right - StringGrid1.ColWidths[ACol+1];
      Rect.Left := Rect.Left-1;
      _PaintTitle1(ACol);
    end;
    if (ACol=2) or (ACol=5) or (ACol=8) then begin
      Rect.Left := Rect.Left - StringGrid1.ColWidths[ACol-1] - StringGrid1.ColWidths[ACol-2];
      Rect.Left := Rect.Left-2;
      _PaintTitle1(ACol);
    end;
  end;

  if (ARow = 1) then begin
    _PaintTitle2(ACol);
  end;

yapt 05-08-2010 14:01:09

Cita:

Empezado por FGarcia (Mensaje 372663)
No pongo el archivo pues uso d2010 y parece ser que no es posible abrirlo con versiones anteriores.

Muchos aquí ya usamos Delphi 2010 desde hace un tiempo.

Neftali [Germán.Estévez] 05-08-2010 14:11:07

Algunos otros usamos Delphi2010 para los nuevos y Delphi6 para los antiguos... :)

yapt 05-08-2010 16:20:46

Cada uno disfruta como mejor le parece..... ;)

FGarcia 05-08-2010 18:34:42

Pues si, Neftali entendiste perfectamente lo que quiero hacer con la StringGrid. Por vistosidad queria colorear las columnas de los horarios pero con el codigo que puse en mi ultimo mensaje si se coloreaban, pero solo la primera columna mostraba el texto de los horarios mientras que las columnas 3 y 6 solo mostraban el color no se pintaba el texto. Esos eran mis problemas.

El codigo que muestras me indica que no se nada de nada!!! :( :( :(

Yapt, mil disculpas, en ningun momento fue intencion menospreciar a alguien por lo del d2010

Neftali [Germán.Estévez] 05-08-2010 18:57:57

Cita:

Empezado por FGarcia (Mensaje 372731)
...en ningun momento fue intencion menospreciar a alguien por lo del d2010

No te preocupes, yo al menos no lo entendí así.

Si añades código al que te he puesto, no te será muy dicícil añadir coloración a las columnas.


La franja horaria es GMT +2. Ahora son las 06:43: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