Добрый день!
В проекте на 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
Проблема с drag and drop в проекте на Lazarus
Модератор: Модераторы
belch84 писал(а):Версия Lazarus #0.9.30, версия FPC 2.4.2
Это ж очень старая версия... Обновиться до актуального релиза не пробовалось? Вдруг там уже нормально работает
Не пробовалось - все остальное вроде работает. Я не уверен, что это ошибка, возможно, это просто фича реализации drag and drop в Lazarus, если я правильно понял, в каждый момент времени может существовать только один объект TDragObject, и, возможно, он как-то используется при реализации контекстного меню (т.е. пока не завершено событие OnDragDrop). Кстати, внутри вызываемого при перетаскивании диалога организовать подобное использование перетаскивания не удается - оно не работает ...
э, возможно глупый вопрос но...
1. Сорцы моно?
2. фпс 2.6.0 - на данный момент стабильная ветка, плюс лазарь 1.0 (хотя на 1.1 то же не плохо сидится)...
3. "Глючит" во всех системах или в одной ?
1. Сорцы моно?
2. фпс 2.6.0 - на данный момент стабильная ветка, плюс лазарь 1.0 (хотя на 1.1 то же не плохо сидится)...
3. "Глючит" во всех системах или в одной ?
Большое спасибо всем откликнувшимся, установка последней версии Lazarus вроде бы решила проблему
Вопрос на туже тему: Почему код работавший в Delphi не пашет в Lazarus?
Было так:
DropTarget не возвращает ничего, и с трудом понимаю для чего оно предназначено в lazarus. Если в этой статье http://wiki.freepascal.org/Drag_and_Drop_sample рекомендуется делать как ниже приведено.
Да работает, но нафига так?
Было так:
Код: Выделить всё
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;
Да работает, но нафига так?
