Jak rozumiem chcesz przesuwać komponenty po formularzu?!
Zadanie nie jest specjalnie skomplikowane. Wytłumaczę na przykładzie.
W pliku nagłówkowym np.
Unit1.cpp zadeklaruj następujące elementy w sekcji
private:
private:
bool bMove;
int cLeft, cTop;
TObject *cSender;
W pliku źródłowym np.
Unit1.cpp w konstruktorze klasy wypełnij zmienne domyślnymi wartościami:
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
bMove = false;
cLeft = 0, cTop = 0;
}
Umieść na formularzu komponent
Panel1. Następnie utwórz mu dwa zdarzenia
OnMouseDown i
OnMouseUp:
void __fastcall TForm1::Panel1MouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(Button == mbLeft)
{
bMove = true;
cSender = Sender;
cLeft = X;
cTop = Y;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Panel1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
bMove = false;
reinterpret_cast<TControl *>(Sender)->BringToFront();
}
Teraz umieść na formularzu komponent
ApplicationEvents1 (szukaj na zakładce: Additional) i utwórz mu zdarzenie
OnIdle:
void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)
{
POINT cPos;
GetCursorPos(&cPos);
POINT wPos = ScreenToClient( cPos);
if(bMove == true)
{
TControl *tmpComp = reinterpret_cast<TControl *>(cSender);
tmpComp->Left = wPos.x - cLeft;
tmpComp->Top = wPos.y - cTop;
}
}
To na razie wszytko. Skompiluj projekt, uruchom i sprawdź. Panel1 po uchwyceniu myszką powinien przesuwać się po formularzu.
Przy dodawaniu kolejnych komponentów na formularz, nie musisz już tworzyć żadnego kodu, wystarczy, że każdy nowy komponent podłączysz pod zdarzenia OnMouseDown i OnMouseUp komponentu Panel1. Nie wiesz jak to zrobić? Spróbuję wyjaśnić. Umieszczasz np. na formularzu obiekt Memo1. Zaznaczasz go i w Object Inspector przechodzisz na zakładkę Events. Odnajdujesz na liście zdarzenie OnMouseDown i rozwijasz listę. Na liście widoczne są dwa rekordy: Panel1MouseDown i Panel1MouseUp. Wybierasz z listy Panel1MouseDown, gdyż podłączasz Memo1 pod zdarzenie OnMosueDown obiektu Panel1. Teraz odnajdujesz zdarzenie OnMouseUp i tym razem z listy wybierasz zdarzenie Panel1MouseUp, gdyż teraz podłączasz Memo1 pod zdarzenie OnMouseUp obiektu Panel1.events.png
W podanym kodzie obiekt przesuwany po formularzu zawsze po zakończeniu przesuwania, będzie przywoływany na wierzch, odpowiada za to ten fragment kodu: reinterpret_cast<TControl *>(Sender)->BringToFront();
W przypadku obiektów typu TImage to jednak nie zadziała gdyż w odróżnieniu od np. TPanel, czy TMemo, klasa TImage nie dziedziczy po TWinControl. W przypadku TImage przywoływanie na wierzch zadziała tylko w odniesieniu do innego obiektu tego typu.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.