Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   String / AnsiString Mischbetrieb (https://www.delphipraxis.net/172522-string-ansistring-mischbetrieb.html)

greenmile 8. Jan 2013 19:23

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?

Sir Rufo 8. Jan 2013 21:41

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:
// Arbeitet ganz toll mit Delphi < D2009
procedure WriteStringToStream( const AStr : string; AStream : TStream );
begin
  AStream.Write( AStr[1], Length( AStr ) );
end;
Hierfür gibt es jetzt 2 Möglichkeiten das umzuschreiben
  1. Deklaration anpassen
    Delphi-Quellcode:
    procedure WriteStringToStream( const AStr : AnsiString; AStream : TStream );
    begin
      AStream.Write( AStr[1], Length( AStr ) );
    end;
  2. Source anpassen
    Delphi-Quellcode:
    procedure WriteStringToStream( const AStr : string; AStream : TStream );
    begin
      AStream.Write( AStr[1], Length( AStr ) * SizeOf( Char ) );
    end;

p80286 8. Jan 2013 22:02

AW: String / AnsiString Mischbetrieb
 
Wenn Du unter D2009 arbeitest (D7,2005,2006...)
sollte es keine Probleme geben.

Gruß
K-H

Sir Rufo 8. Jan 2013 22:09

AW: String / AnsiString Mischbetrieb
 
Zitat:

Zitat von p80286 (Beitrag 1198327)
Wenn Du unter D2009 arbeitest (D7,2005,2006...)
sollte es keine Probleme geben.

Gruß
K-H

Laut Profil hat er XE3 ;)

p80286 9. Jan 2013 09:37

AW: String / AnsiString Mischbetrieb
 
hab ich halt nicht nachgesehen.

gruß
K-H

musicman56 9. Jan 2013 11:20

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:
procedure WriteStringToStream( const AStr : string; AStream : TStream );
begin
  AStream.Write(PChar(Astr)^, Length(AStr));
end;
...was meiner bescheidenen Meinung nach die richtige Implementation wäre, weil

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:
procedure WriteStringToStream( const AStr : AnsiString; AStream : TStream );
begin
  AStream.Write(PAnsiChar(Astr)^, Length(AStr));
end;
Dann ist es egal was ich in AStr übergebe. Bitte korrigiert mich wenn ich falsch liege...so genau kenn ich mich auch nicht aus. :?

p80286 9. Jan 2013 12:14

AW: String / AnsiString Mischbetrieb
 
Zitat:

Zitat von musicman56 (Beitrag 1198373)
Ist es nicht generell so, dass eine Prozedur/Funktion mit string als Parameter auch mit AnsiString klar kommt?

Äh nee?
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

musicman56 9. Jan 2013 12:25

AW: String / AnsiString Mischbetrieb
 
Sorry K-H, das hab ich ja prinzipiell genauso gemeint wie du schreibst. Etwa sowas wie...

Delphi-Quellcode:
function LeftPad(S : string; L : Byte) : string;
begin
  Result := S;
  while length(Result) < L do Result := ' ' + Result;
end;
... dürfte mit String und AnsiString klar kommen, oder?

p80286 9. Jan 2013 15:29

AW: String / AnsiString Mischbetrieb
 
Gute Frage, probier's aus. Wenn ich allerdings das bisher gelesene bedenke sollte es gehen.

Gruß
K-H

DeddyH 9. Jan 2013 15:41

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