2009-11-12 5 views

ответ

4

Возможно, это поможет. Он показывает пример захвата событий прокрутки регулярного TStringGrid. Synchronize the Scrolling of two TStringgrids?

+0

Это работает, но у меня есть недостаток знаний в одной точке здесь, не могли бы вы помочь? Я создал новый компонент TScrDBGrid, но у меня есть DBGrid, уже размещенный в форме с множеством свойств и событий, уже объявленных, поэтому мне не хотелось бы удалять и создавать новую. Есть ли способ «перенести» этот DBGrid в новый класс? –

+1

Вы можете установить новый компонент в пакет и установить этот пакет в среду IDE, чтобы компилятор знал об этом. Закройте блок с помощью DBGrid, который вы хотите заменить, поэтому он не открыт в среде IDE. * СДЕЛАЙТЕ КОПИЮ ФАЙЛОВ .DFM И PAS FIRST! * Откройте текст .DFM в Блокноте и замените TDBGrid на имя класса новой сетки. Сделайте то же самое с разделом интерфейса соответствующего файла .PAS и убедитесь, что вы добавили имя своего нового устройства в раздел * uses * uses. Сохраните файл, а затем снова откройте его в среде IDE. Если вы все сделали правильно, все должно быть хорошо. Если нет, восстановите резервные копии. –

+0

Последний вопрос. В то время как это событие работает сейчас, полоса прокрутки перестала работать, кажется, что, поймав это событие, он не позволяет ей перейти к окнам для фактической прокрутки. Как мне это решить? –

0

Я не могу проверить это на данный момент, но если я правильно помню, что это событие, но не опубликовано. Попробуйте создать элемент управления, который спускается из TDBGrid и публикует событие полосы прокрутки.

+0

Я проверил это и до сих пор не смог найти такое событие. Существует элемент под названием ScrollBars, но никакого события, связанного с ним. –

0

EDIT: неправильный ответ, очевидно. Он ловит по вертикали полоса прокрутки, но не горизонтальная одна.

Вы не поймаете его на уровне DBGrid. Вы попадаете в PreScroll или AfterScroll из прилагаемого TDataSet. Он запускается либо с помощью полосы прокрутки, клавиш со стрелками вверх и вниз, вверх по страницам , так и с помощью клавиш «вниз» и т. Д., Которые происходят в DBGrid.

+0

Он работает для вертикальной прокрутки, но не по горизонтали. Как вы делаете огонь для горизонтальной прокрутки? –

+0

Я не думаю, что это принесло бы много пользы OP. Он хочет уловить горизонтальную прокрутку, то есть, когда меняются видимые colummns. –

+0

А, конечно, вы правы. Я пропустил «горизонтальный». Спасибо за исправление. @Tofig: Я не думаю, что вы можете поймать горизонтальный свиток; по крайней мере, быстрое тестовое приложение, которое я написал, не могло. Клавиши со стрелками влево и вправо работают в событиях OnColEnter и OnColExit, но не запускаются через полосу прокрутки, так как выбранный столбец не изменяется. –

4

В TCustomGrid есть процедура WMHScroll, но она является частной. Вы не можете использовать его в DBGrid.
Вы должны создать свой собственный TDBGrid потомок и сделать свой собственный

procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL; 

или сделать некоторые серьезно плохие хакерство ...

Update: трюк/взломать, чтобы проникнуть в ваш код ...

[...] 
    uses 
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
     Dialogs, DB, ADODB, Grids, DBGrids; 

    type 
     // Hack to redeclare your TDBGrid here whitout the the form designer going mad 
     TDBGrid = class(DBGrids.TDBGrid) 
     procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL; 
     end; 

     TForm8 = class(TForm) 
     DBGrid1: TDBGrid; 
     DataSource1: TDataSource; 
     ADODataSet1: TADODataSet; 
     ADOConnection1: TADOConnection; 
     private 
     { Private declarations } 
     public 
     { Public declarations } 
     end; 

    var 
     Form8: TForm8; 

    implementation 

    {$R *.dfm} 

    { TDBGrid } 

    procedure TDBGrid.WMHScroll(var Msg: TWMHScroll); 
    begin 
     case Msg.ScrollCode of 
     SB_ENDSCROLL: OutputDebugString('SB_ENDSCROLL') ; 
     SB_LEFT:OutputDebugString('SB_LEFT'); 
     SB_RIGHT:OutputDebugString('SB_RIGHT'); 
     SB_LINELEFT:OutputDebugString('SB_LINELEFT'); 
     SB_LINERIGHT:OutputDebugString('SB_LINERIGHT'); 
     SB_PAGELEFT:OutputDebugString('SB_PAGELEFT'); 
     SB_PAGERIGHT:OutputDebugString('SB_PAGERIGHT'); 
     SB_THUMBPOSITION:OutputDebugString('SB_THUMBPOSITION'); 
     end; 
     inherited; // to keep the expected behavior 
    end; 
[...] 

Update2: Обратите внимание, что вы можете переместить свой специальный код TDBGrid в отдельный блок (рекомендуется), просто не забудьте положить т его имя AFTER DBGrids в разделе «Использование формы», пункт.

+0

Да, это то, что на самом деле предлагает статья Йози. Я уже создал такой компонент. Теперь проблема заключается в том, как перейти от старого к новому, не удаляя и не создавая снова? –

+0

Спасибо, я не знал, что такой взлом был возможен :) –

+0

Tofig, см. Мой Update2. Вы можете избежать изменения существующего кода. –