Label verdeckt Panel



  • Hallo,

    ich habe ein Panel mit einem Label.
    Bei dem Panel benutze ich das OnMouseMove Ereigniss.

    Wenn ich mich nun aber mit dem Mousecursor in das Panel bewege aber auf dem
    Label lande wird das OnMouseMove Ereigniss nicht ausgelöst.

    Gib es da eine Möglichkeit das das OnMouseMove Ereigniss des Panels
    trotzdem ausgelöst wird.



  • Vlt wäre das hier ne Lösung: pack das OnMouse ereigniss in ne funktion, und führ die funktion im onmouse ereigniss bei beiden aus.



  • Ist eine nette Ide, aber ich habe 18 Panels mit Text sowie 5 CheckBoxen.
    Das gleiche Problem trit auch mit den CheckBoxen auf.

    Panel  
    |-----------------------------------------|
    |Label                          X X X X X |
    |-----------------------------------------|
    
    void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
         old_panel->Color = clMenu;
         ((TPanel*)Sender)->Color = clYellow;
         old_panel = ((TPanel*)Sender);
    }
    

    Ich ändere wenn ich mich auf einem Panel befinde die Farbe des Panels über dessen Zeiger.
    Ich könnte nun ja einfach bei dem OnMouseMove Ereigniss der CheckBoxen sowie
    des Labels das Panel1MouseMove ausführen.
    Da ich aber die Farbe des Panels ändern möchte, bekomme ich nicht den richtigen Zeiger.
    Schade das man nicht den Tag des Labels der CheckBoxen für Zeiger nutzen kann.



  • Ich habe es nun so gemacht...

    //---------------------------------------------------------------------------
    void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
         if(Sender==Label7 || Sender==alarm1_r1 || Sender==alarm1_r2 || Sender==alarm1_r3 || Sender==alarm1_r4 || Sender==alarm1_u)
         {
              old_panel->Color = clMenu;
              Panel1->Color = clYellow;
              old_panel = Panel1;
         }
         else if(Sender==Label8 || Sender==alarm2_r1 || Sender==alarm2_r2 || Sender==alarm2_r3 || Sender==alarm2_r4 || Sender==alarm2_u)
         {
              old_panel->Color = clMenu;
              Panel2->Color = clYellow;
              old_panel = Panel2;
         }
         else if(Sender==Label9 || Sender==alarm3_r1 || Sender==alarm3_r2 || Sender==alarm3_r3 || Sender==alarm3_r4 || Sender==alarm3_u)
         {
              old_panel->Color = clMenu;
              Panel3->Color = clYellow;
              old_panel = Panel3;
         }
         else if(Sender==Label10 || Sender==alarm4_r1 || Sender==alarm4_r2 || Sender==alarm4_r3 || Sender==alarm4_r4 || Sender==alarm4_u)
         {
              old_panel->Color = clMenu;
              Panel4->Color = clYellow;
              old_panel = Panel4;
         }
         else if(Sender==Label11 || Sender==alarm5_r1 || Sender==alarm5_r2 || Sender==alarm5_r3 || Sender==alarm5_r4 || Sender==alarm5_u)
         {
              old_panel->Color = clMenu;
              Panel5->Color = clYellow;
              old_panel = Panel5;
         }
         else if(Sender==Label12 || Sender==alarm6_r1 || Sender==alarm6_r2 || Sender==alarm6_r3 || Sender==alarm6_r4 || Sender==alarm6_u)
         {
              old_panel->Color = clMenu;
              Panel6->Color = clYellow;
              old_panel = Panel6;
         }
         else if(Sender==Label13 || Sender==alarm7_r1 || Sender==alarm7_r2 || Sender==alarm7_r3 || Sender==alarm7_r4 || Sender==alarm7_u)
         {
              old_panel->Color = clMenu;
              Panel7->Color = clYellow;
              old_panel = Panel7;
         }
         else if(Sender==Label14 || Sender==alarm8_r1 || Sender==alarm8_r2 || Sender==alarm8_r3 || Sender==alarm8_r4 || Sender==alarm8_u)
         {
              old_panel->Color = clMenu;
              Panel8->Color = clYellow;
              old_panel = Panel8;
         }
         else if(Sender==Label15 || Sender==alarm9_r1 || Sender==alarm9_r2 || Sender==alarm9_r3 || Sender==alarm9_r4 || Sender==alarm9_u)
         {
              old_panel->Color = clMenu;
              Panel9->Color = clYellow;
              old_panel = Panel9;
         }
         else if(Sender==Label16 || Sender==alarm10_r1 || Sender==alarm10_r2 || Sender==alarm10_r3 || Sender==alarm10_r4 || Sender==alarm10_u)
         {
              old_panel->Color = clMenu;
              Panel10->Color = clYellow;
              old_panel = Panel10;
         }
         else if(Sender==Label17 || Sender==alarm11_r1 || Sender==alarm11_r2 || Sender==alarm11_r3 || Sender==alarm11_r4 || Sender==alarm11_u)
         {
              old_panel->Color = clMenu;
              Panel11->Color = clYellow;
              old_panel = Panel11;
         }
         else if(Sender==Label18 || Sender==alarm12_r1 || Sender==alarm12_r2 || Sender==alarm12_r3 || Sender==alarm12_r4 || Sender==alarm12_u)
         {
              old_panel->Color = clMenu;
              Panel12->Color = clYellow;
              old_panel = Panel12;
         }
         else if(Sender==Label19 || Sender==alarm13_r1 || Sender==alarm13_r2 || Sender==alarm13_r3 || Sender==alarm13_r4 || Sender==alarm13_u)
         {
              old_panel->Color = clMenu;
              Panel13->Color = clYellow;
              old_panel = Panel13;
         }
         else if(Sender==Label20 || Sender==alarm14_r1 || Sender==alarm14_r2 || Sender == alarm14_r3 || Sender == alarm14_r4 || Sender == alarm14_u)
         {
              old_panel->Color = clMenu;
              Panel14->Color = clYellow;
              old_panel = Panel14;
         }
         else if(Sender==Label21 || Sender==alarm15_r1 || Sender==alarm15_r2 || Sender==alarm15_r3 || Sender==alarm15_r4 || Sender==alarm15_u)
         {
              old_panel->Color = clMenu;
              Panel15->Color = clYellow;
              old_panel = Panel15;
         }
         else if(Sender==Label22 || Sender==alarm16_r1 || Sender==alarm16_r2 || Sender==alarm16_r3 || Sender==alarm16_r4 || Sender==alarm16_u)
         {
              old_panel->Color = clMenu;
              Panel16->Color = clYellow;
              old_panel = Panel16;
         }
         else if(Sender==Label23 || Sender==alarm17_r1 || Sender==alarm17_r2 || Sender==alarm17_r3 || Sender==alarm17_r4 || Sender==alarm17_u)
         {
              old_panel->Color = clMenu;
              Panel17->Color = clYellow;
              old_panel = Panel17;
         }
         else if(Sender==Label24 || Sender==alarm18_r1 || Sender==alarm18_r2 || Sender==alarm18_r3 || Sender==alarm18_r4 || Sender==alarm18_u)
         {
              old_panel->Color = clMenu;
              Panel18->Color = clYellow;
              old_panel = Panel18;
         }
         else                               //Kein Label oder CheckBox sonder ein Panel 
         {
              old_panel->Color = clMenu;
              ((TPanel*)Sender)->Color = clYellow;
              old_panel = ((TPanel*)Sender);
         }
    }
    

    Ich habe alle Objekte auf das OnMouseMove Ereigniss von Panel1 gelegt.
    Wobei alarmx_rx die CheckBoxen auf den Panels sind, sowie die Labels.
    Wie man sieht ziemlich viel Tipparbeit, vieleicht hat Jemand eine
    Idee wie man das leichter hinkriegt.



  • [cpp]//---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    oldPanel = Panel1;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Panel1MouseMove(TObject Sender, TShiftState Shift,
    int X, int Y)
    {
    TPanel *panel = dynamic_cast<TPanel*>(Sender);
    if (!panel) // Sender nicht TPanel, d.h. es sollte ein Label, CheckBox etc.
    { // sein, also holen wir uns einen Zeiger auf das Parent-Panel
    panel = dynamic_cast<TPanel
    >(((TControl*)Sender)->Parent);
    if (!panel) // Parent ist auch kein Panel, irgendwas ist schief gelaufen
    return; // (z.B. Event falscher Kompo zugewiesen), wir brechen ab
    }
    if (panel->Color != clYellow)
    {
    oldPanel->Color = clMenu;
    panel->Color = clYellow;
    oldPanel = panel;
    }
    }
    //---------------------------------------------------------------------------[/cpp]

    Ggf. müsste man noch eine Abfrage einbauen, ob das Event von einem "berechtigten" Panel kommt, schliesslich könnte man es ja fälschlicherweise auch einem nicht zur Gruppe gehörenden Panel bzw. Controls darauf zugewiesen haben. Allerdings dürfte sich so ein Fehler schnell bemerkbar machen, wenn das entsprechende Panel unerwartet ebenfalls eingefärbt wird. 😉



  • Hallo Jansen,
    danke für deine Hilfe.

    Soweit ist mir das klar, was ich nicht verstehe ist der "dynamic_cast"

    TPanel *panel = dynamic_cast<TPanel*>(Sender);

    Ich habe folgendes versucht...

    void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
         TPanel *panel = dynamic_cast<TPanel*>(Sender);       //1
         if(!panel)                                           //2
         {
             panel = dynamic_cast<TPanel*>(((TControl*)Sender)->Parent); //3
    
         }
         oldpanel->Color = clMenu;
         panel->Color = clYellow;
         oldpanel = panel;
    }
    

    Müsste doch eigentlich funktionieren, läuf aber nicht.
    Verstehe ich das richtig:
    //1 Ich hole mir den Zeiger des Objekts nach panel, heist "dynamic_cast<TPanel*>(Sender)" das in den Zeiger vom Typ TPanel
    auch der Zeiger einer CheckBox geladen wird, "halt ein dynamischer Zeiger".
    //2 Ich teste ob der Zeiger von einem Panel stammt.
    //3 Wenn nicht hole ich mir einen TControll Zeiger des übergeordneten Objekts in dem sich z.B. die Check, das Label befindet ->Parent.
    Was ich nicht ganz verstehe if(!panel), müsste es nicht if(panel != ZeigerPanel)
    heissen?



  • dynamic_cast hat einen entscheidenden Vorteil: wenn der cast fehlschlägt dann wird ein NULL-Zeiger zurückgegeben, und NULL ist bekanntlich äquivalent mit false. Ist der cast erfolgreich, dann wird mit dem Zeiger ein Wert ungleich NULL zurückgegeben, also true. Deshalb lassen sich damit so einfach if-Abfragen konstruieren.

    Bei anderen cast-Varianten wird immer ein Zeiger, also true, zurückgegeben, auch wenn der cast daneben ging und der Zeiger in's Blaue zeigt. Die sollte man also nur einsetzen, wenn man sich wirklich sicher ist, dass der cast erfolgreich sein wird oder wenn ein Fehlschlag nichts ausmacht. Letzteres trifft z.B. beim cast nach TControl im o.g. Beispiel zu: ein Fehlschlag hier wird durch das unmittelbar folgende dynamic_cast mit abgefangen.



  • Interessant so ein dynamic_cast, übrigens läuft es jetzt auch ich
    hatte nur vergessen das Label dem OnMouseMove Ereigniss zuzuweisen. 🙂

    Eh Jansen, schreib doch mal gutes Buch

    Also ich finde C++ interessant, habe aber in meinen C-Programmen schon meine
    Mühe nicht den Überblick nicht zu verlieren.

    Ich habe denn Eíndruck das z.B. die Klassenhirachie der VCL, keine Sau
    mehr versteht. ?oder?

    Ansonsten finde ich das mit den Klassen, Objekten garnicht so schlecht.


Log in to reply