2010-11-06 1 views
3

В Delphi 2010 мне нужно отобразить сетку с горизонтальной полосой прокрутки с 15 столбцами x 5 строк.Живое обновление StringGrid при движении горизонтальной полосы прокрутки?

Я решил использовать StringGrid.

Однако, пока кнопка мыши не нажата, перетащив горизонтальную полосу прокрутки, я хочу, чтобы сетка прокручивала в прямом эфире.

Компонент StringGrid, похоже, не прокручивается в прямой эфир. Он ждет, пока кнопка мыши не будет выпущена до обновления столбца и прокрутки, если необходимо.

Кроме того, кнопка горизонтальной полосы прокрутки (это то, что она называется) не пропорциональна количеству столбцов. И для стрелки вниз, когда в нижнем ряду переместиться в верхнюю часть следующего столбца вправо ...

Это похоже на общие потребности, поэтому я был удивлен, не найдя их в TStringGrid.

Любые предложения по пути решения этих двух проблем? Я могу использовать DbGrid или другой стандартный компонент, но я предпочитаю не использовать коммерческую сетку, если я могу ее избежать. И я не собираюсь использовать бесплатный или условно бесплатный ...

ТИА

ответ

3

Для первого вопроса, то вы можете установить goThumbTracking в StringGrid-х Options во время разработки или во время выполнения:

StringGrid1.Options := StringGrid1.Options + [goThumbTracking];


Для третьего вопроса, вы можете обеспечить необходимую функциональность с помощью события клавиатуры обработчики управления. Пример;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
var 
    StringGrid: TStringGrid; 
begin 
    StringGrid := Sender as TStringGrid; 
    case Key of 
    VK_DOWN: 
     if StringGrid.Row = StringGrid.RowCount - 1 then begin 
     Key := 0; 
     StringGrid.Row := StringGrid.FixedRows; 
     if StringGrid.Col = StringGrid.ColCount - 1 then 
      StringGrid.Col := StringGrid.FixedCols 
     else 
      StringGrid.Col := StringGrid.Col + 1; 
     end; 
    VK_UP: //...; 
    VK_RIGHT: //; 
    VK_LEFT: //; 
    end; 
end; 


Что касается второго вопроса, то код скроллинг, кажется, похоронят в частных методах TCustomGrid. Я не знаю, как это достичь.

+0

Спасибо, Sertac. Я не заметил вариант goThumbTracking. Прекрасно работает. Я обработал клавиши со стрелками в OnKeyDown аналогично вашему предложенному коду. (Спасибо, что добавили его в ваш ответ.) И я откажусь от того, чтобы увеличить Thumb. Еще раз спасибо! – RobertFrank

3

Если заметил, что вы не заинтересованы в сторонних компонентах - Freeware, я не люблю это тоже, но мы все должны приносить жертвы иногда, если мы хотим решить проблемы. Это одна из этих жертв! Этот компонент хорош для игнорирования. Вы не создадите что-то подобное, если у вас нет пары лет свободного времени.

Либо написать новый компонент, основанный на TStringGrid (я бы не стал - это не самый лучший инструмент в поле, чтобы начать с)

Но занять некоторое время и узнать TVirtualStringTree. Компонент на много лет опережает TStrignGrid. Источник доступен, и многие его используют.

И есть события, уже реализованные реагировать на скроллинга изменения OnScroll, OnShowScrollbar

http://www.delphi-gems.com/index.php?option=com_content&task=view&id=12&Itemid=38

Поиск по StackOverflow, и вы можете прочитать гораздо больше о tvirtualstringtree

+0

+1 VirtualTreeView - отличный компонент, если не лучший компонент.Это очень умная концепция и хорошо реализована. – Remko

+0

+1 для TVirtualStringTree предложение – RobertFrank

0

Второе предложение использовать TVirtualStringTree. Работа с компонентом TStringGrid похожа на колоть себя в живот с ржавым ножницами.