Funkcja zabezpieczająca - filtrująca znaki

dział ogólny

Funkcja zabezpieczająca - filtrująca znaki

Nowy postprzez simekone » wtorek, 26 maja 2009, 22:16

Mam nastepujacy kod do zabezpieczania pól typu edit przed wpisywaniem znaków innych niż cyfry. Wiem, że to troche przekombinowane, ale tylko tak udało mi sie tro zrobić. Funkcja wywołuje się na akcji onchange Edita.
Kod: Zaznacz cały
AnsiString tablica[] = {" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", ".", ",",
"+", "=", ";", "'", ":", "<", ">", "/", "?"};
String temp = Edit->Text;
for(int i = 0; i < 39; i++)
        temp = StringReplace(temp, tablica[i], "", TReplaceFlags() << rfReplaceAll);

Edit->Text = temp;
Edit->Perform(EM_SETSEL, temp.Length(), temp.Length());

Chciałbym prosić was o pomoc w uproszczeniu tej funkcji np. tworząc tablice znaków, które mogą być użyte, a nie tych które nie mogą. Może istniej funkcja która pomoże mi w sprawdzaniu zawartości? Cel jest taki, aby można był wpisywać cyfry oraz znak "-".
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana

Re: Funkcja zabezpieczająca - filtrująca znaki

Nowy postprzez Miroo_007 » wtorek, 26 maja 2009, 23:34

Proponuje wykorzystać zamiast TEdit, kontrolkę TMaskEdit z palety Application. Ta kontrolka działa na tej samej zasadzie co TEdit ale ma tą zaletę, że może wykorzystywać tzw. "maski". Czyli dopuszczalne wartości, które można wpisać.
Aby wgrać taką mastę wystarczy kliknąć prawym przyciskiem myszy na tej kontrolce i wybrać: Input Mask Editor.
inputmask1.gif
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Funkcja zabezpieczająca - filtrująca znaki

Nowy postprzez simekone » środa, 27 maja 2009, 11:45

Wiem o istnieniu tego komponentu, ale długość tekstu w Editach może być różna. Nie jest to jakiś stały schemat pod względem długości czy formy, a liczby z dość sporego zakresu. Możliwości oferowane przez ten komponent nie zadowalają mnie zbytnio, dlatego postanowiłem napisać funkcję.

P.S. Komponent ten znajduje się u mnie w zakładce Additional
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana

Re: Funkcja zabezpieczająca - filtrująca znaki

Nowy postprzez polymorphism » środa, 27 maja 2009, 13:19

simekone napisał(a):Cel jest taki, aby można był wpisywać cyfry oraz znak "-".

Z std::stringiem może to wyglądać tak:
Kod: Zaznacz cały
static const char* chars = "0123456789-";
string    text = /* whatever  */
int    np;

if((np = text.find_first_not_of(chars)) != string::npos)
{
   /* 'text' zawiera niedozwolony znak na pozycji 'np' */
}

PS. żeby nie było, cyfry możesz sprawdzać (standardową) funkcją isdigit.



Kod: Zaznacz cały
AnsiString tablica[] = {" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", ".", ",",
"+", "=", ";", "'", ":", "<", ">", "/", "?"};

Nie wiem skąd ty ten kod wygrzebałeś. Niezły As to pisał... 8-)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Funkcja zabezpieczająca - filtrująca znaki

Nowy postprzez simekone » środa, 27 maja 2009, 15:45

Nie do końca o to mi chodziło, ale dzięki za pomoc. Aby rozjaśnić sytuacje opiszę to co aktualnie robi ta funkcja, czyli to czego oczekuję.

Funkcja jest wywoływana dla każdego Edita dla zdarzenia OnChange - odpowiednio zawiera ona jego nazwę jako parametr. Działanie funkcji polega na tym, że w Edit użytkownik może wpisać co tylko chce, ale tylko liczby i znak "-" są akceptowane i pojawiają się w Text. Cała reszta mimo wciśnięcia klawisza nie pojawia się.
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana

Re: Funkcja zabezpieczająca - filtrująca znaki

Nowy postprzez polymorphism » środa, 27 maja 2009, 16:39

Hmm, a to nie lepiej użyć zdarzenia OnKeyPress (nie wiem czy to zadziała dla edita, ale można spróbować)? Bo jeśli tak, to wtedy możesz zrobić w ten sposób:
Kod: Zaznacz cały
void __fastcall xxx::OnKeyPress(System::TObject* Sender, char &Key)
{
     if(!strchr("0123456789-", Key))Key = 0; //<--- nie wiem czy to zadziała, spróbuj...
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Funkcja zabezpieczająca - filtrująca znaki

Nowy postprzez simekone » środa, 27 maja 2009, 18:30

polymorphism napisał(a):Hmm, a to nie lepiej użyć zdarzenia OnKeyPress (nie wiem czy to zadziała dla edita, ale można spróbować)? Bo jeśli tak, to wtedy możesz zrobić w ten sposób:
Kod: Zaznacz cały
void __fastcall xxx::OnKeyPress(System::TObject* Sender, char &Key)
{
     if(!strchr("0123456789-", Key))Key = 0; //<--- nie wiem czy to zadziała, spróbuj...
}


Działa, ale filtruje także Backspace, który IMO powinien działać. Delete działa poprawnie.
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana

Re: Funkcja zabezpieczająca - filtrująca znaki

Nowy postprzez polymorphism » środa, 27 maja 2009, 19:59

Rusz trochę głową, to backspace będzie działał jak należy.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Funkcja zabezpieczająca - filtrująca znaki

Nowy postprzez simekone » środa, 27 maja 2009, 20:15

polymorphism napisał(a):Rusz trochę głową, to backspace będzie działał jak należy.


Ruszyłem głową i działa ;) Wielkie dzieki
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 9 gości