Völlig simpler CString



  • Mid(von,bis), und dann? Er soll ja jedes Zeichen prüfen, und ich weiß vorher nicht genau wie groß der String ist!

    an EdiRitter:

    Was ist Boost::regex??
    Was kann ich dann damit besser machen?



  • Hallo,

    eine sinnvolle Erklärung habe ich leider nicht. Vielleicht kann's jemand besser erklären. Reguläre Ausdrücke sind sehr mächtig. Damit kann man z.B. Strings analysieren. Wir haben unter Linux mit (sed, grep) gearbeitet. Unter VC++ musst du zusätzlich boost::regex installieren.

    Hier noch ein Beitrag aus dem C++ Forum:
    http://www.c-plusplus.net/forum/viewtopic.php?t=61159&highlight=regex

    Wie sehen deine Strings genau aus? Poste mal ein paar..

    MfG



  • [edit] [/edit]



  • [edit] [/edit]



  • Mid(1) durchsucht erstes bis ( einschl. ) letztes zeichen. dann kannst dir die for schleife sparen

    if( mystring.Mid(1) == "0" ||.... ||"9"||"0")  // .... mathematisch ausgedruckt ;) also nicht so uebernehmen :)
    return FALSE;
    

    oder du benutzt boost::regex ( muesste auch gehen ) oder halt oldschool s.o.



  • Meine CStrings müssen vom Benutzer in ein Eingabefeld eingegeben werden. Wenn er dann auf Button "Datensatz hinzufügen" klickt( dazu muss ich sagen dass eine ODBC Datenbankanbindung besteht, in die ich wunderbar lesen und schreiben kann ), ruft dieser dann DieseJeneWelche Funktion auf, die nur überprüfen soll ob sich Zahlen oder Buchstaben im Eingabefeld befinden.
    Oder anders gesagt: Es handelt sich um die Spalte Projektnummer. Da isses ja nicht sinnvoll irgendwelche Buchstaben einzutippen und in die Datenbank zu speichern.
    Darum soll vorher überprüft werden ob sich auch wirklich nur Ziffern oder Leerzeichen im String befinden.
    Natürlich ist es für den Benutzer später logisch nur Ziffern einzugeben aber es kann ja trotzdem mal passieren ( typ. Dummy-User-Probl) das ein Buchstabe dazwischenrutscht. Und das wiederum wäre sehr fatal weil es dann nicht ausgeschlossen ist das die ganze Datenbank abkackt. Deshalb meine Intuition: ZahlenCheck().

    Also um auf die Frage zu antworten, die Strings bestehen aus bis zu 5 Zeichen, hoffentlich alles Ziffern!!!

    Ach alles Mist.
    Da war ja die Kontrolle der Projektnummer einfacher also das keine doppelten Werte in die Datenbank kommen, das funzt super.



  • Das mit dem .Mid klingt ziemlich sinnvoll. Habe vorhin damit rumgespielt, vergebens. Aber mir steht schon im Sinn was ich falsch hatte. Naja, ich glaub es ist Zeit Feierabend zu machen.

    Dank geht an NewKid, EdiRitter, Zugucker!! 👍

    Morgen mal weitersehn
    MfG
    RunSeb



  • also hier noch was

    FindOneOf liefert dir dann > -1 wenn er einen buchstaben findet

    musst halt ne for schleife machen und abfragen mit

    CString array[] // alle zahlen + leer reinfuellen
    for ( int i = 0; i < 11 && flag == FALSE; i++)
    
    if( mystring.FindOneOf( array[i]  ) > -1 )  // array[i] == "0" z.b. d.h. er schlaegt alarm dann musst noch ein stopflag machen das dann abbricht
    flag = TRUE;
    

    ich sehe du bracusht es ja umgekehrt also nur ziffern und leer darf vorkommen
    jetzt musst es halt andersrum machen. aber bitte nicht das array jetzt mit allen zeichen fuellen bis auf die 10. hmm checks ab geht auf jedenfall



  • also kruz nochmals nachgedacht

    1. 1ste schleife muss 5 mal durchlaufen ( da 5 werte lang die nr. )
    2. 2te schleife muss 10 mal durchlaufen ( da 10 gueltige zeichen )

    dann suchste nach denn 11 zeichen die vorkommen koennen

    in 2ter schleife
    sobald != array[i] ( also kommt -1 raus, weil wenn gueltiges zeichen muss ja groesser -1 rauskommen ) in der 2ten schleife, dann das flag setzen damit er sofort abbricht

    und dieses flag in beiden forschleifen mitabfragen. da du ja nur BADCASE 5*11 durchmachst ist dieser algor. nicht mal so schlecht ( ausser du arbeitest auf einem pocketpc mit 0.5 mhz oder so LOL SCHERZ )



  • bool Keywordverwaltung::checkisnummeric(CString checkstring)
    {
    	AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
    for( int i=0; i<=checkstring.GetLength()-1; i++)
    {
    
      TCHAR z = checkstring[i];
      if( isdigit(z))
      {
      }
      else
    	  return false;
    } 
    
    return true;
    
    }
    


  • tom du bist der dude!



  • Was ist ein dude ?



  • Guten Morchen

    Hey Dude....





  • Also vielen Dank an Tom. Erfüllt seinen Zweck funz gut!!
    ( Was es nicht alles gibt ) 😮 😃
    Folgendes:
    Zitat aus der MSDN zu AFX_MANAGE_STATE(AfxGetStaticModuleState());:

    "Call this macro to protect an exported function in a DLL. When this macro is invoked, pModuleState is the effective module state for the remainder of the immediate containing scope. Upon leaving the scope, the previous effective module state will be automatically restored."

    Wieso wird die Funktion geschützt, ich werd später das ganze als statische DLL versuchen in eine große Anwendung einzubauen. Habe dann hoffentlich keine Nachteile oder Funktionsstörungen zu befürchten!?
    Was macht das AFX_MANAGE_STATE(AfxGetStaticModuleState()); wirklich? 😕

    newkid schrieb:

    also kruz nochmals nachgedacht

    1. 1ste schleife muss 5 mal durchlaufen ( da 5 werte lang die nr. )
    2. 2te schleife muss 10 mal durchlaufen ( da 10 gueltige zeichen )

    dann suchste nach denn 11 zeichen die vorkommen koennen

    in 2ter schleife
    sobald != array[i] ( also kommt -1 raus, weil wenn gueltiges zeichen muss ja groesser -1 rauskommen ) in der 2ten schleife, dann das flag setzen damit er sofort abbricht

    und dieses flag in beiden forschleifen mitabfragen. da du ja nur BADCASE 5*11 durchmachst ist dieser algor. nicht mal so schlecht ( ausser du arbeitest auf einem pocketpc mit 0.5 mhz oder so LOL SCHERZ )

    🙄 😉

    Genau so oder nur geringfügig ähnlich hatte ich das vorher auch im Kopp. Werde mich im Laufe des Tages noch mal ran machen. Das muss gehn. PS: Is zwar keine PowerStation (... und auch kein PocketPC ) aber für die Arbeit reicht das Gerät wo ich hier vor sitz! 😃

    MfG
    RunSeb



  • Das musst du rausnehmen., Ich habe es nur aus meiner DLL kopiert.

    Mit dem Macro werden nur die aktuellen Resource auf die der DLL gesetzt und nach verlassen wieder zurück. z.B. der Filename.


Anmelden zum Antworten