Nullterminierten String in AnsiString wandeln
-
Ich habe eine TMemo Komponente, die ich mit Text füllen möchte. Die AnsiString Methoden sind mir dabei zu langsam. Deswegen habe ich ein dynamisches char-Feld erzeugt, das in einem Algorithmus anstelle des Textstrings von TMemo gefüllt wird.
Am Schluss möchte ich diesen nullterminierten String TMemo->Text zuweisen. Jedoch geht dabei irgendetwas schief. Kann mir jemand mit einer passenden Methode helfen?
-
Hallo
Jedoch geht dabei irgendetwas schief
Bitte sag uns WAS schiefgeht, dann koennen wir dir sicher helfen
Schoen waere es auch wenn du uns ein bischen Code zeigst.Am Schluss möchte ich diesen nullterminierten String TMemo->Text zuweisen
Mfg
Klaus
-
Hallo
Was KlausB damit sagen will : wenn du einen korrekten Null-terminierten C-String hast, dann brauchst du keine extra passende Methode. Zuweisen reicht völlig aus :
char* c_string = ...;
Memo1->Lines->Text = c_string;Wenn bei dir etwas nicht klappt, liegt das nicht an Memo, sondern an den Daten in deinem C-String. Ohne genauere Einblicke können wir dazu aber nichts weiter sagen.
bis bald
akari
-
Hier ist die auf das wesentliche gekürzte Methode:
void __fastcall TfrmMain::btnErzeugenClick(TObject *Sender) { if(lbledtLaenge->Text.IsEmpty()) //wenn das Textfeld leer ist, wird nur ein Hinweis ausgegeben ShowMessage("Länge des Passworts wurde nicht angegeben."); else if(lbledtLaenge->Text.ToInt()<=4000) //das Passwort darf nicht länger als 4000 Zeichen lang sein { int pl=lbledtLaenge->Text.ToInt(); //Textlänge wird in einer Int-Variable gespeichert, dass nicht jedesmal die Zeichenlängenmethode aufgerufen werden muss char* text; text=new(std::nothrow)char[pl+1]; if(text==NULL) //falls kein Speicherplatz frei ist, wird die Methode mit einer Nachricht beendet ShowMessage("Der Computer verfügt momentan nicht über genügend freien Arbeitsspeicher ("+String(sizeof(text))+"Byte)"); else { srand(time(NULL)); char x, checker=0; for (int i=0; i<pl; i++) { x=(rand()%26)+65; if (checker<1) { text[i]=x; x=(rand()%2)+1; checker+=x; } else { x=rand()%5; switch (x) { case 0: { text[i]='A'; break; } case 1: { text[i]='E'; break; } case 2: { text[i]='I'; break; } case 3: { text[i]='O'; break; } case 4: { text[i]='U'; break; } } checker=0; } } } text[pl]='\0'; //nullterminierter String bekommt seine binäre Null memPasswort->Text=text; //nullt. String wird dem AnsiString zugewiesen (funktioniert nicht) delete []text; //dynamisch angefordertes Array wird gelöscht } else if(lbledtLaenge->Text.ToInt()>4000) ShowMessage("Bitte wählen Sie eine Länge von 1 bis maximal 4000 Zeichen. Andernfalls wird der Prozess zu lange andauern."); }
-
Also ich habs bei mir mal laufen lassen und es funktioniert..
Allerdings musst du für ein Memo wohl Memo->Lines->Add(text); verwenden und nicht ->Text
Achja, bei mir konnte ich auch
text[pl]='\0'; //nullterminierter String bekommt seine binäre Null
weglassen..
void __fastcall TForm1::Button1Click(TObject *Sender) { if(lbledtLaenge->Text.IsEmpty()) { ShowMessage("Länge des Passworts wurde nicht angegeben."); } else if(lbledtLaenge->Text.ToInt()<=4000) { int pl=lbledtLaenge->Text.ToInt(); char* text; text=new(std::nothrow)char[pl]; if(text==NULL) { ShowMessage("Der Computer verfügt momentan nicht über genügend freien Arbeitsspeicher ("+String(sizeof(text))+"Byte)"); } else { srand(time(NULL)); char x, checker=0; for (int i=0; i<pl; i++) { x=(rand()%26)+65; if (checker<1) { text[i]=x; x=(rand()%2)+1; checker+=x; } else { x=rand()%5; switch (x) { case 0: text[i]='A'; break; case 1: text[i]='E'; break; case 2: text[i]='I'; break; case 3: text[i]='O'; break; case 4: text[i]='U'; break; } checker=0; } } } memPasswort->Text=text; // TEDIT Memo1->Lines->Add(text); // TMEMO delete []text; } else { ShowMessage("Bitte wählen Sie eine Länge von 1 bis maximal 4000 Zeichen. Andernfalls wird der Prozess zu lange andauern."); } }
-
Allerdings musst du für ein Memo wohl Memo->Lines->Add(text); verwenden und nicht ->Text
Mhm. Wenn ich den ganzen Text bearbeiten möchte und nicht die einzelnen Strings, geht's auch mit Text.
-
else if(lbledtLaenge->Text.[b]ToInt()[/b]<=4000)
Length() liefert die Länge vom String zurück, ToInt() wandelt den Inhalt von Edit in eine Zahl um...
-
Daran liegt's nicht. Der Benutzer gibt eine Zahl in lbledt->Text ein.
-
Naja ich verstehe eh nicht woran es liegen soll oder was überhaupt liegt.
Es compiliert bei mir, wie schon erwähnt, ohne Probleme.
Kriegst du irgendeinen Fehler?!
-
Ich bekommen keinen Fehler. Das Kompilieren ist nicht das Problem. Ich bekomme merkwürdige Zeichen ausgegeben anstelle einer zufällig generierten Zeichenkombination.
EDIT: Jetzt funktioniert's. Die Sache lag an einem blöden Verlinkungsfehler. Komischerweise wurde eine Unit.cpp von einer alten Version des unoptimierten Programms benutzt...