Jak zrobić Drag & drop z TDBGrid do TMemo z MouseDown

0

Witajcie,

Potrzebuję zrobić przenoszenie danych z dataset reprezentowanego za pomocą DBGrid do TMemo. Problem mam taki, że gdy na DBGrid przestawiłem

DragMode = dmAutomatic

to przestałem mieć możliwość przechodzenia między rekordami. Przy dmManual z kolei nie bardzo to działa. Znalazłem artykuł gdzie opisane jest aby w zdarzeniu OnCellClick zrobić DBGrid1.BeginDrag(true);


Działa fajnie ALE muszę wykonać klik na konkretnym ROW w DBGrid (zmieni się kursor itd), a następnie klik w TMemo aby wykonało się TMemo.OnDragDrop. 

Dwa kliki mi nie odpowiadają i chciałbym to zrobić tak jak jest to w przypadku dmAutomatic z możliwością wybrania wiersza. 
Doczytałem się również, że MouseDown nie działa ze względu na zdarzenie OnCellClik i trzebaby nadpisać metodę MouseDown z TCustomDBGrid w nowej klasie ale takiego rozwiązania nie chcę. Czy macie jakieś inne pomysły jak to obejść?
0

Jak nazwa wskazuje Drag & Drop oznacza Drag (pociągnij) & (i) Drop (puść).
Czyli nie klikasz, tylko przeciągasz.

0

@kAzek działa ale niestety w sposób jaki opisałem. Czyli trzeba wykonać klik (MouseDown i MouseUp) w TDBGrid (zmienia się kursor) i następnie w TMemo z obsłużonym OnDragOver i OnDragDrop ponownie wykonać klik. A ja chcę efekt jak dla statycznych komponentów z dmAutomatic czyli MouseDown w TDBGrid (zmienia się kursor), MouseMove (ten sam lub inny kursor w zależności od OnDragOver) i MouseUp nad komponentem TMemo :)

2

Zrobiłem eksperyment tyle że z TStringGrid ale to praktycznie to samo i wg. mnie działa jak trzeba:

procedure TForm1.FormCreate(Sender: TObject);
var
  i, j: Integer;
begin
  for i:=0 to StringGrid1.ColCount -1 do
  begin
    for j:=0 to StringGrid1.RowCount -1 do
      StringGrid1.Cells[i, j]:= IntToStr(i) + Char(65 + j);
  end;
end;

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  StringGrid1.BeginDrag(true);
end;

procedure TForm1.Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept:= Source is TStringGrid;
end;

procedure TForm1.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  Memo1.Lines.Add(StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]);
end;
0

@kAzek dla StringGrid zadziała ale dla DBGrid nie :) Problem leży w TCustomDBGrid.MouseDown

Dla dbgrid zadziałało mi to (BeginDrag(true)) w przypadku gdy obsłużyłem na zdarzeniu OnEnter ale ... też są pewne minusy jak np to, że zmiana recordu nie powoduje odpalenia OnEnter ...

4

A taka "naprawa" OnMouseDown

type
  TDBGrid = class (DBGrids.TDBGrid)
  private
    procedure WMLButtonDown(var Msg : TMessage); message WM_LBUTTONDOWN;
  end;
//----
implementation

procedure TDBGrid.WMLButtonDown(var Msg : TMessage);
var
  Cell: TGridCoord;
  p: TPoint;
begin
  inherited;
  p:= Self.CalcCursorPos;
  Cell:= TDBGrid(Self).MouseCoord(p.X, p.Y);
  if (Cell.X > 0) and (Cell.Y > 0) and (TDBGrid(Self).SelectedField <> nil) then
    Self.BeginDrag(true);
end;

@woolfik mała korekta sprawdzenie SelectedField na wszelki wypadek

@woolfik kolejna korekta sprawdzenie sprawdzenie gdzie kursor aby nie przeciągać gdy klikniesz na nagłówek kolumny albo nawigator

0

@kAzek dzięki za poprawki choć u w moim przypadku akurat nie są tak niezbędne bo po pierwsze mam tylko 1 kolumnę, po drugie navigator jest ukryty po trzecie potrzebuję tylko ID bo dane są pobierane z DetailDataSet, a Drag&Drop zaprogramowany jest na MasterDataSet więc tragedii nie ma jedyne co się przydało to faktycznie klik na title. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1