Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Scroll errático en StringGrid (https://www.clubdelphi.com/foros/showthread.php?t=95254)

mRoman 23-06-2021 00:14:03

Scroll errático en StringGrid
 
1 Archivos Adjunto(s)
Hola amigos, buenas tardes.

Trabajo con: Delphi6, FB 2.0, Win10, IBX.

Estoy trabajando con un StringGrid al cual le desactive las barras de desplazamiento, porque las pienso controlar con 2 Botones (tBitBtn), los cuales tienen el siguiente código:

Botón hacia arriba:

Código Delphi [-]
procedure TfrmRegComanda.sBtnUPDetalleClick(Sender: TObject);
begin
   TWinControl(SG).ScrollBy(0,DELTA_B);
end;

Botón hacia abajo:
Código Delphi [-]
procedure TfrmRegComanda.sBtnDownDetalleClick(Sender: TObject);
begin
   TWinControl(SG).ScrollBy(0,-DELTA_B);
end;

Declaro como constante a DELTA:
Código Delphi [-]
implementation
uses ModuloBD, MeseroMain,MeseroAbrirMesas, MeseroEditarProdComanda, MeseroLogin;

 Const
    DELTA=260;
    DELTA_B=10;

{$R *.dfm}

2 cosas que quiero hacer:

1.- Activar los botones cuando la cantidad de lineas del StringGrid sobre pase la zona de visión, que es cuando las barras de desplazamiento se activan automáticamente, pero la tengo desactivada ya que los botones harán esa función, entonces como activar los botones cuando haya muchos renglones.

2.- El StringGrid tiene un comportamiento extraño cuando presiono el botón que debería desplazar hacia abajo los registros, me duplica el encabezado

Pero el StringGrid al desplazarme hacia arriba el encabezado se empieza a duplicar y encimarse...(no se como explicarlo) (Anexo imagen)

Y también el otro botón tiene un comportamiento similar.

Alguien q me pudiera ayudar a como resolver estos 2 problemas?.

Gracias.

ecfisa 23-06-2021 01:37:04

Hola.

Creo que te resultará mas simple manejar el scroll controlando la propiedad TopRow del TStringGrid.

Ejemplo:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  c, r: Integer;
begin
  for c := 0 to SG.ColCount-1 do
    for r := 0 to SG.RowCount-1 do
      SG.Cells[ c, r ] := Chr(65+c+r);
end;

procedure TForm1.sbBtnDownClick(Sender: TObject);
begin
  if SG.TopRow > SG.FixedRows then
    SG.TopRow := SG.TopRow - 1;
end;

procedure TForm1.sbBtnUpClick(Sender: TObject);
begin
  if SG.TopRow < SG.RowCount-1 then
    SG.TopRow := SG.TopRow + 1;
end;

Efecto:


Saludos :)

mRoman 23-06-2021 01:55:11

Cita:

Empezado por ecfisa (Mensaje 541451)
Hola.

Creo que te resultará mas simple manejar el scroll controlando la propiedad TopRow del TStringGrid.

Ejemplo:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  c, r: Integer;
begin
  for c := 0 to SG.ColCount-1 do
    for r := 0 to SG.RowCount-1 do
      SG.Cells[ c, r ] := Chr(65+c+r);
end;

procedure TForm1.sbBtnDownClick(Sender: TObject);
begin
  if SG.TopRow > SG.FixedRows then
    SG.TopRow := SG.TopRow - 1;
end;

procedure TForm1.sbBtnUpClick(Sender: TObject);
begin
  if SG.TopRow < SG.RowCount-1 then
    SG.TopRow := SG.TopRow + 1;
end;

Efecto:


Saludos :)

Ok, muchísimas gracias Daniel, eso era lo q estaba buscando. Vi las propiedades de RowCount q efectivamente lo use para saber cuantas líneas tenia y estaba explorando el TopRow, cuando envié el hilo....nuevamente muchas gracias.

Con esto ya no usaré DELTA?...

p.d. No, ya no usaré DELTA, ya vi que no.!.

Saludos.

ecfisa 23-06-2021 03:12:19

Hola.

Creo que un código mas aproximado a lo que buscas podría ser:
Código Delphi [-]
procedure TForm1.sbBtnDownClick(Sender: TObject);
begin
  if SG.TopRow > SG.FixedRows then
    SG.TopRow := SG.TopRow - 1
  else
    SG.Row := SG.Row + 1;
end;

procedure TForm1.sbBtnUpClick(Sender: TObject);
begin
  if (SG.Row = SG.FixedRows) and (SG.TopRow = SG.RowCount-1) then
    SG.TopRow := SG.TopRow + 1
  else if SG.Row > SG.FixedRows  then
    SG.Row := SG.Row - 1;
end;

Saludos :)

mRoman 23-06-2021 17:56:45

Cita:

Empezado por ecfisa (Mensaje 541454)
Hola.

Creo que un código mas aproximado a lo que buscas podría ser:
Código Delphi [-]
procedure TForm1.sbBtnDownClick(Sender: TObject);
begin
  if SG.TopRow > SG.FixedRows then
    SG.TopRow := SG.TopRow - 1
  else
    SG.Row := SG.Row + 1;
end;

procedure TForm1.sbBtnUpClick(Sender: TObject);
begin
  if (SG.Row = SG.FixedRows) and (SG.TopRow = SG.RowCount-1) then
    SG.TopRow := SG.TopRow + 1
  else if SG.Row > SG.FixedRows  then
    SG.Row := SG.Row - 1;
end;

Saludos :)

Excelente muchas gracias, funciona a la perfección!


La franja horaria es GMT +2. Ahora son las 02:18:12.

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