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.
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ł???
ciekawe
niezłe