C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
TRGrid, Необходим совет
Doga
  Отправлено: 04.03.2006, 20:49


Мастер участка

Группа: Участник
Сообщений: 575



Некоторое время назад я начал разработку компонента TRGrid. Надеюсь, Уважаемые Коллеги, Вы поняли о чём я говорю smile.gif .
Подходит к концу начальный этап разработки компонента, он уже дышит и иногда даже уверенно biggrin.gif

user posted image

Вот уже неделю не могу прийти к окончательному решению в реализации методов выделения ячеек с помощью мыши и клавиатуры.

В присоединённом файле (Project1.zip) находится рабочий EXEшник с этим компонентом. Маркировка производится следующим образом:

мышь — Shift + LButton далее MouseMove
клавиатура — Shift + VK_UP(VK_DOWN, VK_LEFT, VK_RIGHT)

Хотелось бы узнать Ваше мнение о том какой способ маркировки более правильный в текущей реализации, т.е. мышиный или клавиатурный?
Должна ли клавиатурная маркировка работать так же как и мышыная?
Или наоборот — мышиная должна работать как клавиатурная?

Если Вам не трудно — загрузите файл, протестируйте и выскажите своё мнение.


Что касается самого TRGrid :

Умеет скрывать/показывать колонки и строки
Умеет объединять ячейки
3 режима маркировок — строки, колонки, ячейки
Маркировка не пропадает после перемещения фокуса с ячейки на ячейку
Фиксированные ячейки могут работать как кнопки
Набор цветов для ячеек (то же будет и со шрифтами)
Каждая ячейка имеет свойство Data (void *) для хранения дополнительных данных а ля TTreeView
Свойство Images для иконок ячеек

И события (помимо прочих):

property OnFreeCell;
property OnInitCell;
property OnGetCellText;
property OnGetImageIndex;
property OnBeforeCellPaint;
property OnAfterCellPaint;

Когда наконец закончится начальный этап разработки, выложу исходники . Все может быть biggrin.gif

Отредактировано Doga — 04/03/2006, 23:10

User Attached Image Скачать файл
Project1.zip


Grigoriy
Отправлено: 04.03.2006, 21:31


Мастер участка

Группа: Участник
Сообщений: 381



Просто одной мышью без использования клавиатуры можно теоретически выделять и это будет самый быстрый и удобный метод. biggrin.gif biggrin.gif biggrin.gif

Отредактировано Grigoriy — 04/03/2006, 22:23
Doga
Отправлено: 04.03.2006, 22:52


Мастер участка

Группа: Участник
Сообщений: 575



Согласен, но не хотелось бы пренебрегать пользователями у которых слишком много кошек! biggrin.gif biggrin.gif biggrin.gif

Тут дело не в том чем выделять, а в том как это происходит. Клавиатурой можно выделить только предидущую ячейку на которой перед этим стоял курсор. А можно было бы выделять так же как мышой — прямоугольник ячеек...
Grigoriy
Отправлено: 04.03.2006, 23:18


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE

у которых слишком много кошек!  


Это Вы про кого ? smile.gif smile.gif

QUOTE
Тут дело не в том чем выделять, а в том как это происходит.


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

QUOTE

мышь — Shift + LButton далее MouseMove


Этот метод можно оставить как один из методов выделения ячеек.

Отредактировано Grigoriy — 04/03/2006, 23:18
Doga
Отправлено: 05.03.2006, 00:07


Мастер участка

Группа: Участник
Сообщений: 575



Если в доме есть кошки то мыши там обычно не водятся smile.gif

А свыделением мышью никто не спорит — удобно.
Выделение клавиатурой отличается от выделения мышью:

Мышью выделяется прямоугольник ячеек, а клавиатурой только те ячейки по которым прошёлся курсор. Я потому и спрашиваю какой способ лучше. А как определюсь — сделаю что б работало одинаково.
Grigoriy
Отправлено: 05.03.2006, 12:12


Мастер участка

Группа: Участник
Сообщений: 381



Тогда можно использовать выделение нужных ячеек таблицы так

мышь — RButton далее MouseMove.

Локальное меню появляется только если нажмете правую кнопку мыши и отпустите ее же на той же ячейке.
AVC
Отправлено: 06.03.2006, 09:32


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

мышь — Shift + LButton далее MouseMove
клавиатура — Shift + VK_UP(VK_DOWN, VK_LEFT, VK_RIGHT)

Хотелось бы узнать Ваше мнение о том какой способ маркировки более правильный

В "промышленном" компоненте должны присутствовать оба. Клавиши я бы выбрал те же
Gedeon
Отправлено: 06.03.2006, 13:23


Ветеран

Группа: Модератор
Сообщений: 1742



Безусловно нельзя не предусматривать выделение клавой, т.к. я очень часто крысу вообще не трогаю, если без нее мона и соотв. оч. раздражает необходимость ее хватать.
Grigoriy
Отправлено: 06.03.2006, 13:38


Мастер участка

Группа: Участник
Сообщений: 381



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

