Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dynamischen String exakt nach ShortString kopieren (https://www.delphipraxis.net/154880-dynamischen-string-exakt-nach-shortstring-kopieren.html)

Dr.MAD 29. Sep 2010 11:07

Dynamischen String exakt nach ShortString kopieren
 
Hallo,

Diese Prozedur leert vohrer den ShortString bevor dieser mit einem dyn. String gefüllt wird.

Delphi-Quellcode:
procedure CopyStringExactly(const Source: String; var Dest: ShortString);
var X,
    DestLen: Integer;
begin
  // Gesamtgröße des Statischen Strings erfassen
  DestLen:=SizeOf(Dest)-1;
  // Dest-String von Anfang bis Ende leeren
  for X:=0 to DestLen do Dest[X]:=#0;
  // String kopieren
  if DestLen<Length(Source) then Dest:=Copy(Source,1,DestLen) else Dest:=Source;
end;
Benötigt wird dies z.B., wenn Records (mit ShortStrings) mittels CompareMem verglichen werden.

Kopiert man mittels ShortString:=String können Datenfraqmente in ShortString entstehen, wenn der vorhergehende Wert in ShortString länger war als der neue Wert.

Wenn es schnellere Lösungen gibt, bitte ich um Antwort. Mit ist nichts Besseres eingefallen.:oops:

Gruß MAD

mkinzler 29. Sep 2010 11:33

AW: Dynamischen String exakt nach ShortString kopieren
 
Setze
Delphi-Quellcode:
ShortString:= String +#0;

jfheins 29. Sep 2010 11:46

AW: Dynamischen String exakt nach ShortString kopieren
 
Zitat:

Zitat von mkinzler (Beitrag 1052759)
Setze
Delphi-Quellcode:
ShortString:= String +#0;

Dürfte nicht helfen. Allerdings liegt mmn der fehler beim vergleichen, daher ist auch der name der funktion irreführend.

Schreibe eine methode die 2 records auf gleichheit überprüft. Dann kannst du auch nicht bei einer zuweisung vergessen, die spezialkopierfunktion aufzurufen ;-)

Luckie 29. Sep 2010 11:58

AW: Dynamischen String exakt nach ShortString kopieren
 
Zitat:

Zitat von Dr.MAD (Beitrag 1052749)
Wenn es schnellere Lösungen gibt, bitte ich um Antwort. Mit ist nichts Besseres eingefallen.:oops:

ZeroMemory?

DeddyH 29. Sep 2010 12:34

AW: Dynamischen String exakt nach ShortString kopieren
 
FillChar? Allerdings habe ich mir die Implementation jetzt nicht angeschaut, möglicherweise wird dort auch eine Schleife oder ZeroMemory benutzt.

himitsu 29. Sep 2010 12:48

AW: Dynamischen String exakt nach ShortString kopieren
 
ZeroMemory nutzt FillChar
Und dieses FillChar ist etwas optimiert und seit 'ner Weile noch mehr optimiert (seitdem das FastCode-Projekt in Delphi integriert wurde)

Luckie 29. Sep 2010 12:53

AW: Dynamischen String exakt nach ShortString kopieren
 
Ist es nicht eher umgekehrt? ZeroMemory ist eine Windows API-Funktion und FillChar eine Delphi-Funktion.

himitsu 29. Sep 2010 13:07

AW: Dynamischen String exakt nach ShortString kopieren
 
ZeroMemory ist ein C-Makro (mit einer Löschschleife)

FillChar ist die "native" Prozedur, um einen Speicherbereich mit Irgendwas ('nem Byte) zu füllen.

ZeroMemory => FillChar + 0

Luckie 29. Sep 2010 13:09

AW: Dynamischen String exakt nach ShortString kopieren
 
OK, überredet. ;)

himitsu 29. Sep 2010 13:11

AW: Dynamischen String exakt nach ShortString kopieren
 
keine Sorge ... dachte auch mal MSDN-Library durchsuchenZeroMemory wäre eine Funktion/API ... und dann suchte ich verzweifelt nach der MSDN-Library durchsuchenSecureZeroMemory-API, welche es nicht gibt :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 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