Klasse von TEdit abgeleitet -> AutoSelect funktioniert nicht mehr



  • Hi,

    ich habe mir eine neue Komponente erstellt, welche von TEdit abgeleitet ist.

    Wenn ich nun eine solche Komponente auf einer Form plaziere und das Programm
    startet, dann wird der Text innerhalb dieser Komponente nicht autoselektiert,
    wenn die Komponente den Focus erhaelt, obwohl ich die Eigenschaft 'AutoSelect'
    auf 'true' gestellt habe.

    Bis jetzt hab ich es so geloest, dass ich in das OnEnter-Event den Code:

    this -> MyComponent -> SelStart = 0;
    this -> MyComponent -> SelLength = this -> MyComponent -> Text.Length ();
    

    plaziert hab, damit das "Autoselektieren" dennoch funktioniert.

    Warum wird die Funktionalitaet 'AutoSelect' nicht mitvererbt?

    Wie kann ich es aendern, dass ich nicht in jedes OnEnter-Event einer auf einer
    Form plazierten Komponente den obigen Code einfuegen muss, sondern dass die
    Autoselektion mittels der 'AutoSelect'-Eigenschaft aktiviert bzw. deaktiviert
    werden kann?

    Danke schon mal im Voraus.

    [nachtrag]
    also ich hab in der neuen komponente ein paar operatoren ueberladen, aber
    das sollte doch nicht das problem sein, oder?
    [/nachtrag]

    mfg
    v R

    [ Dieser Beitrag wurde am 05.03.2003 um 14:59 Uhr von virtuell Realisticer editiert. ]



  • So, ich nochmal.

    Ich hab das Problem jetzt eingrenzen koennen und herausgefunden, dass es daran
    liegt, dass ich in der Klasse

    void __fastcall CreateParams ( TCreateParams &Params );
    

    deklariert und in der entsprechenden .cpp-Datei wie folgt implementiert hab
    (wie es in der FAQ steht, zum Ausrichten der Textposition):

    void __fastcall MyComponent::CreateParams ( TCreateParams &Params )
    {
            TEdit::CreateParams ( Params );
            Params.Style = Params.Style | ES_MULTILINE;
            Params.Style = Params.Style | this -> m_Alignment;
    }
    

    Werden damit alle anderen eingestellten Eigenschaften ueberschrieben?

    Ich habe uebrigens auch feststellen muessen, dass die Eigenschaft 'PasswordChar'
    auch nicht mehr ihren Dienst tut.

    Gibt es nicht ne Moeglichkeit, dass es doch wie gewollt funktioniert und ich
    dennoch es Alignment angeben kann?

    Danke im Voraus

    mfg
    v R



  • hi,

    in der hilfe zu EM_SETPASSWORDCHAR findest du:

    An application sends an EM_SETPASSWORDCHAR message to set or remove the password character for a single-line edit control when the user types text. When a password character is set, that character is displayed in place of each character the user types.

    ergo funktioniert das mit multiline-edits nicht!

    genauso ist es beim Multiline. wenn das in den Parametern enthalten ist, wird ein AutoSelect nicht durchgeführt. abhelfen kannst du dir, in dem du DoEnter überschreibst. näheres findest du in der hilfe. bei fragen einfach nochmal posten...



  • Danke, ich werd mir das mit DoEnter () noch mal anschauen. Fuers PasswordChar hab
    ich mir bereits eine Funktion geschrieben und das mit dem selektieren ist dann
    denke ich auch kein Problem mehr.

    mfg
    v R



  • Params.Style = Params.Style | this -> m_Alignment;
    

    Diese Zeile verstehe ich nicht. Kannst du das mal näher erläutern? Was ist m_Alignment, und von welchem Typ ist das? Du weißt, dass da ein Style hinkommen muss?!



  • sicherlich was in der art hier, halt nur etwas anders... 😉

    // alignment
    if (FAlign == taLeftJustify)  Params.Style |= ES_LEFT;
    if (FAlign == taCenter)       Params.Style |= ES_CENTER;
    if (FAlign == taRightJustify) Params.Style |= ES_RIGHT;
    


  • Diese Zeile verstehe ich nicht. Kannst du das mal näher erläutern? Was ist m_Alignment, und von welchem Typ ist das? Du weißt, dass da ein Style hinkommen muss?!

    Hab mir ne Eigenschaft definiert, die nen Wert in m_Alignment speichert damit
    der Text linksbuendig, zentriert oder rechtsbuendig ist. Die Variable wird einfach
    entsprechend gesetzt.

    sicherlich was in der art hier, halt nur etwas anders...

    Jep 🙂

    mfg
    v R



  • Hi,

    falls es jemanden interessiert:

    Das mit dem Passwort ist jetzt kein Problem mehr. Ich hab die 'CreateParam'-
    Funktion etwas umgeschrieben und mir ne neue Eigenschaft

    bool    m_UsePasswordChar;
    

    definiert. Die 'CreateParams'-Funktion sieht jetzt wie folgt aus:

    void __fastcall MyComponent::CreateParams ( TCreateParams &Params )
    {
            TEdit::CreateParams ( Params );
            SetParams ( Params );
    }
    //---------------------------------------------------------------------------
    void MyComponent::SetParams ( TCreateParams &Params )
    {
            if ( !this -> m_UsePasswordChar )
            {
                    Params.Style |= ES_MULTILINE;
                    Params.Style |= this -> m_Alignment;
            }
            else
            {
                    Params.Style |= ES_PASSWORD;
            }
    }
    

    So, damit nun auch das automatische selektieren funktioniert muss man, wie
    Sunday schon gesagt hat, die 'DoEnter'-Methode ueberschreiben.

    //deklaration, wie sie im klassenheader stehen muss
    DYNAMIC void __fastcall DoEnter(void);
    
    //implementation
    void __fastcall MyComponent::DoEnter ( void )
    {
          TEdit::DoEnter ();
          this -> SelStart = 0;
          this -> SelLength = this -> Text.Length ();
    }
    

    Jo, das wars dann auch schon. Danke fuer eure Hilfe.

    mfg
    v R



  • hm... woszu schreibst du immer this-> mit hin???

    und im DoEnter kannste einfach die WindowMessage senden anstatt so umständlich zu markieren...

    // wenn Flag für Multiline gesetzt und Autoselect aktiv
    if (FMultiline && AutoSelect)
      SendMessage(Handle, EM_SETSEL, 0, -1);
    


  • hm... woszu schreibst du immer this-> mit hin???

    Is so ne Angewohnheit von mir, kanns mir irgendwie nicht abgwoehnen.

    und im DoEnter kannste einfach die WindowMessage senden anstatt so umständlich zu markieren...

    thx, werd ich so machen.

    mfg
    v R


Anmelden zum Antworten