Drag and Drop między dwoma Editami

Hokeista z piekła

Witam!
To w sumie będzie kontynuacja artykułu Adama Boducha o Drag and Drop między Listboxami, tylko tutaj znajdziesz między Editami :)
Bardzo banalne, ale jakze nieraz potrzebne :D

OK, nie ma na co czekać i do dzieła...

Utwórz nową formę i wstaw na nią dwa komponenty Edit.

Edit1 to będzie nasze źródło textu, które będziemy przeciągać - (SOURCE).
Edit2 to będzie nasz komponencik, w którym znajduje się już przeciągnięty text (SENDER).

Kliknij na Edit1 i w jego zdarzeniu (zakładka Events) OnMouseMove wklej poniższy kod:

procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
{ jezeli podczas przesuwania kursora myszy nacisniety jest lewy przycisk myszy to rozpocznij proces DnD }
 if ssLeft in Shift then
    TEdit(Sender).BeginDrag(FALSE);
    end;

OK, jak już to zrobiłeś to kliknij na Edit2 (czyli ten, w którym będzie znajdował się tekst po przecięgnięciu) i w jego zdarzeniu OnDragOver wklej ten kod:

procedure TForm1.Edit2DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  { ta procedura wystepuje wtedy, gdy kursor myszy znajdzie sie nad komponentem - przyjecie "paczki" danych (Accept) nastepuje wtedy gdy objekty Sender oraz Source sa rozne }
 Accept := Sender <> Source;
end;

W tym samym komponencie (Edit2) w zdarzeniu OnDragDrop wklej jeszcze poniższy kod:

procedure TForm1.Edit2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
{ ta procedura powoduje "przyjecie" danych - nowa wartosc zostaje dodana do komponentu.
  Z komponentu, z ktorego sa dane przesylane pozycja jest usuwana }
  TEdit(Sender).Text:=(Tedit(Source).Text);
TEdit(Source).Clear;
 end;

No i ostatnia rzecz jaką musisz (nie koniecznie) zrobić to w Edit1, w zdarzeniu OnDragEnd wkleić taki kodzik: :)

procedure TForm1.Edit1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
{ Parametr Target wskazuje na komponent, ktory zostal przeciagany i opuszczany
obiekt. Jesli wartosc wynosi nil, oznacza to, że żadna kontrolka nie przyjela obiektu }
if Target = nil then
 MessageBeep(MB_IconError); // wtedy odtworz dzwiek
end;

I to wszystko :)
Skompiluj program i wpisz jakiś tekst do Edit1, potem przeciągnij go do drugiego Edita. Po przeciągnięciu, tekst usuwa się z pierwszego Edita, ale możesz zrobić też, że nie będzie tak się robiło i wystarczy takie coś:

//TEdit(Source).Clear;

lub po prostu usuń tą linijkę. :)

To byłoby na tyle. Bardzo banalne, ale przydatne.
Komentarze pochodzą z artykułu Adama Boducha i tylko ostatni jest mój.

4 komentarzy

Olej, a nie lepiej label z transparent=true?

A czy ktos zmajstrował moze wersje przeciągnięcia tak aby z kurosrem przeciągał się przeciągany tekst??? zrobiłem to z wykorzystaniem statictext ale nie bardzo mi kontrola tła tego static tekstu wychodzi.... jakiś rodzaj przezroczystosci by mi sie przydał, jakies pomysł???