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.
    also

    if (!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
    

Anmelden zum Antworten