Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 18 апр 2024, 22:04

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
СообщениеДобавлено: 29 янв 2020, 20:30 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 61
Здравствуйте!

Окружение: Lazarus 2.1, Ehlib 9.4.022 (собрана без FPC_CROSSP), Windows 10.

Ситуация: надо перемещать записи из одного датасета в другой. Но с обработкой по пути, то есть иногда копировать, иногда перемещать, иногда удалять.

Сделал так (TfrmBatch — класс-наследник от TFrame, их создаётся некоторое количество динамически в ратайме, dgContent — экземпляр TDBGridEh, один на фрейм):
Код:
procedure TfrmBatch.dgContentMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  dgContent.BeginDrag(false, 10);
end;

procedure TfrmBatch.dgContentDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept:=(Source is TDBGridEh) and (Sender<>Source);
end;


Перетаскивание работает, но при этом происходит скролл датасета грида-источника в соответствии перемещениями мыши, даже за пределами грида-источника.

Как можно этого избежать? То есть, чтобы после того, как вызвалась BeginDrag(), до окончания перетаскивания грид не прокручивался.
Сейчас сделал закладку в датасете, при отпускании перехожу по ней и беру данные из правильной записи, работает, но прокрутка очень смущает пользователей. Можно DragObject приделать, визуально будет понятнее, что именно перетаскивается, но хотелось бы избавиться именно от прокрутки.

Спасибо!

С уважением
Евгений.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 янв 2020, 03:52 
Не в сети

Зарегистрирован: 16 фев 2018, 04:13
Сообщений: 54
Откуда: АО ОТЭКО
Как раз недавно писал DragDrop для гридов, может пригодится.


Вложения:
GridDragDropDemo.zip [58.41 KiB]
Скачиваний: 103
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 янв 2020, 13:35 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 61
Спасибо за пример!
У меня, правда, нет Delphi, поэтому я только код посмотреть смог. Насколько я вижу, разница между тем, что делаете Вы и тем, что делаю я, только в том, что у Вас реализован большой красивый DragObject с наглядным представлением, что тащим. К этому я тоже пришёл, в полях своего DragObject я храню id записи и исходный датасет.

Но вопрос остаётся всё-таки в том, как заблокировать прокрутку грида.

С уважением
Евгений


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 янв 2020, 00:47 
Не в сети

Зарегистрирован: 16 фев 2018, 04:13
Сообщений: 54
Откуда: АО ОТЭКО
У меня не прокручивается, так что скорее всего косяк либы в лазарусе.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 фев 2020, 19:32 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 61
Сделал простейший проект с гридом и MemTableEh.
Прокрутка при нажатой левой кнопке мышки есть, даже гифку записал. Проект прикладываю.

Можно ли это как-то изменить такое поведение?


Вложения:
mouse_down_scroll.gif
mouse_down_scroll.gif [ 249.01 KiB | Просмотров: 1509 ]
mouse_scroll.zip [1.38 KiB]
Скачиваний: 86
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 07 фев 2020, 00:51 
Не в сети

Зарегистрирован: 16 фев 2018, 04:13
Сообщений: 54
Откуда: АО ОТЭКО
У тебя в проекте нет MouseDown c BeginDrag, наверно не те исходники приложил.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 07 фев 2020, 10:52 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 61
Так штука в том, что скролл происходит даже если просто мы зажимаем кнопку мыши и возим ею даже вне окна. Что и показано на гифе.
Можно дописать процедуры для drag'n'drop, это поведение не изменится.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 07 фев 2020, 14:28 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 61
Добавил drag'n'drop. Видно, что перемещение по dataset осталось.


Вложения:
project1.zip [198.49 KiB]
Скачиваний: 79
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 фев 2020, 00:44 
Не в сети

Зарегистрирован: 16 фев 2018, 04:13
Сообщений: 54
Откуда: АО ОТЭКО
Я к тому что без BeginDrag скролится и в Delphi.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 фев 2020, 08:25 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.

Попробуйте отключать DataTracking следующим образом.

Код:
type
   TDBGridEhCrack = class(TDBGridEh);

procedure TForm1.DBGridEh1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (not RecordCanBeMoved) then exit;
  Self.DBGridEh1.SaveBookmark;
  Self.DBGridEh1.BeginDrag(false, 1);
  TDBGridEhCrack(Self.DBGridEh1).FDataTracking := False;
end;

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 фев 2020, 17:22 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 61
Спасибо! Это помогло. Теперь всё работает красиво.
Только в событии OnDragDrop надо возвращать свойство обратно. И в OnDragEnd в случае, если никуда не бросили запись, тоже.

С уважением
Евгений.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB