Filter in der Edit Box
-
Hier wieder mein Lieblingstipp: http://www.codeproject.com/editctrl/validatingedit.asp
Da kann man sich was abgucken.
Für das 0-9 kannst du aber auch einfach die Maximallänge auf 1 festsetzen und nur Zahlen zulassen. Das ist einfacher.

-
Danke für den Link, schau ich mir gleich mal an.
Das mit der Maximallänge klingt ganz gut. allerdings will ich von 0-200 die werte eingeben können. wenn ich 2-0-1 eintrage soll er anstatt der 1 die 0 eintragen.
ich dachte da an einen unkomplizierten weg per if - schleife. (komme aus der ansi - c welt und kenn mich in visual so fast gar nicht aus - noch nicht
)
nur zahlen zulassen ist schonmal nicht verkehrt und dann wollte ich sowas wie:if(wert > 200)
wert = 200;und gut ist.
geht das so? und kann mir einer kurz erklären wie ich nur zahlen als eingabe zulasse?Vielen Dank
-
McFanatic schrieb:
Das mit der Maximallänge klingt ganz gut. allerdings will ich von 0-200 die werte eingeben können. wenn ich 2-0-1 eintrage soll er anstatt der 1 die 0 eintragen.
Das würde ich erst machen wenn das Control verlassen wird.
McFanatic schrieb:
und kann mir einer kurz erklären wie ich nur zahlen als eingabe zulasse?
Den Stil ES_NUMBER für das Edit Control setzen.
-

