Delphi - Как мне исправить это странное поведение TGrid? - PullRequest
4 голосов
/ 17 апреля 2009

Delphi 2007.

У меня есть TGrid с большим количеством строк, чем уместится на экране, а высота сетки такова, что внизу есть частично нарисованный ряд. Когда я щелкаю эту частичную строку, она подпрыгивает, чтобы быть полностью видимой (через процедуру с именем 'ClampInView' в Grids.pas). Но это не останавливает. Поскольку мышь теперь находится над новой частично нарисованной строкой, она тоже прыгает вверх.

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

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

Это плохо для меня, потому что форма, которую я имею в реальном коде, имеет поведение типа перетаскивания, поэтому щелчок и отпускание через ~ 0,1 секунды в неполной строке поднимет элемент в ячейке и уронит его примерно на 50 строк ниже , Это определенно не то, что вы ожидаете, когда вы нажимаете на ячейку.

Любые предложения, как это исправить / обойти это?

Ответы [ 2 ]

3 голосов
/ 17 апреля 2009

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

Это не только предотвращает поведение, которое вы пытаетесь исправить, но также (на мой взгляд) делает ваш интерфейс намного чище!

2 голосов
/ 17 апреля 2009

Вы можете попробовать переопределить MouseDown в своей сетке и не вызывать унаследованный MouseDown, если пользователь нажимает в «плохих» местах.

...