Programowanie w języku Delphi » Artykuły

Drag and Drop między dwoma Editami

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 komentarze

Darkhog 2010-10-01 16:30

Olej, a nie lepiej label z transparent=true?

olej 2008-06-01 20:01

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ł???