![]() |
String / AnsiString Mischbetrieb
Hallo,
bekomme ich eigentlich ernsthafte Probleme, wenn ich String und AnsiString mische? Ich habe einige Units, die noch mit dem Funktionsparametern STRING arbeiten. Gibt das Probleme, wenn ich mische, z.B. weil einer im Speicherbereich des anderen rumpfuscht? Will nur auf Nummer sicher gehen, seit LOWERCASE vertraue ich der Nummer nicht ganz so sehr. Oder kann ich das irgendwo (in den Projektoptionen?) einstellen? |
AW: String / AnsiString Mischbetrieb
Du bekommst Probleme, wenn die Funktion als Parameter einen String entgegennimmt, aber in Wirklichkeit nur für die Verarbeitung eines AnsiString ausgelegt ist.
Beispiel - String in einen Stream schreiben
Delphi-Quellcode:
Hierfür gibt es jetzt 2 Möglichkeiten das umzuschreiben
// Arbeitet ganz toll mit Delphi < D2009
procedure WriteStringToStream( const AStr : string; AStream : TStream ); begin AStream.Write( AStr[1], Length( AStr ) ); end;
|
AW: String / AnsiString Mischbetrieb
Wenn Du unter D2009 arbeitest (D7,2005,2006...)
sollte es keine Probleme geben. Gruß K-H |
AW: String / AnsiString Mischbetrieb
Zitat:
|
AW: String / AnsiString Mischbetrieb
hab ich halt nicht nachgesehen.
gruß K-H |
AW: String / AnsiString Mischbetrieb
Hallo,
ich hab meine Projekte im Zuge der Umstellung von 2007 auf XE2 auch noch nicht vollständig angepasst, und bin natürlich schon mehrfach über dieses Problem / diese Frage gestolpert. Ist es nicht generell so, dass eine Prozedur/Funktion mit string als Parameter auch mit AnsiString klar kommt? Beispiel:
Delphi-Quellcode:
...was meiner bescheidenen Meinung nach die richtige Implementation wäre, weil
procedure WriteStringToStream( const AStr : string; AStream : TStream );
begin AStream.Write(PChar(Astr)^, Length(AStr)); end; AStream.Write( AStr[0] .... sowieso nicht mehr geht. (Zugriff auf Element 0 nicht möglich oder so ähnlich) Außerdem hab ich in solchen ähnlichen Fällen bisher die Proceduren mit overload 2x deklariert...beispielsweise also
Delphi-Quellcode:
Dann ist es egal was ich in AStr übergebe. Bitte korrigiert mich wenn ich falsch liege...so genau kenn ich mich auch nicht aus. :?
procedure WriteStringToStream( const AStr : AnsiString; AStream : TStream );
begin AStream.Write(PAnsiChar(Astr)^, Length(AStr)); end; |
AW: String / AnsiString Mischbetrieb
Zitat:
leider hab ich noch keine (bewußt) praktischen Erfahrungen. Aber immer dann wenn Du Dich auf Byte-Ebene begibst, wird es heiß. (Sizeof,length,Char/Byte etc.) Solange Du Dich auf Textinhalte beschränkst 'Wer Text in C bearbeitet ist selber schuld' sollte keine Probleme bekommen. Die Typprüfung schlägt je nach vorgabe brutalst zu! Gruß K-H |
AW: String / AnsiString Mischbetrieb
Sorry K-H, das hab ich ja prinzipiell genauso gemeint wie du schreibst. Etwa sowas wie...
Delphi-Quellcode:
... dürfte mit String und AnsiString klar kommen, oder?
function LeftPad(S : string; L : Byte) : string;
begin Result := S; while length(Result) < L do Result := ' ' + Result; end; |
AW: String / AnsiString Mischbetrieb
Gute Frage, probier's aus. Wenn ich allerdings das bisher gelesene bedenke sollte es gehen.
Gruß K-H |
AW: String / AnsiString Mischbetrieb
Nach meiner persönlichen Erfahrung wird es nur an 2 Stellen wirklich kritisch:
- In Verbindung mit Größenangaben in Byte - Aufruf von API-Routinen, die sich je nach Ansi- oder Unicode-Variante unterschiedlich verhalten (CreateProcess z.B.) Ansonsten habe ich bislang keinen großen Unterschied bemerken können. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz