c_str() kaputt.
-
char* pw = MimiEdit->Text.c_str(); char* value = Edit1->Text.c_str(); MessageBoxA(Handle, pw, "", 0); MessageBoxA(Handle, value, "", 0);Es stehen auf jeden Fall unterschiedliche Werte in den beiden Feldern, trotzdem wird beide Male das Angezeigt was in Edit1 steht. Wenn ich jetzt allen Text aus Edit1 lösche funktionierts...
-
Hi,
du hast auch 4 Parameter in MessageBoxA übergeben?!
Application->MessageBoxA("titel", "value", 0);mfg, Micha
-
RandomAccess85 schrieb:
du hast auch 4 Parameter in MessageBoxA übergeben?!
Das ist auch völlig richtig so. Vielleicht ist dir aufgefallen, daß er nicht "Application->" davorgeschrieben hat, und daß er sich über seltsames Laufzeitverhalten beklagt, was voraussetzt, daß der Compiler seinen Code ohne Syntaxfehler übersetzt hat

Zum Thema:
Das Verhalten hängt damit zusammen, wie das Property TControl::Text den Fenstertext ermittelt. Dem VCL-Quelltext zufolge geschieht das folgendermaßen:function TControl.GetTextBuf(Buffer: PChar; BufSize: Integer): Integer; begin Result := Perform(WM_GETTEXT, BufSize, Longint(Buffer)); end; ... function TControl.GetTextLen: Integer; begin Result := Perform(WM_GETTEXTLENGTH, 0, 0); end; ... function TControl.GetText: TCaption; var Len: Integer; begin Len := GetTextLen; SetString(Result, PChar(nil), Len); if Len <> 0 then GetTextBuf(Pointer(Result), Len + 1); end;Mit anderen Worten: GetText, was gemäß der Property-Definition beim Lesezugriff auf das Property aufgerufen wird, gibt keine Referenz auf eine Membervariable zurück, sondern fordert den Text mittels WM_GETTEXT vom Fenster an und speichert ihn in dem temporären Stringobjekt, das zurückgegeben wird.
In der C++Builder-Dokumentation zur Klasse AnsiString (was dem nativen Delphi-Typen AnsiString entspricht) steht aber:
C++Builder 2006-Dokumentation schrieb:
c_str gibt einen Zeiger auf ein nullterminiertes Zeichen-Array zurück, das die gleichen Zeichen wie der AnsiString enthält. Wenn dem AnsiString kein Wert zugewiesen wurde, gibt c_str einen leeren String ("") zurück.
In der Regel zeigt der von c_str zurückgegebene Wert auf das interne Zeichen-Array, auf das die Eigenschaft data verweist. Dieser Zeiger ist solange gültig, bis der String geändert wird (beispielsweise durch einen Aufruf der Methode SetLength oder wenn der AnsiString ungültig wird).Da der zurückgegebene String ein temporäres Stackobjekt ist, ist er schon nach dem Ablauf dieser Zeile
char* pw = MimiEdit->Text.c_str();nicht mehr existent, und der char-Zeiger zeigt ins Nirvana. Da du dazwischen keine anderen Operationen ausführst, landen die beiden Strings zufälligerweise auf demselben Stack-Speicher - wodurch beide Zeiger auf denselben String zeigen (was du im Debugger durch den Vergleich der referenzierten Adressen sehr einfach verifizieren kannst).
Abhilfe schaffen kann man, indem man einfach lokale AnsiString-Objekte erstellt:
AnsiString pw = MimiEdit->Text; AnsiString value = Edit1->Text; MessageBoxA (Handle, pw.c_str (), "", 0); MessageBoxA (Handle, value.c_str (), "", 0);Und keine Sorge, es entsteht dadurch kein Performancenachteil, der nennenswert wäre - AnsiString verwendet Referenzzählung.
-
Danke,
habs jetzt so gelöst:
char* pw = new char[MimiEdit->Text.Length()]; strcpy(pw, MimiEdit->Text.c_str());
-
Warum einfach, wenns auch umständlich geht?

... und delete[] nicht vergessen!