CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Przenoszenie komponentów

Przenoszenie komponentów

dział ogólny

Przenoszenie komponentów

Nowy postprzez Gazunio » sobota, 13 listopada 2010, 20:55

Witam.
Chciałbym się zapytać, jak wykonać takie coś w stylu "tablicy" do przypinania "obrazków": Mam Formularz, jesst na nim Image z grafiką przedstawiającą tablicę korkową. Są też inne obrazy. Chciałbym, by dało je się przenosić w obrębie "tablicy" tak jak np. foldery w systemie, czyli przyciskam i przenoszę w inne miejsce ;)
To samo może być w przypadku pól tekstowych czy innych komponentów.
Avatar użytkownika
Gazunio
Bladawiec
Bladawiec
 
Posty: 32
Dołączył(a): środa, 13 maja 2009, 18:40
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2009
Gadu Gadu: 5147883
    Windows XPFirefox

Przesuwanie komponentów po formularzu.

Nowy postprzez Cyfrowy Baron » niedziela, 14 listopada 2010, 11:19

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:

KOD cpp:     UKRYJ  
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:

KOD cpp:     UKRYJ  
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:

KOD cpp:     UKRYJ  
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:

KOD cpp:     UKRYJ  
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:
KOD cpp:     UKRYJ  
  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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 13 gości

cron