Problem ze zdarzeniem w TPanel

dział ogólny

Problem ze zdarzeniem w TPanel

Nowy postprzez Michal-S2 » niedziela, 2 listopada 2008, 16:52

Mam na formularzy komponenty Panel1 i Label1. Chcaiłbym żeby po najechaniu myszą na Panel1 w Label1 wyświetliło się np. "Panel".
Kod: Zaznacz cały
void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
Label1->Caption = "Panel";
}

Jeszcze chciałbym żeby po zjechaniu kursora z Panel1 właściwość Caption komponentu Label1 wynosiła "Text". Nie chodzi mi o takie rozwiązanie że do zdarzenia onMouseMove formularza wpisuję "Label1->Caption = "Text";" Czy da się to inaczej zrobić? Jeszcze drugie pytanie: czym się różni onMouseUp od onMouseDown?
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Problem ze zdarzeniem w TPanel

Nowy postprzez wargo » niedziela, 2 listopada 2008, 19:19

Michal-S2 napisał(a):Jeszcze drugie pytanie: czym się różni onMouseUp od onMouseDown?

Mouse up to jest podnoszenie klawisza myszy po wciśnięciu a onMouseDown to wciśnięcie klawisza.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Problem ze zdarzeniem w TPanel

Nowy postprzez Cyfrowy Baron » niedziela, 2 listopada 2008, 19:42

Zdarzenie OnMouseDown jest wywoływane gdy wciskamy klawisz myszy do dołu, zdarzenie OnMouseUp jest wywoływane gdy zwalniamy klawisz klawisz myszy do góry, zdarzenie OnMouseMove jest wywoływane gdy przesuwamy wskaźnik myszy nad obiektem, zdarzenie OnClick jak widaomo oznacza kliknięcie w obiekt, czyli jest jakby połączeniem dwóch zdarzeń OnMouseDown + OnMouseUp. W nowszych wersjach środowiska C++ BUilder występuje dodatkowo zdarzenie OnMouseLeave wywoływane gdy wskaźnik opuszcza obiekt i jest przeciwieństwem zdarzenia OnMouseMove.

Co do Twojego pierwszego pytania, to zadanie może być zrealizowane tylko w zdarzeniach OnMOuseMove i OnMouseLeave, czyli w zdarzeniu OnMouseMove przypisujesz właściwości Caption jakąś wartość:

Kod: Zaznacz cały
void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
Label1->Caption = reinterpret_cast<TControl *>(Sender)->Name;   
}


W zdarzeniu OnMouseLeave wpisujesz inny tekst:

Kod: Zaznacz cały
void __fastcall TForm1::Panel1MouseLeave(TObject *Sender)
{
   Label1->Caption = "Text";   
}


Zamiast zdarzenia OnMouseMove możesz użyć zdarzenie OnMouseEnter:

Kod: Zaznacz cały
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
   Label1->Caption = reinterpret_cast<TControl *>(Sender)->Name;   
}


Zdarzeniem przeciwnym do OnMouseEnter jest OnMouseLeave, jeżeli nie masz zdarzenia OnMouseEnter to musisz skorzystać z OnMouseMove, jeżeli nie masz również zdarzenia OnMouseLeave to musisz stworzyć procedurę, która je zastąpi:

w pliku nagłówkowym np. Unit1.h:
Kod: Zaznacz cały
private:
      TWndMethod PanelLeave; // nazwa dowolna
      void __fastcall MousePanelLeave(TMessage &Msg); // nazwa dowolna


w pliku źródłowym np. Unit1.cpp:
Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) // konstruktor klasy
          : TForm(Owner)
{
   PanelLeave = Panel1->WindowProc;
   Panel1->WindowProc = MousePanelLeave;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MousePanelLeave(TMessage &Msg)
{
   if(Msg.Msg == CM_MOUSELEAVE)
         Label1->Caption = "Text";

   PanelLeave(Msg);
}
//---------------------------------------------------------------------------


Jeżeli chcesz wykorzystać zdarzenie OnMouseMove więcej niż w jednym obiekcie, czyli nie tylko w obiekcie Panel1 to możesz wykorzystać sposób z przypisaniem polimorficznym opisanym na początku artykułu w serwisie Cyfrowy Baron -> Rzutowanie typów, przypisanie polimorficzne, łącząc ze sobą obiekty poprzez zdarzenia. przy czym nie musisz niczego więcej wpisywać w zdarzenie OnMouseMove obiektu Panel1 gdyż zastosowałem tam rzutowanie polimorficzne do pobrania nazwy obiektu, tak więc po połączeniu przez to zdarzenie kliku innych obiektów, będą zwracane nazwy tychże obiektów.
Niestety, jeżeli nie dysponujesz zdarzeniem OnMouseLeave, to nie możesz tutaj wykorzystać przypisania polimorficznego do obsługi kliku kilku obiektów za pomocą jednej metody WindowProc. Prawdopodobnie można by to jakoś zrobić, ale teraz nic nie przychodzi mi do głowy.
Jeżeli dysponujesz zdarzeniem OnMOuseLeave to możesz wykorzystać przypisanie polimorficzne tak samo jak w zdarzeniu OnMouseMove.
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
    NieznanyNieznana

Re: Problem ze zdarzeniem w TPanel

Nowy postprzez Michal-S2 » wtorek, 4 listopada 2008, 09:36

Dzięki :D Jest taki efekt, jaki chciałem osiągnąć. Musiałem utworzyć procedurę, ponieważ mam C++ Builder 6. Kiedyś zainstalowałem 30-dniową wersję RAD Studio 2007, ale nie mogłem się przyzwyczaić i po tygodniu wróciłem do wersji 6.
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

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 2 gości