IntToStr() Exeption mit Try Catch richtig abfangen



  • hi,

    wie kann ich eine Expetion die von IntToStr() ausgelößt wird, richtig abfangen.

    Ziel ist es, wenn im stringgrid eine zahl steht, soll dort das vorzeichen (wenns minus ist) entfernd werden.

    also

    Wenn Umwandlung von String nach Int keine Exeption auslößt
          String = Wuzrel aus (String*String)
    

    so wird das vorzeichen immer + und damit nicht angzeigt.

    Aber wie programmiere ich das?

    try
       {
          //Konvertieren von String nach Double
          double Zahl = StringGrid->Cells[ACol][ARow].ToDouble();
    
          Zahl = sqrt(Zahl*Zahl);
    
          StringGrid->Cells[ACol][ARow] = FloatToStr(Zahl);
       }
       catch (Exception &exception)
       {
          // StringGrid wird nich geändert.
       }
    

    Edit:

    Ich hab gerade das hier gefunden:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-96164-and-highlight-is-*catch*.html

    Ich wüsste nun gerne, wie ich das anständig programmiere? Meint er damit, dass ich die eingabe direkt prüfen soll? Oder die Zeichen?



  • Hallo

    Dein Code ist korrekt, warum probierst du den nicht einfach mal aus?

    Meint er damit, dass ich die eingabe direkt prüfen soll?

    Wer meint was?

    bis bald
    akari



  • Geht das vielleicht auch so

    if(StringGrid->Cells[ACol][ARow].c_str()[0] == '-')
    { StringGrid->Cells[ACol][ARow].c_str()[0] == ' '; //mit Leerzeichen ersetzen
      StringGrid->Cells[ACol][ARow].Trim(); //TrimLeft(); //Leerzeichen entfernen
    }
    


  • Hallo

    @ dlonra :
    Zum einen überprüfst du nicht, ob überhaupt etwas in der Zelle steht. Desweiteren wird auch nicht überprüft, ob nach dem Vorzeichen eine gültige Zahl steht.

    Wenn es wirklich nur um den absoluten Wert einer Zahl geht, dann sollte statt dem quadrieren und Wurzel ziehen besser abs verwendet werden. Aber an den try-catch kommt man nicht vorbei.

    Ab Builder 6 kann man stattdessen noch StrToFloatDef nehmen.

    bis bald
    akari



  • @akari
    Bei jedem AnsiString steht bei [0] garanitiert ein Zeichen auch wenn es nur \0 ist.
    Wenn er die Benutzereingabe abfangen will, glaub ich das er das Event
    OnSetEditText abfangen kann. (hab ich noch nicht propiert und zudem hab ich nur Bcb5)
    In diesem Event sollte er den Try-Catch einbauen um Müll-eingabe ab zu fangen.



  • Hallo

    Nein, AnsiString[0] ist nämlich ungültig. Die Zählung der Zeichen beginnt bei 1, wie es auch in der BCB-Hilfe steht.
    Desweiteren wird sowohl bei AnsiString::Length() als auch bei dem Array-Operator das abschließende '\0' nicht mitgezählt.

    bis bald
    akari



  • @akari
    Beispiel:
    AnsiString hallo; //ist ein AnsiString-Klasse
    hallo.c_str()[0]; //zeigt auf den eigentlichen String
    //das bedeutet soviel wie: string *hallo;
    hallo.c_str()[0]; //ist deshalb \0.

    Wenn das nicht so währe würde ein bestimmtes Programm nicht
    tadellos funktionieren



  • Hallo

    aus der Builder-Hilfe

    BCB-Hilfe zu AnsiString[] schrieb:

    Der Operator gibt das Zeichen zurück, das sich im String an der angegebenen Indexposition befindet.

    char& __fastcall operator [](const int idx);

    Beschreibung

    Es wird das Zeichen an der im Indexwert idx angegebenen Position im String zurückgegeben. Die Indexnumerierung beginnt mit 1. Bei dem String "Hallo" und einem Indexwert von 2 würde beispielsweise das Zeichen 'a' zurückgegeben.

    Soweit zum AnsiString-eigenen []-OP. Um Gegensatz dazu wird beim []-Op eines C-Strings wirklich bei 0 angefangen zu zählen.
    Allerdings darfst du auf den Rückgabewert von c_str() nicht schreibend zugreifen

    BCB-Hilfe zu c_str() schrieb:

    Die Methode c_str dient in erster Linie dazu, den Wert von AnsiString zu lesen. Wenn Sie den Wert des Strings ändern möchten, verwenden Sie den []-Operator oder AnsiString-Methoden, wie z.B. Insert und Delete.

    Damit ist bewiesen das dein Code undefiniertes Verhalten verursacht. Es kann gutgehen, muß aber nicht.

    So ich hoffe nun habe ich nichts mehr übersehen...

    bis bald
    akari


  • Mod

    Hallo

    wenn ich das richtig verstehe willst du nur das "-" los werden oder ?

    StringReplace sollte das doch machen

    kein try/catch und auch keine anderen Umwandlungen

    Mfg
    Klaus


Anmelden zum Antworten