Parent Benachrichtigung, wenn sich ein Attribut eine Child Controls ändert



  • Mahlzeit,

    ich habe ein Panel, in dem sich einige Controls befinden, die ein- und ausgeblendet werden können. Jedesmal, wenn das Visible Flag eines Controls geändert wird muss das Layout des Panels neu bestimmt werden. Das alles passiert also zweistufig:

    1. Status der entsprechenden Controls anpassen (durch Visible Flag)
    2. Layout anpassen (durch expliziten Auruf)

    Meine Frage ist jetzt: Kann man das irgendwie Event gesteuert hinbekommen? Für das Visible Attribut gibt es keinen Callback, den man benutzen könnte. Mir sind dazu folgende Lösungen eingefallen, allesamt unbefriedigend:

    1. Timer gesteuertes Polling des Status. Hat die Nachteile, das man einen eigenen Timer braucht und sich den alten Status merken muss. Schön isses auch nicht.

    2. Subclassing aller Controls im Panel und Reagieren auf die WM_SHOW Message. Dazu muss ich mir allerdings die alte Fensterprozedur des Controls merken... auch nicht schön.

    Gibt´s da eine einfache Lösung?

    Gruß,
    Doc

    PS:
    Nein, ich kann keine TToolbar benutzen



  • Hallo,

    man könnte nach der Statusänderung des Steuerelements eine Funktion aufrufen, die das Layout aktualisiert... klingt iwie zu einfach... hab' ich was falsch verstanden?

    MfG



  • Hallo Kolumbus,

    genauso mache ich das ja im Moment, nur ich möchte, dass das Panel das intelligent selbst übernimmt, damit ich den Aufruf nicht mehr selbst machen muss.

    Gruß,
    Doc



  • Hi,

    Eventuell TPanel durch ein eigenes TRedrawPanel ersetzen und von den Geänderten Elementen das auf TRedrawPanel gecastete parent->ReZeichne aufrufen oder einfach eine normale Funktion ReZeichne die das macht.
    Dann von den darauf befindlichen Elementen Komponenten ableiten, die fürs Visible setzen eine Set-Funktion haben. In der dann den Parent anschubsen.
    Oder ganz anders: Eine Funktio, die über einen Parametersatz die Sichtbarkeit aller Elemente übergeben kriegt und selbst alle Elemente entsprechend setzt und dann das Panel anpasst.
    Viele Wege fürhen nach Rom, such Dir den für Dich gangbarsten aus.

    Gruß Mümmel



  • Hach je,

    ich seh schon, da gibt´s nix Einfaches. Ich bleib einfach bei der bisherigen Lösung, das Panel nach je Änderung manuell zu aktualisieren.

    Gruß,
    Doc



  • Also wenn es ohne Subclassing gehen soll:

    - mach ne Funktion

    SetCtrlVis(TControl *ACtrl, Boolean Vis)
    { ACtrlVis->Visible=Vis;
    
      //Hier alle nötigen Anpassungen im Formular machen
      // Ev. passend zu ACtrl
    }
    

    Anstatt "Visible" der Komponenten direkt zu schalten, rufst Du diese Funktion auf.

    Gruss
    Frank


Anmelden zum Antworten