Builder har en datatyp som heter AnsiString som används i alla komponenter där strängar hanteras. Sök i hjälpen efter denna datatyp.
// BeatBox
------------------
"Mörkrets gärningar, förekommer även på dagen"
Sixten Landby
7 svar · 391 visningar · startad av PatrikH
Sitter och skriver ett windowsprogram i Borland c++ Builder 5.
I en del av programmet så vill jag att texten i en "Memo-ruta" skall sökas igenom efter bokstaven 'A'. Om denna hittas så skall bokstaven 'b' placeras precis under denna (på raden under alltså). Har testat lite med String, men jag vet inte riktigt hur jag skall göra. Är ganska ny på windowsprogramering. Tacksam för svar!!
Builder har en datatyp som heter AnsiString som används i alla komponenter där strängar hanteras. Sök i hjälpen efter denna datatyp.
// BeatBox
------------------
"Mörkrets gärningar, förekommer även på dagen"
Sixten Landby
Tack för det! Har dock fått ytterligare ett problem. När jag kör följande programsnutt så får jag ett felmeddelande, varför kan man inte göra så här och hur gör man?? (Är relativt ny på det här med AnsiString)
AnsiString kr, kt;
kr = Memo1->Text;
for(int i=1; i<Memo1->Text.Length()+1; i++)
{
if(kr == 'A')
kt = 'b';
else
kt = ' ';
}
Då kr = 'A' så kastas jag ut ur programmet och raden:
ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ??
markeras i filen "dstring.h" under "char& __fastcall operator [](const int idx)"
Jag fattar ingenting av det här, mycket tacksam för svar!!
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
for(int i=1; i<Memo1->Text.Length()+1; i++)
Index börjar på 0 antar jag. Men det är inte det som är felet iofs. Felet är att du loopar "för länge"... Text.Length()+1 returnerar textens längd + 1.
Dvs. har du texten: "gurka" så är den texten 5 tecken lång. Första tecknet(g) ligger på index 0 och sista på 4. Text.Length()+1 på "gurka" skulle bli 6.
Och loopen ska loopa så länge som i är mindre än 6. Dvs. till 5. 5 är utanför index och därmed försöker du skriva "utanför" allokerat minne.
Typ. :e
------------------
- Erik Hellström -
- Datalogiprogrammet - MDH -
- http://3d.burken.nu -
Tack för svaret, men det konstiga med AnsiString är att index verkar börja på ett. Ändrade i for-satsen (som du skrev), men utan någon skillnad, har nu ändrat till "i<=Memo1->Text.Length()" vilket är samma sak som förrut, men kanske lite bättre kod bara.
Verkar som det är något annat som är fel...
Genom att:
ThrowIfOutOfRange(idx);
Har det ju som PhOrPhEr påtalade med index att göra.
En liten vild gissning kan ju vara att det inte är strängen kr det handlar om utan kt. Dvs att om du liksom med kr måste initiera även kt innan. Helt enkelt peta in lika många tecken i kt som du gjort med kr. Vilka tecken spelar ju ingen roll eftersom du ändå byter dem i loopen...
Typ:<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
kr = Memo1->Text;
kt = Memo1->Text;
------------------
Ancilla, face mea laganum!
[Redigerat av PeW den 06 jan 2002]
Man tackar, man tackar. Nu fungerar det perfekt!!
------------------
Ancilla, face mea laganum!