2011-08-02 31 views
5

Tôi đang tạo một ứng dụng chứa đơn đặt hàng và in hóa đơn. Tôi có một số nhãn, tedits, tmemos, các nút, một nguồn dữ liệu, một adotable, một popupmenu, và một dbgrid trên form của tôi.Delphi dbgrid liên tục cuộn

Khi tôi tạo chương trình và cuộn xuống thanh cuộn dbgrid, nó cuộn sau khi tôi nhả chuột. Nhưng tôi muốn cuộn liên tục.

Chúc mừng

+1

Mà không phải là bản chất của dữ liệu kiểm soát ý thức? –

+0

tôi không biết điều đó. – nikel

Trả lời

9

Đó được gọi là theo dõi ngón tay cái. Tạo ra một lớp mới để ghi đè hành vi cuộn. Ví dụ về cách sử dụng một lớp interposer:

type 
    TDBGrid = class(DBGrids.TDBGrid) 
    private 
    procedure WmVScroll(var Message: TWMVScroll); message WM_VSCROLL; 
    end; 

    TForm1 = class(TForm) 
    DBGrid1: TDBGrid; 
    .. 

implementation 

procedure TDBGrid.WmVScroll(var Message: TWMVScroll); 
begin 
    if Message.ScrollCode = SB_THUMBTRACK then 
    Message.ScrollCode := SB_THUMBPOSITION; 
    inherited; 
end; 


Bạn cũng có thể thay thế các WindowProc của sự kiểm soát nếu bạn không muốn lấy được một lớp mới. Tất cả những gì bạn cần làm là xử lý thông báo WM_VSCROLL. Here là một ví dụ về cách thực hiện điều đó.

+0

Có phải việc không theo dõi 'TDBGrid' là một lựa chọn thiết kế để tránh làm đổ cơ sở dữ liệu trong khi cuộn không? Đây là một câu hỏi trung thực được hỏi trong sự thiếu hiểu biết của một người biết hoàn toàn không có gì về cơ sở dữ liệu. –

+4

@David - Rất có thể .. Tuy nhiên, tùy chọn nên được trao cho nhà phát triển. Đôi khi, tất cả dữ liệu trường được lưu vào bộ nhớ cache, không có điểm nào để không theo dõi ngón tay cái. –

+2

Cảm ơn bạn

2

Dưới đây là giải pháp khác Sertac Akyuz đề cập mà không cần phải lấy được một lớp mới từ TDBGrid:

private 
    FOrgDBGridWndProc: TWndMethod; 
    procedure DBGridWndProc(var Msg: TMessage); 
    // ... 
    end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FOrgDBGridWndProc:= DBGrid1.WindowProc; 
    DBGrid1.WindowProc := DBGridWndProc; 
end; 

procedure TForm1.DBGridWndProc(var Msg: TMessage); 
begin 
    if (Msg.Msg = WM_VSCROLL) and 
    (LongRec(Msg.wParam).Lo = SB_THUMBTRACK) then 
    begin 
     LongRec(Msg.wParam).Lo := SB_THUMBPOSITION; 
    end; 
    if Assigned(FOrgDBGridWndProc) then 
    FOrgDBGridWndProc(Msg); 
end; 
Các vấn đề liên quan