das mit den nummern war denkbar einfach. hätte ich durch probieren aber auch selber drauf kommen müssen.
danke
-
Hallo Leute,
ich möchte das Thema gerne wieder warm machen und ein wenig erweitern.
Wir sprechen über folgenden Code:void CComCentralOneView::OnRead() { CSerial serialSend; // sendes des Identifiers serialSend.Open(1,19200,8,NOPARITY,ONESTOPBIT); // Port öffnen serialSend.SendData("#", 1); // ID = "#" serialSend.Close(); // Port schließen CSerial serialRead; // emfangen der Daten if (serialRead.Open(1,19200,8,NOPARITY,ONESTOPBIT)) // Port öffnen { int receivedData = 0; char* lpBuffer = new char[8]; // Größe des Puffers festlegen receivedData = serialRead.ReadData(lpBuffer, 16); // int = anzahl der max. einzulesenen Werte cout << lpBuffer; char EEPROM_Inhalt[8]; // Ausgabe ... strcpy(EEPROM_Inhalt, lpBuffer); // der ... // if ((EEPROM_Inhalt == "F") || (EEPROM_Inhalt == "1") || (EEPROM_Inhalt == "3")){ m_strEEPROM = EEPROM_Inhalt; // Daten m_strStatusMsg = "Daten wurden erfolgreich ausgelesen!"; // } } serialRead.Close(); // Port schließen }Nun Übertrage ich Daten per Serielle Schnittstelle und geben, diese im Editfentser aus. Nun kommt es leider zum Rauschen auf der Leitung oder ähnlichen, jedenfalls kommen mehr Daten an, als ich eigentlich haben will. Ich würde daher gernen einen Filter einbauen, der nur folgende Zeichen zulässt: (F, -, , 1, 2, 3, 4, 5, 6, 7, 8, 9, 0). Der erste Versuch mit einer einfachen if-Schleife schlug leider fehl. Könnt ihr mit Tipps geben, wie ich das am besten anstelle?
Vielen Dank
PS: Wenns am Code selber noch verbesserungswünsch gibt, immer raus damit. Danke
-
wie Martin Richter schon sagte, kann ein Edit-Eingabefeld auf nummerische
Eingabe begrenzt werden, denn Wertebereich, kannst Du über einen Dialog oder
Messagebox dem User mitteilen, wenn er diesen überschreitet.z.B
In diesem Feld sind nur Werte zwischen 1 und 200 zulässig, bitte korrektieren
sie den eingebenen Wert auf den entsprechenden Wertebereich.Turmfalke64
-
hallo,
nee also das edit fenster ist nicht beschreibbar (read only). Ich hab das mit den Nummern schon versucht, aber das geht wie du auch sagtest nur für die Eingabe. Ausgeben tut er trotzdem mehr.
Des Weiteren darf ich mich nicht nur auf Zahlen beschränken. Super wäre wenn man einzelne Buchstaben und Zeichen zulassen könnte, bei der Ausgabe.
Ich dachte mir da irgendwie den Inhalt des Array´s vor der Übergabe an m_strEEPROM zu überprüfen und dort zu filtern.
Noch weitere Ideen?
Vielen Dank
-
Vielleicht in PreTranslateMessage() die WM_KEYDOWN Nachrichten des Controls abfangen und "falsche" Zeichen ignorieren. Ggfs. reicht evtl. auch das überschreiben von OnChar(). Ob es das "richtige" Fenster ist, kannst Du mit GetFocus()->GetDlgCtrlID() == IDC_BLABLA feststellen. Alle Angaben aber einfach so aus dem Gedächtnis ohne Garantie auf Korrektheit.
-
McFanatic schrieb:
Nun kommt es leider zum Rauschen auf der Leitung oder ähnlichen, jedenfalls kommen mehr Daten an, als ich eigentlich haben will. Ich würde daher gernen einen Filter einbauen, der nur folgende Zeichen zulässt: (F, -, , 1, 2, 3, 4, 5, 6, 7, 8, 9, 0). Der erste Versuch mit einer einfachen if-Schleife schlug leider fehl. Könnt ihr mit Tipps geben, wie ich das am besten anstelle?
Du solltest mal deine Schnittstellenleitung überprüfen. Einfach Daten durchlassen die vermeindlich eine Zahl sein könnten ist der falsche Ansatz. Was ist wenn die Störpegel so groß sind das du durchs was auch immer am Eingang meinst eine Zahl zu erkennen, die dort gar nicht hingesendet wurde?
Du verwendest sicher die Klasse CSerial von www.codeproject.com
Warum nimmst du nicht die MFC-Variante (CSerialMFC)? Da kannst du gleich in dem char-Array der Klasse aussieben (wenn du das wirklich so machen willst).
-
Hallo und danke für die Hinweise
Es stimmt, ich benutze die Klasse CSerial, weiss jetzt aber auch nicht mehr warum ich damals nicht die MFC Variante genommen habe. Wenn diese besser ein soll, werd ich aber mal schaun ob ich die nicht schnell tauschen kann.
Bei den Störpegeln hast du sicherlich auch recht, aber ich übertrage so immernoch mehr daten als eigentlich nötig und das ist an sich nicht verkehrt, da nichts verloren geht. Ich sehe aber in den unzähligen Versuchen, das die Störsignale eigentlich meist Zeichen und Symbole sind, die ich nichtmal auf meiner Tastatur habe
. Ich dachte mir das die Chance das eine Zahl zu viel übertragen und angenommen wird da sehr gering ist.Fakt ist, ich brauchen einen Filter. Kann ich denn mit meiner Klasse nicht auch das Array vorher auf Inhalt überprüfen und nur gewünschtes Material durchlassen? Was genau ist es da an der MFC CSerial anders?
@jencas: ich bin nicht so fit was vc++ angeht, aber bist du dir sicher das wir von der gleichen Sache reden? WM_KEYDOWN klingt irgendwie nach Tastatureingabe und das mache ich nicht. Ich empfange Daten über die serielle Schnittstelle und stell sie in einem read-only edit fenster dar.
danke und gruss
-
LRESULT CDeinView::OnSerialMsg(WPARAM wParam, LPARAM lParam) { const CSerialMFC::EEvent eEvent = CSerialMFC::EEvent(LOWORD(wParam)); const CSerialMFC::EError eError = CSerialMFC::EError(HIWORD(wParam)); if (eError) AfxMessageBox("Es ist ein interner Fehler aufgetreten!",MB_OK); //weitere Fehlerbehandlung siehe Doku if (eEvent & CSerial::EEventRecv) { DWORD dwBytesRead = 0; BYTE abBuffer[100]; do { // Read data from the COM-port m_serial.Read(abBuffer,sizeof(abBuffer),&dwBytesRead); abBuffer[dwBytesRead] = '\0'; } while (dwBytesRead == sizeof(abBuffer)); //ab hier steht dir abBuffer zur freien Verfügung // hier kannst du weiter Manupulationen durchführen } return 0; }Du musst nur aufpassen: es kommt nach jeder Übertragung glaub ich noch ein <CR> <LF>, was als neue Message OnSerialMsg angesehen wird. In diesem Fall ist abBuffer leer. Ich hab das abgefangen indem ich abBuffer in einen CString kopiere und diesen zur weiteren Verwendung freigebe, wenn dessen Länge >0 ist.
Was deine Störpegel angeht: nach der Signaltheorie ist die Störquellenvermeidung immer besser wie eine Filterung. Solltest du mal deine Software validieren müssen (damit schlag ich mich grad rum) geht so was nicht so leicht durch.