Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ¿Cómo esconder o eliminar el vertical ScrollBar de un DBGrid? (https://www.clubdelphi.com/foros/showthread.php?t=55512)

enecumene 18-04-2008 16:01:01

¿Cómo esconder o eliminar el vertical ScrollBar de un DBGrid?
 
Hola Compañeros del foro, pues eso como reza el titulo, ¿alguien sabe cómo hacerlo?, Agradecido de antemano.

Saludos.

PD. Utilizo Delphi 7.

gluglu 18-04-2008 16:13:50

Permíteme, compañero, que te remita aqui al respecto ;)

eduarcol 18-04-2008 16:27:52

probando la solucion me parece que en el evento afterscroll del dataset cumple la funcion, se ve un ligero parpadeo del repintado pero es mejor que estar dibujando Paneles, a mi manera de ver las cosas.

pero sigo sin enteder que mal puede hacer el pobre scroll alli :D

edito:
Para el que no sepa de lo que se habla, me refiero a la instruccion
Cita:

ShowScrollBar(Grid.Handle,SB_HORZ,false);

gluglu 18-04-2008 16:53:23

Cita:

ShowScrollBar(Grid.Handle, SB_HORZ, false);
No estabamos hablando de la barra 'vertical' ? :o

eduarcol 18-04-2008 16:59:30

Cita:

Empezado por gluglu (Mensaje 281033)
No estabamos hablando de la barra 'vertical' ? :o

bueno, ya me voy a tener que ir a dormir :D:D

enecumene 18-04-2008 17:05:44

Cita:

Empezado por gluglu (Mensaje 281020)
Permíteme, compañero, que te remita aqui al respecto ;)

Gracias GluGlu, tome la opción de Neftali y me funciona perfectamente y gracias también a Eduarcol.

En unos momentos pondré el componente aquí.

Saludos.

enecumene 18-04-2008 17:19:56

1 Archivos Adjunto(s)
Pues he aquí el componente, una Grilla sin el Vertical ScrollBar, Gracias al código de Neftalí via Link por GluGlu, voy a seguir jugando con el componente haciendole varias modificaciones.

Archivo Adjunto 1231

Saludos.

roman 18-04-2008 18:34:04

Partiendo del código de Neftalí podríamos intentar detectar cuando son necesarias las barras:

Código Delphi [-]
procedure TExtendedDBGrid.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;

// Saludos

enecumene 18-04-2008 18:48:49

Gracias Román, debo decirte que el código que propones me dio problemas, en tiempo de diseño no muestra los borde ni los scroll, pero me tira este error:

Cita:

---------------------------
Error
---------------------------
Access violation at address 51007648 in module 'dclusr70.bpl'. Read of address 00000030.
---------------------------
OK
---------------------------
Me lo tira al momento de ponerlo en el Form y al momento en que le altero el tamaño del grid, en cambio, en tiempo de ejecución los Scroll vuelven a aparecer.

Saludos.

EDITO: No me di cuenta que el código indica que los ScrollBars aparecerán cuando sean necesarias. Perdón Román.

roman 18-04-2008 18:56:24

Cita:

Empezado por enecumene (Mensaje 281057)
EDITO: No me di cuenta que el código indica que los ScrollBars aparecerán cuando sean necesarias. Perdón Román.

¿Entonces? ¿Funciona o no? ¿Qué fue del Access Violation? :confused:

// Saludos

enecumene 18-04-2008 19:02:08

Cita:

Empezado por roman (Mensaje 281059)
¿Entonces? ¿Funciona o no? ¿Qué fue del Access Violation? :confused:

// Saludos

Ello me funciona, el error me aparece en tiempo de diseño, sólo cuando lo inserto en el formulario y le altero el tamaño, lo demás está bien.

Saludos.

roman 18-04-2008 19:23:52

1 Archivos Adjunto(s)
Cita:

Empezado por enecumene (Mensaje 281061)
el error me aparece en tiempo de diseño

¿Estás seguro de haber englobado el código con el condicional: ?

