Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
¿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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #2  
Antiguo 18-04-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Permíteme, compañero, que te remita aqui al respecto
__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 18-04-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
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

edito:
Para el que no sepa de lo que se habla, me refiero a la instruccion
Cita:
ShowScrollBar(Grid.Handle,SB_HORZ,false);
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #4  
Antiguo 18-04-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Cita:
ShowScrollBar(Grid.Handle, SB_HORZ, false);
No estabamos hablando de la barra 'vertical' ?
__________________
Piensa siempre en positivo !
Responder Con Cita
  #5  
Antiguo 18-04-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
Cita:
Empezado por gluglu Ver Mensaje
No estabamos hablando de la barra 'vertical' ?
bueno, ya me voy a tener que ir a dormir
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #6  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por gluglu Ver Mensaje
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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #7  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.

DBGrilla.zip

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #8  
Antiguo 18-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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

Última edición por roman fecha: 18-04-2008 a las 18:36:18.
Responder Con Cita
  #9  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.

Última edición por enecumene fecha: 18-04-2008 a las 18:51:30.
Responder Con Cita
  #10  
Antiguo 18-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por enecumene Ver Mensaje
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?

// Saludos
Responder Con Cita
  #11  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por roman Ver Mensaje
¿Entonces? ¿Funciona o no? ¿Qué fue del Access Violation?

// 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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #12  
Antiguo 18-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por enecumene Ver Mensaje
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
Archivos Adjuntos
Tipo de Archivo: zip AutoSBDBGrid.zip (2,0 KB, 21 visitas)
Responder Con Cita
  #13  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Excelente Amigo Román, ahora sí funciona. Agradecido enormemente!!.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #14  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #15  
Antiguo 18-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #16  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
¿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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.

Última edición por enecumene fecha: 18-04-2008 a las 21:35:43.
Responder Con Cita
  #17  
Antiguo 19-04-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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 ?

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
__________________
Piensa siempre en positivo !
Responder Con Cita
  #18  
Antiguo 19-04-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
Cita:
Empezado por gluglu Ver Mensaje
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 ?

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...
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #19  
Antiguo 19-04-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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.

__________________
Piensa siempre en positivo !
Responder Con Cita
  #20  
Antiguo 19-04-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
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
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Scrollbar Vertical desaparece del DBGRID jmlifi OOP 4 27-04-2007 20:54:43
¿Como Eliminar de la Bd el item seleccionado en un DbGrid? day_eli Conexión con bases de datos 1 09-02-2007 16:36:33
eliminar scrollbar en DBGRID cocke C++ Builder 2 25-11-2006 05:01:51
Scrollbar vertical en Tframe Sayuri Varios 3 07-12-2005 16:48:38
ScrollBar Vertical del DBGRID desaparece le4br OOP 3 21-03-2005 10:09:09


La franja horaria es GMT +2. Ahora son las 05:27:49.


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
Copyright 1996-2007 Club Delphi