Newsgroup: it.comp.lang.delphi
Titolo: ScrollBar del DBGrid

Perchè non riesco a liberarmi della ScrollBar verticale nel mio DBGrid che
presenta un numero di righe molto inferiore alla sua capacità?
Deve essere una stupidaggine, ma stasera proprio non mi viene. Qualcuno può
aiutarmi ?

"FrancoJommi" ha scritto nel messaggio

Vedi qui:
http://www.swissdelphicenter.ch/torry/showcode.php?id=1880
Ciao
-- 
ACSH
[TurboDelphi]
Chi fa da se', fatica il doppio 

Grazie della referenza. Sono andato a vedere la tip, ma purtroppo a causa
del fatto che non sono bravo, non riesco a capire come applicarla. Ho fatto
quanto segue nella mia form:
type
  TForm1 = class(TForm)
    ..................
    ..................
   MyDBGrid = TDBGrid;
  private
    ..................
  public
    ..................
  end;
type
  TNoScrollDBGrid = class(TDBGrid)
  private
    procedure WMNCCalcSize(var Msg: TMessage);
      message WM_NCCALCSIZE;
  end;
implementation
procedure TNoScrollDBGrid.WMNCCalcSize(var Msg: TMessage);
const
  Scrollstyles = WS_VSCROLL or WS_HSCROLL;
var
  Style: Integer;
begin
  Style := GetWindowLong(Handle, GWL_STYLE);
  if (Style and Scrollstyles) <> 0 then
    SetWindowLong(Handle, GWL_STYLE, Style and not Scrollstyles);
  inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
 ...................................................
end;
Ho fatto diverse prove senza successo, anche perchè ho ancora molte domande
tipo le seguenti:
- Come lego MyDBGrid alla classe TNoScrollDBGrid ? O dovrei dichiarare
MyDBGrid di classe TNoScrollDBGrid ? (Ho provato, ma mantiene le scroll bar;
infatti la proc WMNCCCalcSize non viene mai eseguita)
- la proc WMNCCCalcSize deve essere una proc del Form1 o no ?
Forse invece di domande senza senso (faccio solo perdere tempo a chi vuole
aiutarmi) potrei chiedere un aiuto più concreto tipo un esempio di come
implementare la tip suddetta ?
Grazie in anticipo, comunque.
"ACSH" <x...@xxx.xxx> ha scritto nel messaggio
news:RR6mi.64749$%k.20...@twister2.libero.it...


Strada CRITICATA ma poco menosa..... MA OK se non devi andare sulla LUNA!
Metti il componente applicationevents della palette additionals..
Nel suo evento onmessage metti:
if (ActiveControl=MiaDBGRID)and(Msg.message = WM_MOUSEWHEEL) then
   begin Msg.wparam := 0; EXIT; end;
Ovvio più corretto derivare il componente, ma ti assicuro che se non hai 
grosse menate non ti rallenta niente.
--- posted by geoForum on 
http://www.delphiedintorni.it

 Nel suo evento onmessage metti: [...]
Penso che, vista la tua storia pregressa, sia del tutto inutile dirti 
che il messaggio WM_MOUSEWHEEL, riferito alla "rotellina", non c'entra 
nulla con quanto è stato invece chiesto, giusto? ;-)
La domanda è ovviamente retorica, volta esclusivamente ad avvertire 
l'autore della discussione, cioè colui che ha un problema serio (ma 
anche tu forse ne hai parecchi, dopotutto :-P) di lasciar perdere questa 
soluzione poiché ha ben poco a che fare con quanto ha chiesto.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

Chiedo scusa avevo letto verso le due di notte il post e 
risp.velocemente ero un po' out.


Se non vuoi menate mettici sopra una immagine che copre la barra di 
scorrimento... Senza scrivere codice...
Ciao.


O un pannellino, immagine fai uno stamp della parte sinistre e lo metti 
sulla destra.
Se numero di righe > .... Allora immagine.visible:=false;
etc. etc.


 ha scritto nel messaggio
news:469c7758$1...@extreme.x-privat.org...


 Ma c'è o non c'è una soluzione ?
La soluzione c'è ed è quella prospettata da ACSH.
Se vuoi evitare di costruire un nuovo componente, puoi semplicemente
intercettare la window procedure della tua dbgrid. Dichiara un metodo che
ha lo stesso prototipo di TWndMethod nella tua form e inseriscici il
codice di gestione del messaggio suggerito. Lo assegni poi alla proprietà
WindowProc della tua griglia. Stai attento a richiamare comunque il
vecchio metodo all'interno del nuovo, per l'elaborazione dei messaggi
diversi da WM_NCCALCSIZE.
p.s.: evita il top-posting.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Ho fatto una prova con i consigli di Andrea (e alcuni ricordi).... e 
sembra funzionare
type
   TForm1 = class(TForm)
     DataSource1: TDataSource;
     DBGrid1: TDBGrid;
     Table1: TTable;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
   private
     { Private declarations }
   public
     FScroll: TWndMethod;
     procedure Scroll(var Msg: TMessage);
     { Public declarations }
   end;
