![]() |
Pos, Copy und Delete bei WideStrings
So, ich spiele ja seit 'ner Weile mit Unicode rum und irgendwie fand ich irgendwie etwas wichtiges nicht und hatte mir deßhalb selber was gebastelt.
Vieleicht kann da mal jemand nachsehn, ob sich hier noch etwas "sinvoll" verbessern läßt? Na ja, bei Delete hab ich auch noch ein kleines Problem ... wenn ich dort ohne eine Hilfsvariable arbeite gibt es ein unerklärliches Problem, wenn der gesamte Inhalt gelöscht werden soll. z.B. Delete('x', 1, 1); {natürlich für 'x' eine Variable, mit soeinem Inhalt} In diesem Fall müßte ja an S ein leerer String übergeben werden (S := '' + ''), aber leider wird in soeinem Fall der Inhalt von S nicht verändert? (Copy arbeitet aber richtig - hab ich schon geprüft)
Delphi-Quellcode:
So funktioniert es ja nicht immer :(
Function PosW(SubStr: WideString; S: WideString): LongInt;
Begin If Length(SubStr) > Length(S) Then Begin Result := 1; While Length(SubStr) + Result - 1 <= Length(S) do Begin If CompareMem(@SubStr[1], @S[Result], Length(SubStr) shl 1) Then Exit; Inc(Result); End; End; Result := 0; End; Function CopyW(S: WideString; Index, Count: LongInt): WideString; Begin If Index < 1 Then Index := 1; If Count < 0 Then Count := 0; If Index + Count - 1 > Length(S) Then Count := Length(S) - Index + 1; If Count > 0 Then Begin SetLength(Result, Count); Move(S[Index], Result[1], Count shl 1); End Else SetLength(Result, 0); End; Procedure DeleteW(Var S: WideString; Index, Count: LongInt); Var S2: WideString; Begin S2 := CopyW(S, 1, Index - 1) + CopyW(S, Index + Count, Length(S)); S := S2; End;
Delphi-Quellcode:
OK, ich könnte ja auch die einzelnen WideChars nach Index um Count nach vorne verschieben und dann den WideString verkürzen, aber ich hatte halt keine Lust irgendwas Zeichenweise zu bearbeiten :P
Procedure DeleteW(Var S: WideString; Index, Count: LongInt);
Begin S := CopyW(S, 1, Index - 1) + CopyW(S, Index + Count, Length(S)); End; Ach ja, ein Wunderschönes neues Jahr und viele Grüße an alle, die (m)ich vermisse(n) ... |
Re: Pos, Copy und Delete bei WideStrings
Bei deiner ZEile :
Delphi-Quellcode:
Überprüf mal, welchen wert length(S) beim Aufruf des 2. CopyW bekommt.S := CopyW(S, 1, Index - 1) + CopyW(S, Index + Count, Length(S)); eventuell ändert sich S zwischen den zwei aufrufen von CopyW, und es wird deshalb beim zweiten CopyW length(S) falsch berechnet ? |
Re: Pos, Copy und Delete bei WideStrings
Also da in Copy ja nichts an S geändert wird, liefert Length(S) auch das Richtige. Ausserdem hatte ich mir ja auch schon die Ergebnisse der Funktionen angesehn und beide Male wird auch '' zurückgegeben, ausserdem tritt das ja auch nur auf, wenn alles gelöscht wird, sonst nicht :gruebel:
Code:
Also, wie gesagt ... CopyW liefert das Richtige, aber es wird halt nur nicht übergeben.
Function CopyW(S: WideString; Index, Count: LongInt): WideString;
Begin [color=red]>>> hab mir hier S, Index und Count anzeigen lassen[/color] [color=red] und sie waren so, wie sie es sein sollten[/color] If Index < 1 Then Index := 1; If Count < 0 Then Count := 0; If Index + Count - 1 > Length(S) Then Count := Length(S) - Index + 1; If Count > 0 Then Begin SetLength(Result, Count); Move(S[Index], Result[1], Count shl 1); End Else SetLength(Result, 0); [color=red]>>> hab mir hier Result anzeigen lassen und es war tatsächlich '' ?[/color] End; |
Re: Pos, Copy und Delete bei WideStrings
hmmm.... haste recht.
Habs mir auch gerade im Debugger angesehen .... macht wirklich komische Sachen das Delphi ... |
Re: Pos, Copy und Delete bei WideStrings
Dein Problem etwas vereinfacht .....
Delphi-Quellcode:
function keinCopy(s : WideString) : WideString;
begin Result := ''; end; Procedure KeinDelete(Var S: WideString); begin s := keinCopy(s) + keinCopy(s); end; Procedure KeinDeleteOK(Var S: WideString); begin s := keinCopy(s) + keinCopy(s) + ''; end; procedure TForm1.Button2Click(Sender: TObject); var s : WideString; begin s := 'H'; KeinDelete(s); // liefert H zurück Edit1.Text := s; s := 'H'; KeinDeleteOK(s); // liefer leeren String zurück Edit2.Text := s; end; |
Re: Pos, Copy und Delete bei WideStrings
Welche Delphi-Version hast Du?
Unter D6 gibt es diese Funktionen (auch wenn es nicht in der Delphi-Hilfe beschrieben ist) auch in einer Widestring-Version. |
Re: Pos, Copy und Delete bei WideStrings
Zitat:
|
Re: Pos, Copy und Delete bei WideStrings
Zitat:
nach _WStr... werd'sch gleich mal suchen. Für die Konvertiwerung zwischen Wide und Ansi hab ich ja auch schon was gefunden gehabt. @Gruber_Hans_12345 s := keinCopy(s) + keinCopy(s) + ''; ist ja "besser", als das, mit der zusätlichen Variable, aber in dieser Sache ist Delphi wirklich etwas komisch. :wall: |
Re: Pos, Copy und Delete bei WideStrings
Hi,
so gehts bei mir ohne Probleme :gruebel:
Delphi-Quellcode:
mfG
var
s1, s2: WideString; begin s1 := 'Hallo Welt'; s2 := Copy(s1, 4, 4); mirage228 |
Re: Pos, Copy und Delete bei WideStrings
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Konvertierung von Ansi nach Unicode
s1 := 'Hallo Welt';
Delphi-Quellcode:
Kopieren von vier Unicode-Zeichen ab Zeichen 4 nach s2.
s2 := Copy(s1, 4, 4);
Gut das es Compilermagic gibt, die einem einiges an Arbeit abnimmt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 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