Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Stringende wieder hinzufügen (https://www.delphipraxis.net/118897-stringende-wieder-hinzufuegen.html)

TheMiller 17. Aug 2008 15:22


Stringende wieder hinzufügen
 
Hallo,

da diese Frage spezieller ist, eröffne ich einen neuen Thread, der aber eigentlich zu dem hier (Stream wie Editor einlesen)

Also, ich habe in dem oben genannten Thread eine Funktion gepostet bekommen, mit der ich das Stringende-Zeichen #0 entfernen kann. Nun zeigt mir das Memo alles toll an. Damit ich die Datei wieder speichern kann, habe ich das #0 durch ?) ersetzt. Nun möchte ich das ?)-Zeichen wieder in #0 mit StrReplaceBin umwandeln. Doch da fügt er nur das erste Zeichen ein, erkennt natürlich wieder ein Stringende und hört somit auf. Somit habe ich nur die ersten 4 Bytes (?) glaube ich.

Die Datei kann also nicht mehr gespeichert werden. Ich denke, dass StrReplaceBin müsste am Ende der Datei anfangen zu ersetzen und sich vorarbeiten, damit sie nicht vorzeitig abbricht. Doch die Funktion ist in ASM und davon habe ich noch weniger Ahnung.

Bitte um Hilfe!

Danke

Apollonius 17. Aug 2008 15:26

Re: Stringende wieder hinzufügen
 
Du kannst doch einfach den String mit einer for-Schleife durchlaufen und jedes Ersatzzeichen durch ein #0 ersetzen.

TheMiller 17. Aug 2008 15:29

Re: Stringende wieder hinzufügen
 
Das darf doch dann aber kein String-#0 sein. Es muss ja ein Binärwert sein... Sonst habe ich ja #0 da stehen und nicht ein tatsächliches Stringende. Oder?

omata 17. Aug 2008 15:32

Re: Stringende wieder hinzufügen
 
Und welches Ersatzzeichen soll man da nehmen? Vielleicht ist ja z.B. das Fragezeichen vorher auch ein Fragezeichen gewesen und nicht #0 :zwinker:

TheMiller 17. Aug 2008 15:36

Re: Stringende wieder hinzufügen
 
Ich will ja kein Ersatzzeichen, ich mag ja nur mein Ersatzzeichen wieder in ein Binär-#0-Zeichen umwandeln.

Apollonius 17. Aug 2008 15:38

Re: Stringende wieder hinzufügen
 
#0 ist das Zeichen mit dem Binärwert 0, wird also bei PChars als Stringende interpretiert. Der Trick liegt darin, dass bei Strings im Gegensatz zu PChars noch eine zusätzliche Längenangabe vorliegt, auf die mit Length() zugegriffen wird. Damit umgehst du das Problem des vorzeitigen Abbrechens.

TheMiller 17. Aug 2008 15:45

Re: Stringende wieder hinzufügen
 
Hm.. das hab ich nicht ganz verstanden.

Zuerst wandel ich den Kram folgendermaßen um, um ihn im Memo anzuzeigen:

Delphi-Quellcode:
//String, Suchen_nach, Ersetzen-durch
StrReplaceBin(s, #0, '&%');
Nun kann ich es im Memo alles ansehen. Um zu speichern, wollte ich wieder zurückwandeln:

Delphi-Quellcode:
StrReplaceBin(s, '&%', #0);
Da ersetzt er nur bis zum ersten Vorkommen, danach ist für ihn der String zu Ende.

Ich habe nicht ganz verstanden, wie dieser "Trick" funktionieren soll, den du geschrieben hast - bzw wie ich ihn umsetze.

Apollonius 17. Aug 2008 15:55

Re: Stringende wieder hinzufügen
 
Hm, mit einem Ersetzungsstring, der größer als ein Byte ist, wird das etwas schwieriger. Allerdings nicht unmöglich:
Delphi-Quellcode:
procedure Fix0Bytes(var Str: String);
var i, j: Integer;
begin
  i := 1;
  j := 1;
  while i < Length(Str) do
    if (Str[i] = '&') and (Str[i+1] = '%') then
    begin
      Str[j] := #0;
      Inc(i, 2);
      Inc(j);
    end
    else
    begin
      Str[j] := Str[i];
      Inc(i);
      Inc(j);
    end;
  SetLength(Str, j);
end;
Ich habe es nicht getestet, aber zumindest mit Ansistrings müsste es so gehen.

TheMiller 17. Aug 2008 15:58

Re: Stringende wieder hinzufügen
 
Hey...

hab mal Copy&Paste gemacht, das Ergebnis ist leider das gleiche. Vielleicht müssen wir die Funktion so umschreiben, dass sie am Dateiende beginnt, die Strings zu ersetzen und sich zum Beginn der Datei vorarbeitet. Das könnte doch gehen, oder?

Apollonius 17. Aug 2008 15:59

Re: Stringende wieder hinzufügen
 
Wie speicherst du denn den String?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 Uhr.
Seite 1 von 2  1 2      

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