m8815010
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:99 回覆:372 積分:289 註冊:2003-11-13
發送簡訊給我
|
引言:
各位先進好:
小弟想要在使用動態元件時,想要讓一動態元件拖曳至另一動態
元件時,交換彼此的值(可能是caption or TEXT),想請問各位大大要如何達成呢?
如下圖是小弟建立的動態元件EDIT的距陣,目前想要拖曳1至3時,希望能讓
值互相對換,
經由拖曳變成如下圖的效果,請問前輩們可行嗎?
terence_lee你好 : 寫一個兩個 class="code">
Unit1.h
~~
class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall Edit1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Edit1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall Edit1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
void __fastcall Edit2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Edit2MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall Edit2MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
}; Unit1.cpp
~~
TForm1 *Form1; TEdit* Edit1; //初始時設定有兩個TEdit元件
TEdit* Edit2; int org1_x,org1_y; //Edit1的原始座標(x,y)
int now1_x,now1_y; //Edit1移動過程的座標(x,y) int org2_x,org2_y; //Edit2的原始座標(x,y)
int now2_x,now2_y; //Edit2移動過程的座標(x,y) //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1=new TEdit(this);
Edit1->Parent=this;
Edit1->this->Edit1MouseDown;
Edit1->this->Edit1MouseMove;
Edit1->this->Edit1MouseUp;
Edit1->Left=50;
Edit1->Top=100;
Edit1->Width=100;
Edit1->Height=50;
Edit1->Text="OOO";
Edit1->AutoSize=false;
Edit1->Font->Size=24; Edit2=new TEdit(this);
Edit2->Parent=this;
Edit2->this->Edit2MouseDown;
Edit2->this->Edit2MouseMove;
Edit2->this->Edit2MouseUp;
Edit2->Left=500;
Edit2->Top=100;
Edit2->Width=100;
Edit2->Height=50;
Edit2->Text="XXX";
Edit2->AutoSize=false;
Edit2->Font->Size=24; org1_x=Edit1->Left;
org1_y=Edit1->Top;
org2_x=Edit2->Left;
org2_y=Edit2->Top;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button==mbLeft) {
org1_x=Edit1->Left;
org1_y=Edit1->Top;
now1_x=X;
now1_y=Y;
SetWindowPos(Edit1->Handle,HWND_TOP,Edit1->Left,Edit1->Top,Edit1->Width,Edit1->Height,SWP_SHOWWINDOW);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (Shift.Contains(ssLeft)) {
Edit1->Left+=(X-now1_x);
Edit1->Top+=(Y-now1_y);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
int hon_diff,ver_diff;
hon_diff=abs(Edit1->Left-Edit2->Left);
ver_diff=abs(Edit1->Top-Edit2->Top); if (hon_diff<15 && ver_diff<15) { //判斷是否交換
AnsiString buf;
buf=Edit1->Text;
Edit1->Text=Edit2->Text;
Edit2->Text=buf;
} Edit1->Left=org1_x;
Edit1->Top=org1_y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button==mbLeft) {
org2_x=Edit2->Left;
org2_y=Edit2->Top;
now2_x=X;
now2_y=Y;
SetWindowPos(Edit2->Handle,HWND_TOP,Edit2->Left,Edit2->Top,Edit2->Width,Edit2->Height,SWP_SHOWWINDOW);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (Shift.Contains(ssLeft)) {
Edit2->Left+=(X-now2_x);
Edit2->Top+=(Y-now2_y);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
int hon_diff,ver_diff;
hon_diff=abs(Edit1->Left-Edit2->Left);
ver_diff=abs(Edit1->Top-Edit2->Top); if (hon_diff<15 && ver_diff<15) { //判斷是否交換
AnsiString buf;
buf=Edit1->Text;
Edit1->Text=Edit2->Text;
Edit2->Text=buf;
} Edit2->Left=org2_x;
Edit2->Top=org2_y;
}
//---------------------------------------------------------------------------
Conclusion 1.範例示範如果任一元件托到另一元件上時,就交換彼此的caption(text),,不管有無交換caption,托曳完後元件都各自回到自已原來的postion
2.承上,當Edit1托曳至Edit2上方時,是要完全疊合才可以交換caption,或是只要大概
疊合就可以交換,這個尺度要以自身的需求衡量設定!
3.同時有9個TEdit元件時,判斷某個元件托曳到那一個元件上時的判斷過程當然比較複雜
,這個就請自行再延伸撰寫了,只是精神比照本範例!
4.另外一樣,事件最好要共用,才不用寫一堆! All, ! 發表人 -
|