Проблема с drag and drop в проекте на Lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблема с drag and drop в проекте на Lazarus

Сообщение belch84 » 04.03.2013 13:21:42

Добрый день!

В проекте на Lazarus пытаюсь добавить возможность drag and drop. Мне нужно, чтобы при перетаскивании элемента TListView на некоторую кнопку BitBtn1 вызывался некоторый диалог. Для ListView установлен режим DragMode=dmAutomatic. Делаю все, как в примере Lazarus, устанавливаю свойство Accept в событии OnDragOver кнопки BitBtn1, а в событии OnDragDrop кнопки BitBtn1 обращаюсь к событию OnClick этой же кнопки. Вызов диалога работает, и все почти нормально, но в полях диалога перестает работать автоматическое контекстное меню, вызываемое по правой кнопке и содержащее Copy,Cut,Paste и т.д. Если не пользоваться перетаскиванием, а нажимать кнопку непосредственно, вызываемый диалог работает нормально. Кто-нибудь может подсказать, как правильно реализовать перетаскивание, чтобы не нарушить работу вызываемого диалога?
Версия Lazarus #0.9.30, версия FPC 2.4.2
belch84
незнакомец
 
Сообщения: 3
Зарегистрирован: 22.11.2011 17:55:41

Re: Проблема с drag and drop в проекте на Lazarus

Сообщение SSerge » 04.03.2013 13:44:30

belch84 писал(а):Версия Lazarus #0.9.30, версия FPC 2.4.2

Это ж очень старая версия... Обновиться до актуального релиза не пробовалось? Вдруг там уже нормально работает
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Проблема с drag and drop в проекте на Lazarus

Сообщение belch84 » 04.03.2013 14:01:44

Не пробовалось - все остальное вроде работает. Я не уверен, что это ошибка, возможно, это просто фича реализации drag and drop в Lazarus, если я правильно понял, в каждый момент времени может существовать только один объект TDragObject, и, возможно, он как-то используется при реализации контекстного меню (т.е. пока не завершено событие OnDragDrop). Кстати, внутри вызываемого при перетаскивании диалога организовать подобное использование перетаскивания не удается - оно не работает ...
belch84
незнакомец
 
Сообщения: 3
Зарегистрирован: 22.11.2011 17:55:41

Re: Проблема с drag and drop в проекте на Lazarus

Сообщение amateur » 04.03.2013 20:19:23

э, возможно глупый вопрос но...
1. Сорцы моно?
2. фпс 2.6.0 - на данный момент стабильная ветка, плюс лазарь 1.0 (хотя на 1.1 то же не плохо сидится)...
3. "Глючит" во всех системах или в одной ? :)
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: Проблема с drag and drop в проекте на Lazarus

Сообщение belch84 » 05.03.2013 11:53:51

Большое спасибо всем откликнувшимся, установка последней версии Lazarus вроде бы решила проблему
belch84
незнакомец
 
Сообщения: 3
Зарегистрирован: 22.11.2011 17:55:41

Re: Проблема с drag and drop в проекте на Lazarus

Сообщение Sharfik » 23.11.2014 22:01:07

Вопрос на туже тему: Почему код работавший в Delphi не пашет в Lazarus?

Было так:
Код: Выделить всё
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
         State: TDragState; var Accept: Boolean);
begin
  Accept:=false;
  if (Source is TTreeView)and(Assigned((Source as TTreeView).Selected)) then
  begin
      if ((Source as TTreeView).DropTarget<>(Source as TTreeView).Selected) then
      begin
        Accept:=true;
      end;
  end;
end;

procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  Node1,Node2:TTreeNode;
begin
  if (Source is TTreeView) then
  begin
      if Assigned((Source as TTreeView).DropTarget) then
      begin
        Node1:=(Source as TTreeView).Selected;
        Node2:=(Source as TTreeView).DropTarget;
        Node1.MoveTo(Node2,naInsert);
     end;
  end;
end;


DropTarget не возвращает ничего, и с трудом понимаю для чего оно предназначено в lazarus. Если в этой статье http://wiki.freepascal.org/Drag_and_Drop_sample рекомендуется делать как ниже приведено.
Код: Выделить всё
procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
Node1,
Node2,
DropTarget:TTreeNode;
begin
  if (Source is TTreeView) then
  begin
      DropTarget := TTreeView(Source).GetNodeAt(x,y);
      if Assigned(DropTarget) then
      begin
        Node1:=(Source as TTreeView).Selected;
        Node2:=DropTarget;
        Node1.MoveTo(Node2,naInsert);
     end;
  end;
end;

Да работает, но нафига так?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30


Вернуться в Lazarus

Кто сейчас на конференции

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

Рейтинг@Mail.ru
cron