Text aus- und einlesen
-
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!