Frage zu Contains()
-
Hi.
void __fastcall TForm1::RichEdit1KeyPress(TObject *Sender, char &Key) { typedef Set<char,'0','1','2','3','4','5','6','7','8','9','-','.',':'> Input; Input text; if (!text.Contains(Key)) { // Falsches Zeichen, löschen! Key = 0; } }Hier ist die typedef Zeile falsch .. aber wie kann ich eine Solche Liste anlegen und dann so prüfen wie ich es möchte? Auf eine if oder switch habe ich eigentlich keine Lust. Alternativ könnte man nen Array Anlegen und dieses per Schleife durchgehen, es gibt doch da bestimmt eine schönere vorhandene Lösung, oder?
-
Hallo
mit dem VCL-Set ist das so nicht möglich, da du nicht einzelne Symbole, sondern nur einen Bereich angeben kannst.
Set <char, 'A', 'C'> s1; Set <char, 'X', 'Z'> s2;Du kannst aber std::set nehmen, damit kannst du selber jeden einzelnen Wert in dem set festlegen. Sieht in deinem Fall aber auch nicht eleganter aus als ein C-Array mit einer Schleife.
bis bald
akari
-
Schade

Aber was mach ich denn jetzt falsch?
bool __fastcall TForm1::Contains(char *array, char chr) { Caption = IntToStr(sizeof(array)); // <<< gibt 4 aus for (int i=0;i<sizeof(array);i++) { if (chr==array[i]) return true; } return false; } void __fastcall TForm1::TeRichEdit1KeyPress(TObject *Sender, char &Key) { char array [] = {'0','1','2','3','4','5','6','7','8','9','-','.',':'}; if (!Contains(array,Key)) { Key = 0; } }warum ist das array in der Contains Funktion nur noch 4bytes bzw was muss ich anders machen?
-
liony schrieb:
Hi.
void __fastcall TForm1::RichEdit1KeyPress(TObject *Sender, char &Key) {na, in dem falle des reagierens auf tastendrücke, muß es ja nicht die star-performance sein.
alsoif (!strchr("0123456789,.-",Key)) { // Falsches Zeichen, löschen! Key = 0; } }
-
probier mal,
int arraysize = sizeof(array) / sizeof(array[0]);funktioniert aber nicht bei dynamisch angelegten array!
-
Danke klappt super! Könnte mir trotzdem jemand den Fehler in meinem Funktionskopf sagen?

-
@Sunday
Da kommt auch 4 raus
-
ja na klar,
du uebergibst ja das array der funktion und der zeiger wird als 32bit (4byte) geführt -> daher 4byte. du musst die groesse vorher berechnen...
char array[] = {'0','1','2','3','4','5','6','7','8','9','-','.',':'}; int arraysize = sizeof(array) / sizeof(array[0]); // aufruf bool __fastcall TForm1::Contains(char *array, int arraysize, char chr) { }
-
Sunday schrieb:
du uebergibst ja das array der funktion und der zeiger wird als 32bit (4byte) geführt -> daher 4byte. du musst die groesse vorher berechnen...
bool __fastcall TForm1::Contains(char *array, int arraysize, char chr) { }oder cooler übergeben
template<int arraysize> bool __fastcall TForm1::Contains(char (&array)[arraysize], char chr) { }
-
Oder, unter Verwendung der VCL-Klasse AnisString:
AnsiString ValidKeys = "0123456789-.:"; if (ValidKeys.AnsiPos(Key) == 0) // ist gedrückte Taste in ValidKeys enthalten? Key = 0; // Nein -> Eingabe löschen