Código Delphi [-]
if Assigned(DataSource) and Assigned(DataSource.DataSet) then

Porque originalmente lo había olvidado. La prueba la había hecho "en vivo" de manera que no tenía una componente como tal. Ahora ya lo he hecho y no me ha causado problema. Si de algo sirve adjunto aquí la componente.

// Saludos

enecumene 18-04-2008 19:33:23

Excelente Amigo Román, ahora sí funciona. Agradecido enormemente!!.

Saludos.

enecumene 18-04-2008 20:36:29

Bueno, dejo este componente que he hecho basado en los códigos de Román y Neftalí, se trata de un DBGrid con las siguientes propiedades:

- AutomaticScroll : Al ponerlo en True los scroll se activan cuando sean necesarios.
- VerticalScroll : Activa y desactiva el Vertical ScrollBar.
- HorizontalScroll : Activa y desactiva el Horizontal ScrollBar.

Aquí el link disponible en el FTP del Club.

Espero comentarios y criticas y que lo disfruten.

Gracias Román, Neftalí, GluGlu y Eduarcol.

Saludos.

roman 18-04-2008 20:50:27

Sí, yo tengo algunos comentarios.

El primero es para pedirte que no escribas cosas como

Código Delphi [-]
if AutomaticScroll = True then

ya que es redundante; basta poner

Código Delphi [-]
if AutomaticScroll then

Es como decir "orillate a la orilla", "sube arriba", "sal afuera"; se entiende pero suena feo.

Otra cosa es que no entiendo el propósito de las propiedades VerticalScrollBar y HorizontalScrollBar. Si las pones en false pero AutomaticScroll está en true, de todas maneras aparecen si hay muchos registros.

Finalmente, que estas propiedades deben tener un "setter"

Código Delphi [-]
property AutomaticScroll: Boolean read FAutomaticScroll write SetAutomaticScroll;

en el que obligues al control a reajustarse para reflejar el cambio.

// Saludos

enecumene 18-04-2008 21:26:18

¿y ahora cómo queda amigo Román siguiendo tus consejos?:

Código Delphi [-]
unit DBGrilla1;

interface

uses
  SysUtils, Classes, Controls, Grids, DBGrids, Messages, SHELLAPI, windows;

type
  TDBGrilla = class(TDBGrid)
  private
    FValorVertical: Boolean;
    FValorHorizontal: Boolean;
    FScrollAutomatico: Boolean;

    procedure WMNCCalcSize(var msg: TMessage); message WM_NCCALCSIZE;
  protected
      procedure setAutomaticScroll(Value: Boolean);
      procedure setVerticalScrollBar(Value: Boolean);
      procedure setHorizontalScrollBar(Value: Boolean);
  public
    { Public declarations }
  published
    property VerticalScrollBar: Boolean read FValorVertical write setVerticalScrollBar;
    property HorizontalScrollBar: Boolean read FValorHorizontal write setHorizontalScrollBar;
    property AutomaticScroll: Boolean read FScrollAutomatico write setAutomaticScroll;
  end;

procedure Register;

implementation

procedure TDBGrilla.setAutomaticScroll(Value: Boolean);
begin
  if Value <> FScrollAutomatico then
  begin
    FScrollAutomatico := Value;
  end;
end;

procedure TDBGrilla.setVerticalScrollBar(Value: Boolean);
begin
  if Value <> FValorVertical then
  begin
    FValorVertical := Value;
  end;
end;

procedure TDBGrilla.setHorizontalScrollBar(Value: Boolean);
begin
  if Value <> FValorHorizontal then
  begin
    FValorHorizontal := Value;
  end;
end;

procedure TDBGrilla.WMNCCalcSize(var msg: TMessage);
var
  style: Integer;
begin
if VerticalScrollBar then
  begin
  style := getWindowLong( handle, GWL_STYLE );

  if (style and WS_HSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_HSCROLL );
  if (style and WS_VSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_VSCROLL );
  end;
