Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как выловить соб. OnMouseDown() для самих строк DBGrid? [D5, MSSQL]


AM ©   (2002-11-01 12:02:00) 

Всем доброго дня! Как сделать сабж. ведь обычный OnMouseDown() на DBGrid возникает только тогда, когда я нажимаю мишью в пустую область, т. е. область где нет записей...


AM   (2002-11-01 13:35:00) [1]

ЮЮ © (01.11.02 13:25)
Здесь, да получился насточщий Drag&Drop. Очень интересный подход. Я попробую его.

В момем же я просто решил "сэмулировать" его с помощью StaticText. И перемещаю именно его.

ЮЮ, спасибо!


ЮЮ   (2002-11-01 13:25:00) [2]

Тогда лезь в "потроха" DBGrida.
Когда я пару лет назад учил делать это DBGrigEh, я поступил так:

procedure TCustomDBGridEH.MoveCol(RawCol: Integer);
var
OldCol: Integer;
begin
FDatalink.UpdateData;
if RawCol >= ColCount then
RawCol := ColCount - 1;
if RawCol < FIndicatorOffset + {ddd}FrozenCols then RawCol := FIndicatorOffset + {ddd}FrozenCols;
OldCol := Col;
if RawCol OldCol then
begin
...
здесь я оставил прежний текст, позволяя вести гриду как обычно
end else
begin
а при повторном выборе той же ячейки запускался механизм Drag&Drop
if (ssLeft in FShift) then BeginDrag(true)
end;
end;


AM   (2002-11-01 13:22:00) [3]

Фу, наконец получилось!
На самом деле у меня получилось, что можно обойтись и без события
...MouseDown

использовав только:
...MouseMove
...MouseUp

Просто в событии MouseMove надо сделать проверку:
If ssLeft in Shift then
(показать StaticText с текстом текущего значения в гриде и с координатами курсора)
else
( скрыть StaticText)


AM   (2002-11-01 13:10:00) [4]


>> Johnmen © (01.11.02 12:57)

Дело чуть-чуть в другом:
Поставьте на событие OnMouseDown() обычного дбгрида например:
ShowMessage("Ура!"). И оно не появится когда вы будете тыкать мышкой по строкам/ячейкам грида. Оно появится если вы ткнете мышкой по пустой (незаполненной записями обласит грида)

Т. е. OnMouseDown() вообще событие только для пустой области грида.




AM   (2002-11-01 13:01:00) [5]

Вся проблема в том, что событие OnCellClick и вообще ...Click воникают только тогда когда пользователь именно отпускаетранее нажатую кнопку мыши. А мне нужно именно событие, когда он нажал(MouseDown) и еще не отпускал. Я просто делал когда-то такое "перетаскивание" для ListBox-ов и все классно работало.

Для организации Drag&Drop нужна обработка трех событий:

...MouseDown
...MouseMove
...MouseUp

Самое интересное, что последние два события у грида нормально работают, а первое - нет.

Есть ли другие подходы кроме как вылавливать событие ...MouseDown?


Johnmen   (2002-11-01 12:57:00) [6]

>AM (01.11.02 12:02)

В OnMouseDown() на DBGrid несложно определить, пришелся клик на "молоко" или на "содержимое", ведь все параметры отображения грида известны и координаты мыши тоже...


ЮЮ   (2002-11-01 12:44:00) [7]

Ну и запускай механизм Drag&Drop в OnCellClick, когда текущая запись НД соответствует выделенной строке. Или ты не хочешь, чтобы пользователь мог выбирать запись? :-)


AM   (2002-11-01 12:40:00) [8]

То что он мне
>> предоставляет кучу других onXXX

меня не устраивает. Например:
У меня есть два DBGrid-а и я хочу организовать такую возможность интерфейса как "перетаскивание" значений из однового в другое.
Как это организовать если нельзя обработать событие OnMouseDown() на строку???

Может создать какого-нибудь предка TMyDBGrid где можно будет обрабатывать эти события самому. Как это сделать?
Кто может подсказать это?


ЮЮ   (2002-11-01 12:27:00) [9]

А там где записи есть их ловит сам DBGrid а пользователю предоставляет кучу других onXXX (читай Help)


Наверх

Титульная страница Поиск, карта сайта Написать письмо