var
   Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
   FScroll := DBGrid1.WindowProc;  // metto da parte l'originale
   DBGrid1.WindowProc := Scroll;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
   DBGrid1.WindowProc := FScroll; // ripristino .... non si sa mai
   FScroll := nil;
end;
procedure TForm1.Scroll(var Msg: TMessage);
begin
// rendo invisibili la barre verticale
   ShowScrollBar(DBGrid1.Handle, SB_VERT, False);
   FScroll(Msg); // continua a fare i cavoli suoi
end;
end.
Spero di non aver fatto tante cavolate :p
Saluti Goblin
-- 
Ibis et redibis non morietur in bellum.

Se hai fatto cavolate, può dirlo qualcun altro. Quel qualcuno me lo dica.
Intanto io ci provo ..
"^_Goblin_^" <^__^Nic_^__^sab_^__^@^__^Libero_^__^.it> ha scritto nel
messaggio news:UP2ni.1118$BM....@tornado.fastwebnet.it...


 Intanto io ci provo ..
mmm c'e' un errore di fondo ... le barre laterali le tolgo ... ma non 
faccio nessun calcolo x rimetterle quando c'e' bisogno. :D



Immagino che tu sia uno di quelli che quando porta a spasso il cane,
la merda, anziché raccoglierla, la copre col fazzolettino ;-)

"^_Goblin_^" ha scritto nel messaggio
<cut>
Semplificando, di solito con gli oggetti della VCL si ridefinisce una Window
Procedure per intercettare e gestire UN messaggio: nella tua procedure non
fai nessun discernimento, e usi l'API (corretta) sempre.
L'esempio che ho indicato cosa fa?
procedure TNoScrollDBGrid.WMNCCalcSize(var Msg: TMessage);
// Viene intercettato e gestito il messaggio WM_NCCALCSIZE,
// che viene inviato quando cambiano le dimensioni o la posizione di una
finestra
const
  Scrollstyles = WS_VSCROLL or WS_HSCROLL;
var
  Style: Integer;
begin
  // recupero le informazioni della finestra (nel nostro caso una griglia)
  Style := GetWindowLong(Handle, GWL_STYLE);
  // controllo se nelle "informazioni" riguardo la finestra e' compresa la
necessita'
  // di mostrare le scrollbar
  if (Style and Scrollstyles) <> 0 then
    // se si', elimino questa necessita'
    SetWindowLong(Handle, GWL_STYLE, Style and not Scrollstyles);
  // proseguo nella gestione del messaggio
  inherited;
end;
Se non si vuole creare un nuovo componente ma se si vuole seguire la strada
indicata da Andrea L., il tuo codice diventa (tagliando tutto quello che
non e' strettamente necessario):
type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
  private
    // dichiaro la variabile e la procedura
    VecchiaWndPrc: TWndMethod;
    Procedure DBGridNewWindowProc(var Msg: TMessage);
    { Private declarations }
  public
    { Public declarations }
  end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Salvo la vecchia Wnd Proc
  VecchiaWndPrc := DBGrid1.WindowProc;
  // imposto una nuova procedura dove gestiro' la finestra
  DBGrid1.WindowProc := DBGridNewWindowProc;
end;
procedure TForm1.DBGridNewWindowProc(var Msg: TMessage);
const
  Scrollstyles = WS_VSCROLL or WS_HSCROLL;
var
  Style: Integer;
begin
  // Intercetto il messaggio che mi interessa e lo gestisco
  // come voglio
  if Msg.Msg = WM_NCCALCSIZE then
  begin
      // qui ci metti tutte le condizioni nelle quali vuoi che le scrollbar
     // compaiano; ora, tolgo tutto
      Style := GetWindowLong(Handle, GWL_STYLE);
      if (Style and Scrollstyles) <> 0 then
      SetWindowLong(Handle, GWL_STYLE, Style and not Scrollstyles);
      Exit; // Esco dalla procedura non c'e' bisogno di rilanciare la
vecchia proc
  end;
  // Gestisco tutti gli altri messaggi
  VecchiaWndPrc(Msg);
end;
Non proprio testata, ma dovrebbe funzionare.


Ok. Ho aftto una prova con il tuo codice Goblin e mi pare che funzioni
perfettamente. Ho solo ancora un problema a condizionare la soppressione
della scroll bar verticale alla presenza du un numero di righe inferiori a
quelle contenibili nella parte visibile del DBGrid.
Praticamente, non so come individuare il numero di righe del DBGrid...
continuo a lavorarci..
"^_Goblin_^" <^__^Nic_^__^sab_^__^@^__^Libero_^__^.it> ha scritto nel
messaggio news:UP2ni.1118$BM....@tornado.fastwebnet.it...


Il tuo motto mi piace come provocazione e lo adotterei anch'io.. In effetti
ho faticato un sacco intorno ad un problema che avrei potuto aggirare,
magari scegliendo una diversa soluzione. Però devo dire che, grazie in
questo caso al tuo ultimo messaggio con tutti i commenti del codice, almeno
ho imparato una cosa nuova. E magari anche qualche altro che ti ha letto.
Grazie
"ACSH" <x...@xxx.xxx> ha scritto nel messaggio
news:pu9ni.67310$%k.20...@twister2.libero.it...