if HorizontalScrollBar then
  begin
  style := getWindowLong( handle, GWL_STYLE );

  if (style and WS_VSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_VSCROLL );
  if (style and WS_HSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_HSCROLL );
  end;
if AutomaticScroll then
  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;
end;
  inherited;
end;

procedure Register;
begin
  RegisterComponents('Data Controls', [TDBGrilla]);
end;

end.

Saludos.

gluglu 19-04-2008 15:20:31

He intentado crear este componente en BDS 2006 VCL.Net y al ejecutar inherited me da error. Al igual que en su momento lo intenté con el código de Neftalí.

En cualquier caso, me gustaría retomar el hilo para preguntar si verdaderamente va a funcionar con TQuery's o TDataSet's ya que nos estamos basando en una propiedad del DataSet que es RecordCount para saber si debemos o no pintar la ScrollBar vertical.

Pero a mi entender la propiedad RecordCount de un TDataSet siempre devuelve -1, no es verdad ? :confused:

A no ser que previamente hayamos leido 'todos' los registros que incorpore el DataSet, por ejemplo con un 'Last'. Pero eso vuelve a contradecir un poco la filosofía de los TQuery's y el tráfico generado por traer todos los registros de un Select.

A lo mejor estoy equivocado y por eso pregunto.

Saludos de nuevo a todos y gracias por vuestros comentarios :)

eduarcol 19-04-2008 15:34:49

Cita:

Empezado por gluglu (Mensaje 281197)
He intentado crear este componente en BDS 2006 VCL.Net y al ejecutar inherited me da error. Al igual que en su momento lo intenté con el código de Neftalí.

En cualquier caso, me gustaría retomar el hilo para preguntar si verdaderamente va a funcionar con TQuery's o TDataSet's ya que nos estamos basando en una propiedad del DataSet que es RecordCount para saber si debemos o no pintar la ScrollBar vertical.

Pero a mi entender la propiedad RecordCount de un TDataSet siempre devuelve -1, no es verdad ? :confused:

A no ser que previamente hayamos leido 'todos' los registros que incorpore el DataSet, por ejemplo con un 'Last'. Pero eso vuelve a contradecir un poco la filosofía de los TQuery's y el tráfico generado por traer todos los registros de un Select.

A lo mejor estoy equivocado y por eso pregunto.

Saludos de nuevo a todos y gracias por vuestros comentarios :)

a ver, aventurandome un poco y sin conocer mucho del tema, yo pienso que si deberia funcionar el recordcount, ya que estamos hablando de los registros visibiles en el grid, entonces en ese momento un count deberia devolver el numero correcto de registros...

gluglu 19-04-2008 16:08:59

Estimado Eduardo,

Desde mi punto de vista ese no es el enfoque que al menos yo le estoy dando al problema. A lo mejor yo también me equivoco.

Yo lo que trato es de obtener un DBGrid que cuando el número de Registros que me devuelve un 'Select' supere el número de registros visibles en el DBGrid, entonces me muestre la barra de Scroll vertical.

Si el número de registros devuelto por el Select es menor que el número de líneas que en pantalla tiene el grid, entonces me oculte la barra vertical.

Si por ejemplo, tengo un Grid con 5 líneas visibles en pantalla, si un Select me devuelve 3 registros, entonces no me muestr la barra vertical, ya que no hay ningún scroll que hacer al tener ya mostrados todos los registros en pantalla.

Si en cambio obtengo 7 registros de mi consulta, entonces si que necesito el ScrollBar vertical, porque para ver todos los registros de mi select necesitaré hacer un 'Scroll'.

Pero es ahí donde retomo el asunto del RecordCount. Si mi Select me devuelve 1 millón de registros, el RecorCount me devuelve en principio -1 y a mi entender, el componente expuesto no funcionaría correctamente.

:o

eduarcol 19-04-2008 16:31:28

bueno con los zeos no he tenido ese problema, debe ser que no traigo tantos registros al cliente, pero el recordcount cuando esta conectado al grid generalmente si funciona bien


La franja horaria es GMT +2. Ahora son las 02:04:15.

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