QUOTE

В "промышленном" компоненте должны присутствовать оба. Клавиши я бы выбрал те же


У каждого свое мнение.
Вывод выделение ячеек должно производится как минимум тремя путями.
1. С помощью только одной мыши без клавиатуры.
2. С помощью одной клавиатуры без мыши.
3. С использованием обеих устройств (клавиатуры и мыши).

Отредактировано Grigoriy — 06/03/2006, 13:39
Doga
Отправлено: 06.03.2006, 16:38


Мастер участка

Группа: Участник
Сообщений: 575



Уважаемые коллеги! Видно я плохо обьяснил чего хочу от Вас добиться — каюсь smile.gif

Давайте абстрагируемся от конкретных устройств ввода (KeyBoard, Mouse, TouchScreen, ...), пусть оно будет всего лишь одно, и не важно какое.

Допустим нам необходимо выделить в гриде прямоуголник ячеек размером 6х6. Как я понимаю, существуют 2 способа это сделать.

user posted image

(В данном контексте КУРСОРом будем называть сфокусированную ячейку грида)

Рассмотрим 1ый вариант: Рис. 1
Этот способ работает так:
Перед началом маркировки запоминаются координаты первой выделяемой ячейки (допустим COORD1). Перемещая курсор мы получаем второй набор координат (допустим COORD2). Все ячейки оказавшиеся между координатами COORD1 и COORD2 будут выделены при перемещении курсора. Таким образом, наша цель будет достигнута всего за 10 перемещений курсора. На рисунке 1 одинаковаым числами обозначены группы ячеек, маркируемые за одно перемещение курсора.

Рассмотрим 2ой вриант: Рис. 2
Здесь маркируются только те ячейки, по которым прошёл курсор. С помощью этого способа наша цель будет достигнута за 35 перемещений курсора. Здесь я даже не стал обозначать промежуточные ячейки маркируемые за одно перемещение курсора.
Понятно, что этот способ требует несколько больше усилий от пользователя для достижения конечной цели, чем первый.

А на рисунке 3 показан недостаток первого способа маркировки. Такое выделение с помощью первого способа можно получить как минимум в 6 этапов. Хотя и второй способ тут эргономикой не блещет...

Преимущества какого либо из этих двух способов при маркировке сложных конфигураций, как на рисунке 3, мне кажутся спорными. Но налицо явное преимущество 1го способа при маркировке прямоугольных областей грида. Но это пока только моё личное мнение.

Вот, собственно, об этом я Вас и спрашивал. В данный момент 1ый способ исползуется при выделении мышью, 2ой с помощю клавиатуры. Мне кажется неправильным, что они работают по-разному, т.к. это может ввести пользователя в заблуждение...

Так какой способ маркировки более "правильный"? smile.gif
avc*
Отправлено: 06.03.2006, 17:22


Не зарегистрирован







Мне, как пользователю Excel'я, первый способ кажется более привычным и, кроме того, он легко превращается во второй, например, нажатием и/или удерживанием определенной клавиши. Хотя и во втором можно сделать нечто подобное.

По моему мнению сетка должна уметь работать в двух режимах выделения — область, заданная границами и перечень элементов, а конечный пользователь должен иметь легкий и естественный переключатель способа выделения.
Grigoriy
Отправлено: 06.03.2006, 18:04


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (avc* @ 06/03/2006, 17:22)
...кроме того, он легко превращается во второй, например, нажатием и/или удерживанием определенной клавиши. ...

Да, есть клавиша Ctrl.
Ее удерживаешь и получается, что можно выделить несколько прямоугольных областей ячеек.

Отредактировано Grigoriy — 06/03/2006, 18:06
Doga
Отправлено: 10.03.2006, 15:28


Мастер участка

Группа: Участник
Сообщений: 575



2Grigoriy
Не, Ctrl уже занят smile.gif

2AVC
Вы правы — должны быть оба варианта


С Shift'ом будет работать по 1ому способу, с Alt'ом по 2ому...
Grigoriy
Отправлено: 10.03.2006, 18:09


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (Doga @ 10/03/2006, 15:28)
2Grigoriy
Не, Ctrl уже занят smile.gif


Удивительно.
Получается, что при нажатии одной только клавиши Ctrl выполняется какое-то другое действие ?
Или последовательность действий

мышь — Ctrl + LButton далее MouseMove

предназначена для чего-то другого ?
Doga
Отправлено: 10.03.2006, 18:47


Мастер участка

Группа: Участник
Сообщений: 575



Нет, Ctrl сам по себе ничего не делает, но используется в комбинации c кнопками VK_Left, VK_Right, VK_Next, VK_Prior, VK_Home, VK_End — для навигации по сетке. Так работают, по моему, все гриды.
А все эти VK_... так же используются при выделении. Так что остаётся только либо Shift, либо Alt...
Grigoriy
Отправлено: 10.03.2006, 20:02


Мастер участка

Группа: Участник
Сообщений: 381



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

Вернуться в Вопросы программирования в C++Builder