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*.htmlIch 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 zugreifenBCB-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
-
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