Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   #0 durch "nichts" ersetzen (https://www.delphipraxis.net/153737-0-durch-nichts-ersetzen.html)

Helmi 14. Aug 2010 09:32

#0 durch "nichts" ersetzen
 
Hallo,

ich habe folgenden Code:

Delphi-Quellcode:
  //FileStream und StringStream erzeugen
  FileStream   := TFileStream.Create(Datei, fmOpenRead);
  StringStream := TStringStream.Create(S);

  try
    //FileStream in StringStream kopieren
    FileStream.Position := 0;
    StringStream.CopyFrom(FileStream, FileStream.Size);

    //String aus StringStream auslesen
    S := StringStream.DataString;

    //#0 durch #32 ersetzen
    for i := 1 to length(S) do
      begin
        If S[i] = #0 then
          S[i] := #32;
      end;

    //Text in StringList laden
    SL_NCUpgrade.Text := S;
Dort ersetz ich #0 durch #32 (Leerzeichen)
Wie kann ich aber das #0 durch nichs ersetzen? - also komplett löschen?
Muss ich da wirklich mittels delete arbeiten?

mkinzler 14. Aug 2010 09:38

AW: #0 durch "nichts" ersetzen
 
Oder StringReplace()

Win32.API 14. Aug 2010 09:42

AW: #0 durch "nichts" ersetzen
 
Nicht getestet:
Delphi-Quellcode:
  i := 0;
  SetLength(sTmp, Length(s));
  for c in s do
  begin
    if (c <> #0) then
    begin
      s[i] := c;
      inc(i);
    end;
  end;
  SetLength(sTmp, pred(i));

himitsu 14. Aug 2010 09:47

AW: #0 durch "nichts" ersetzen
 
Delphi-Referenz durchsuchenDelete

Win32.API 14. Aug 2010 10:04

AW: #0 durch "nichts" ersetzen
 
Zitat:

Zitat von RAD Studio VCL Reference Delete
If count specifies more characters than remain starting at the index, System::AnsiStringBase::Delete removes the rest of the string. If count is less than 0, no characters are deleted.

Also nicht sonderlich performant.

Helmi 14. Aug 2010 10:09

AW: #0 durch "nichts" ersetzen
 
Zitat:

Zitat von mkinzler (Beitrag 1042086)
Oder StringReplace()

StringReplace hört aber beim ersten #0 auf, meines Wissens nach

Zitat:

Zitat von Win32.API (Beitrag 1042087)
Nicht getestet:
Delphi-Quellcode:
  i := 0;
  SetLength(sTmp, Length(s));
  for c in s do
  begin
    if (c <> #0) then
    begin
      s[i] := c;
      inc(i);
    end;
  end;
  SetLength(sTmp, pred(i));

mmh - eigentlich kein schlechtes Beispiel - hätt ich auch selbst drauf kommen können
werd ich mal ausprobieren
(wobei for ... in ... do in Delphi 7 noch nicht vorhanden ist)

Daniela.S 14. Aug 2010 11:02

AW: #0 durch "nichts" ersetzen
 
Delphi-Quellcode:
   str := StringReplace( str, #0, '', [rfReplaceAll] );

himitsu 14. Aug 2010 11:09

AW: #0 durch "nichts" ersetzen
 
StringReplace nutzt intern blöder Weise einen PChar-Pos, welches bei 0 endet und ignoriert die Längenangabe des Strings.

Also For+Delete oder das Schnellere von Win32.API oder eine PChar-Variante, welche auf die Längenangabe und nicht auf ein #0 hört.

DeddyH 14. Aug 2010 11:30

AW: #0 durch "nichts" ersetzen
 
Kleine Änderung (allerdings auch ungetestet):
Delphi-Quellcode:
  i := 0;
  SetLength(sTmp, Length(s));
  for c in s do
  begin
    if (c <> #0) then
    begin
      //erst erhöhen, sonst Zugriff auf String[0]
      inc(i);
      s[i] := c;    
    end;
  end;
  //jetzt müsste i der exakten Länge entsprechen
  SetLength(sTmp, i);

Helmi 14. Aug 2010 17:11

AW: #0 durch "nichts" ersetzen
 
Danke für eure Antworten!

Habs jetzt endgültig so gemacht:

Delphi-Quellcode:
    //String aus StringStream auslesen
    S_Data := StringStream.DataString;

    //String auf die Länge des Datenstrings setzen
    SetLength(S, length(S_Data));

    //#0 ausfiltern und in neuen String schreiben
    for i := 1 to length(S_Data) do
      begin
        If S_Data[i] <> #0 then
          begin
            inc(j);
            S[j] := S_Data[i];
          end;
      end;

    //wirkliche Größe des Strings setzen
    SetLength(S, j);


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 Uhr.
Seite 1 von 2  1 2      

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