Перейти к содержанию
  • Регистрация
  • 0
brunnengi

[Delphi Berlin FMX Win32] Как реализовать Drag and Drop у StringGrid?

Вопрос

 Здравствуйте.

Как сделать Drag and Drop для строчки из TStringGrid? Что бы можно было строчку перетащить в текстовое поле или в DragTarget и получать содержимое ячейки?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

Чтобы не плодить темы спрошу в этой. Столкнулся с такой же задачей, не пойму как решить.

Есть два грида, нужно перетаскивать ячейки из одного в другой. 

Более менее разобрался с гридом, из которого тяну ячейки

procedure TForm2.GridMouseDown(Sender: TObject; button: TMouseButton; Shift: TShiftState; X, Y: single);
var
  Svc: IFMXDragDropService;
  DragData: TDragObject;
  DragImage: TBitmap;
  rect:trectf;
begin
  TPlatformServices.Current.SupportsPlatformService(IFMXDragDropService, Svc);
  with Sender as TStringGrid do
  begin
    Grid.CellByPoint(X, Y, SourceCol, SourceRow);
    DragImage:=TBitmap.Create;
    DragImage.Width:=round(Grid.Width);
    DragImage.Height:=round(grid.Height);
    rect:=rectf(0,(SourceRow+1)*grid.RowHeight,grid.Width,(SourceRow+2)*grid.RowHeight);
    DragImage.Canvas.BeginScene();
    DragImage.Canvas.Fill.Color:=4280444565;
    //DragImage.Canvas.FillRect(rect,0,0,[],1);
    DragImage.Canvas.FillText(rect,grid.Cells[SourceCol,SourceRow],false,1.0,[],TTextalign.Leading);
    DragImage.Canvas.EndScene;

    form1.currentItem := form1.items.ChildNodes.Nodes[SourceRow];
    DragData.Source := Sender;
    try
      DragData.Data := SourceRow;
      Svc.BeginDragDrop(self, DragData, DragImage);
    finally
      DragImage.Free;
    end;
  end;
end;

Вижу, что код отрабатывает, появляется изображение с текстом ячейки, которую перетаскиваю. Но вот заставить принять ее второй грид не могу. Более того, даже в droptarget ничего не попадает. Не пойму как гриду сказать, что он может принимать что-то по drag&drop

В VCL это было так

procedure TForm2.RoomGridDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept := (Source = Grid);
end;

А как это сделать в FireMonkey?

procedure TForm2.RoomGridDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF;
  var Operation: TDragOperation);
begin
  Operation := TDragOperation.Copy;
end;

это не помогает... вообще не вызывается dragover...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Отвечу сам себе. Проблема решена.

Всего два дня поисков и вот он, случай - краеугольный камень поиска ошибок! Меня аж забомбило, когда я это откопал. Оказалось, что мой грид лежит на лайоуте, у которого hittest = false. Так вот до тех пор, пока я не перевел его в true грид отказывался принимать ondragover. Но как только layout.hittest:=true все заработало. Дальше дело техники.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...