Text aus- und einlesen



  • Hallo

    3. ich möchte, dass eine fehlermeldung angezeigt wird, wenn in einem Edit Feld mehr als ein Buchstabe eingegeben wird. Methode ist glaub ich OnKeyDown oder On Key Press. Nur was soll ich da rein schreiben?

    Muß ich übersehen haben... Klar kann man das mit OnKeyDown machen und eine Fehlermeldung anzeigen. Aber am einfachsten ist die Eigenschaft TEdit::MaxLength auf 1 zu setzen.

    wie lange programmierst du schon? (wenn ich fragen darf)

    Mehr als 15 Jahre, aber weit weniger professionell.

    bis bald
    akari



  • so einfach?
    Vielen dank!



  • eine kleine frage ist mir gerade noch aufgekommen:

    ich habe 240 Editfelder.

    Ich möchte alle Felder auf readOnly=true machen, aber nicht immer Edit1->ReadOnly=true; etc. schreiben.

    gibt es eine kürze variante.

    und das ganze nochmal mit false.

    danke...



  • 240 (zweihundertvierzig??) Editfelder? Du solltest dir mal Gedanken über das Design machen... aber nagut, du hast gefragt, du kriegst ne Antwort. Am besten legst du die Edits dynamisch an, statt sie über den Designer zu erzeugen. Dann musst du die Attribute zwar alle selbst zuweisen, aber das geht in einer Schleife recht komfortabel.

    #include <vector>
    #include <algorithm>
    
    struct EditVisibleFunctor
    {
       bool Visible_
    
       EditVisibleFunctor( bool Visible ) : Visible_( Visible )
       {
       }
    
       void operator()( Edit* Edit ) const
       {
          Edit->Visible = Visible_;
       }
    };
    
    struct EditReadOnlyFunctor
    {
       bool ReadOnly_
    
       EditReadOnlyFunctor( bool ReadOnly ) : ReadOnly_( ReadOnly )
       {
       }
    
       void operator()( Edit* Edit ) const
       {
          Edit->ReadOnly = ReadOnly_;
       }
    };
    
    class TMyForm
    {
    ...
       // vector zum Verwalten der Edit Felder benutzen
       std::vector<TEdit*>   EditConrols_;
    
       void create_mayhem();
       void edit_controls_show( bool Show );
       void edit_controls_protect( bool ReadOnly );
    };
    
    using namespace std;
    
    void TMyForm::create_mayhem()
    {
       // 240 Edit Felder erzeugen
       for( unsigned int uiIndex = 0; uiIndex < 240; ++uiIndex )
       {
          // einfachstes Layout: alle Editfelder stehen untereinander
          TEdit* Edit = new TEdit( this );
          Edit->Parent = this;
          Edit->Width  = 48;
          Edit->Height = 21;
          Edit->Left   = 8;
          Edit->Top    = uiIndex * 24 +8;
    
          // Editfeld in vektor eintragen
          EditControls_.push_back( Edit );
       }
    }
    
    void TMyForm::edit_controls_show( bool Show )
    {
       for_each( EditControls_begin(), EditControls_.end(), EditVisibleFunctor( Show ) );
    }
    
    void TMyForm::edit_controls_protect( bool ReadOnly )
    {
       for_each( EditControls_begin(), EditControls_.end(), EditReadOnlyFunctor( ReadOnly ) );
    }
    

    Guter Zeitpunkt, um sich vielleicht mal in das Thema STL und Function Objects einzulesen, wenn man das einmal verstanden hat kann (und will) man nicht mehr ohne.

    Schönes Wochenende



  • Hi,

    es geht kürzer:

    TEdit * myedit;    
       for(int i=0; i < ComponentCount; i++) {
          if (Components[i]->ClassNameIs("TEdit")) {
             myedit = (TEdit *)Components[i];
             myedit->ReadOnly = true;
          }
       }
    

    kpeter



  • danke euch beiden!



  • kpeter schrieb:

    Hi,

    es geht kürzer:

    TEdit * myedit;    
       for(int i=0; i < ComponentCount; i++) {
          if (Components[i]->ClassNameIs("TEdit")) {
             myedit = (TEdit *)Components[i];
             myedit->ReadOnly = true;
          }
       }
    

    kpeter

    Du gehst davon aus, dass alle Edit Felder im Formular geändert werden sollen, aber was ist, wenn es zB ein Edit für die Klartexteingabe gibt? Man kann eine Unterscheidung über den Komponentennamen treffen, aber dann müsste man zur Designzeit jedem Edit einen bestimmten Namen geben...
    Ausserdem lässt sich die vector Lösung auch prima für die beiden anderen Aufgabenstellungen nutzen.



  • DocShoe schrieb:

    kpeter schrieb:

    Du gehst davon aus, dass alle Edit Felder im Formular geändert werden sollen...

    Hast recht, es würden alle TEdit geändert, die dem betreffenden Steuerelement
    untergeordnetet sind.

    Wenn drummi noch weitere TEdits auf dem Formular hat, lohnte sich eine Komponenten-Ableitung.

    mfg
    kpeter



  • es sind alles die gleichen edits und die sollen einfach die gleichen eigenschaften haben.

    ach ja, kann man eigentlich programmieren, dass wenn man etwas ins editfeld eingibt (oder in ein RichEditfeld) es automatisch großbuchtaben werden (egal ob Caps Lock an oder aus)

    lg
    drummi



  • Hi,

    klar geht das 🙂

    void __fastcall TForm1::Edit1Change(TObject *Sender)
    {
       TEdit* edit;
       edit = static_cast<TEdit*>( Sender);
       edit->Text = UpperCase(edit->Text);
    }
    //---------------------------------------------------------------------------
    

    Alle anderen TEdits markieren und im OI OnChange diesen Code zuweisen.

    mfg
    kpeter



  • danke seehr. funktioniert!


Anmelden zum Antworten