Problem mit TEdit->Text[i] (Beendet)
-
Hallo
wie schon gesagt habe ich ein problem mit einem ausdruck(Edit4->Text[i]) in meine methode. hier ist der quell code wenn mir jemand sagen könnte was ich falsch mache währe ich wirklich dankbar.
hier ist der code:void __fastcall TForm1::Edit4Change(TObject *Sender) { MakeItZero(Edit4); if(Edit4->Tag==0) { double l=(double)Edit4->Text.Length(),Ergebnis=0; for(int i=0;l>=0;l--) { Ergebnis = Ergebnis + ((double)StrToInt(Edit4->Text[i]) * pow\ (8.0,(double)(l-1))); i++; } SetTags(Edit1,Edit2,Edit3,1); Edit1->Text=IntToStr((int)Ergebnis); ConvertAndPrint(Edit1,Edit2,2); ConvertAndPrint(Edit1,Edit3,16); SetTags(Edit1,Edit2,Edit3,0); } }
der code kann ohne probleme comiliert werden. doch sobald ich versuche einen wert zu ändern tritt eine exception der Klasse EAccessViolation auf und zwar and folgender stelle:
char& __fastcall operator [](const int idx) { HIER_> ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ?? Unique(); // Ensure we're not ref-counted return Data[idx-1]; }
[ Dieser Beitrag wurde am 24.06.2003 um 22:36 Uhr von Klopfer editiert. ]
-
Du, ich glaub da kann dir kaum jemand weiterhelfen, denn du machst keinen Fehler, jedenfalls kann ich da keinen entdecken, aber ich hatte auch immer das selbe, er kommt nicht damit zurecht, dass du auf ein Zeichen vom String zugreifst, also Str[i]='l'; <-Beispiel. Darum würde ich dir den Tipop geben, arbeite mit SubString(i,1); <-Bewirkt das selbe, naja, du kasst da nicht direkt festlegen, aber wenn du das so machst:
String Temp;
...
Temp=Edit1->Text.SubString(0,i)+"l"+Edit1->Text.SubString(i+2,Edit1->Length()-i+1);Wenn du z.B. ein Zeichen vom Edit ändern willst. Ansonsten, wenn du nur dieses eine Zeichen anzeigen lassen willst, damm mach das so:
Label1->Caption=Edit1->Text.SubString(i,1);
Natürlich kann es sein, dass hier jemand ne bessere Lösung für dieses Problem findet, aber ich mach das immer so.
-
Hi,
gehts vielleicht mit
for(int i=0;l>0;l--)
-
Der Index bei AnsiString beginnt bei "1"
for(int i=0;l>=0;l--)
müsste also lauten:
for(int i=1;l>=0;l--)Gruß Mikel
[ Dieser Beitrag wurde am 24.06.2003 um 22:22 Uhr von Mikel editiert. ]
-
Sorry, hab mich verguckt, sollte dann wohl auch nicht gehen ...
-
Original erstellt von Spieleprogrammierer:
[...]denn du machst keinen FehlerFalsch... er versucht auf ein Zeichen zuzugreifen, das an einer Stelle, die nicht innerhalb der Stringlänge liegt... (z.B. der String ist 5 Zeichen lang und du versuchts auf das 6. zuzugreifen) Sprich Out Of Range...
-junix
-
Nein, nicht 6., hier meinte einer der Index bei AnsiString würde bei 1 beginnen, stimmt das? - Dann greift man auf das 0. Zeichen zu, d.h. bevor der String beginnt *g*
Wenn nicht (ich weiß es nicht), dann müsste die Schleife heißen for(i=0;i<Str.Length();i++) //Geht die Schleife nur durch, wenn i kleiner ist als die Länge vom String, d.h. im Index greift er auf das letzte Element zu, nicht mehr danach,denn dann ist i gleich Stringlänge.
Oder liege ich da falsch?
-
Hey leute danke für die schnelle hilfe. bis zum nächsten mal.
-
Da liegst du richtig, allerdings ist die Schleife etwas anderst formuliert
for(int i=0;l>=0;l--)
müsste dann also heissen:
for(int i=1;l>0;l--)Gruß
MikelPS:
Bei AnsiString beginnt der Index tatsächlich bei 1. Liegt wohl darin begründet das ein Pascal-String nachgebildet wird und der beginnt eben bei 1