Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Controlar scrollbars en DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=84363)

jocaro 10-10-2013 14:21:10

Controlar scrollbars en DBGrid
 
Hola, deseo que las barras de scroll del DBGrids, sólo aparezcan cuando hay mas registros de los que se pueden mostrar en pantalla.

He leido este hilo sobre el tema http://www.clubdelphi.com/foros/showthread.php?t=55512

He registrado el componente que roman adjunta en el archivo AutoSBDBGrid.zip y he insertado un rmDBGrid en mi aplicación, pero éste sigue apareciendo con ambas barras de scroll, aunque todos los registros aparecen en el rmDBGrid.

¿Mi duda es si tengo que hacer algún cambio más en la aplicación, si hay que utilizar algún evento del rmDBGrid o de su dataset o hacer alguna llamada a la procedure WMNCCalcSize?

Espero que alguno de vosotros me pueda ayudar, gracias de antemano.

Un saludo

Pericles 10-10-2013 16:01:10

Control scrollbar en BDgrid
 
Hola, buscando por ahi veo que alguien sobreescribe el metodo de refresco de la barra de scroll. En el ejemplo solo se indica si se muestran o no las barras.(funciona perfecto).
Para lo que planteas (habria que probar) se me ocurre evaluar cantidad de registros que soporta tu dbgrid (segun el alto del grid) y la cantidad de registros en el Dataset.


Saludos
Nicolas Perichon

Código Delphi [-]

....
type
  TDBGrid = class(DBGrids.TDBGrid)
  private
    procedure UpdateScrollBar; override;
  end;
...


implementacion del metodo:

Código Delphi [-]

procedure TDBGrid.UpdateScrollBar;

begin
  
 IF bdGrid.datasource.dataset.fields.count > cantidadMaxima  THEN ShowScrollBar(form1.DBGrid1.Handle, SB_VERT, False);

 
  //ShowScrollBar(form1.DBGrid1.Handle, SB_HORZ, False);

  end;

jocaro 11-10-2013 13:37:20

Gracias Pericles por tu ayuda

En mi caso, he probado el código, pero el dbgrid sigue presentando ambas barras de scroll, incluso si el área del dbgrid es suficientemente grande para presentar todos los registros. No se si será debido a un error mio, a la versión del Delphi (XE2)...

Espero que alguno de vosotros pueda indicarme un pequeño ejemplo del uso del componente de roman:

Código Delphi [-]
unit AutoSBDBGrid;

interface

uses
  Windows, Messages, Classes, DBGrids;

type
  TrmDBGrid = class(TDBGrid)
  protected
    procedure WMNCCalcSize(var msg: TMessage); message WM_NCCALCSIZE;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TrmDBGrid]);
end;

{ TrmDBGrid }

procedure TrmDBGrid.WMNCCalcSize(var msg: TMessage);
var
  Style: Integer;

begin
  if Assigned(DataSource) and Assigned(DataSource.DataSet) then
  begin
    Style := GetWindowLong(Handle, GWL_STYLE);

    if DataSource.DataSet.RecordCount > VisibleRowCount then
      Style := Style or WS_VSCROLL
    else
      Style := Style and not WS_VSCROLL;

    SetWindowLong(Handle, GWL_STYLE, Style);
  end;

  inherited;
end;

end.

Gracias

ecfisa 11-10-2013 22:49:18

Hola jocaro.

Otra forma podría ser usando el evento OnDataChange del TDataSource asociado:
Código Delphi [-]
...
type
  TDBGrid = class(DBGrids.TDBGrid);
  TTuForm = class(TForm)
    ...
    TuDataSource: TDataSource;
    TuDBGrid: TDBGrid;
    procedure TuDataSourceDataChange(Sender: TObject; Field: TField);
  ...

implementation

procedure TTuForm.TuDataSourceDataChange(Sender: TObject; Field: TField);
begin
  with TuDBGrid do
    ShowScrollBar(Handle, SB_VERT + SB_CTL, DataSource.DataSet.RecordCount > VisibleRowCount);
end;
Funciona en Delphi 7, pero habrá que ver en XE2...

Saludos :)

jocaro 14-10-2013 14:40:04

Gracias ecfisa

Funciona correctamente en XE2

Un saludo


La franja horaria es GMT +2. Ahora son las 13:37:30.

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