AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String / AnsiString Mischbetrieb

Ein Thema von greenmile · begonnen am 8. Jan 2013 · letzter Beitrag vom 9. Jan 2013
Antwort Antwort
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#1

String / AnsiString Mischbetrieb

  Alt 8. Jan 2013, 20:23
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: String / AnsiString Mischbetrieb

  Alt 8. Jan 2013, 22:41
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 9. Jan 2013 um 14:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: String / AnsiString Mischbetrieb

  Alt 8. Jan 2013, 23:02
Wenn Du unter D2009 arbeitest (D7,2005,2006...)
sollte es keine Probleme geben.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: String / AnsiString Mischbetrieb

  Alt 8. Jan 2013, 23:09
Wenn Du unter D2009 arbeitest (D7,2005,2006...)
sollte es keine Probleme geben.

Gruß
K-H
Laut Profil hat er XE3
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: String / AnsiString Mischbetrieb

  Alt 9. Jan 2013, 10:37
hab ich halt nicht nachgesehen.

gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#6

AW: String / AnsiString Mischbetrieb

  Alt 9. Jan 2013, 12:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: String / AnsiString Mischbetrieb

  Alt 9. Jan 2013, 13:14
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#8

AW: String / AnsiString Mischbetrieb

  Alt 9. Jan 2013, 13:25
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?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: String / AnsiString Mischbetrieb

  Alt 9. Jan 2013, 16:29
Gute Frage, probier's aus. Wenn ich allerdings das bisher gelesene bedenke sollte es gehen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#10

AW: String / AnsiString Mischbetrieb

  Alt 9. Jan 2013, 16:41
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz