![]() |
Trim funktion
Ich hab ne kleine funktion für ein projekt geschrieben, die Sonderzeichen und Umlaute aus einem Memo-Feld ersetzt:
Delphi-Quellcode:
FehlerMeldung:
function TForm1.trimmen(M:TMemo):TMemo;
var y,x : integer; code : string; begin for y := 0 to M.Lines.count-1 do begin code := ''; for x:= 1 to length(M.Lines[y]) do if Upcase(M.Lines[y][x]) in['A'..'Z'] then code := code + Upcase(M.Lines[y][x]) else case Upcase(M.Lines[y][x]) of 'Ä': code := code + 'AE'; 'Ö': code := code + 'OE'; 'Ü': code := code + 'UE'; 'ß': code := code + 'SS'; else code := code + ' '; end; result.Lines.Add(code); end; end; --------------------------- Debugger Exception Notification --------------------------- Project Project1_morsen.exe raised exception class EAccessViolation with message 'Access violation at address 00457A49 in module 'Project1_morsen.exe'. Read of address 00000220'. Process stopped. Use Step or Run to continue. --------------------------- --------------------------- Dieser Fehler kommt in folgender Zeile: result.Lines.Add(code); |
Re: Trim funktion
Hallo 1ceman!
Die Fehlermeldung tritt auf, weil Du als Rückgebetyp ein Objekt deklariert hat, dieses aber nirgends kreierst. Ich gehe davon aus, daß Du die Änderungen direkt in dem Memo haben möchtest, das Du als M der funktion übergibst. Das wäre dann folgendemaßen machbar:
Delphi-Quellcode:
Jetzt bekommst Du aus der Funktion ein True zurück, wenn etwas umkodiert wurde, andernfalls ein False.
function TForm1.trimmen(M:TMemo):Boolean;
var y,x : integer; code : string; begin Result := False; for y := 0 to M.Lines.count-1 do begin code := ''; for x:= 1 to length(M.Lines[y]) do if Upcase(M.Lines[y][x]) in['A'..'Z'] then code := code + Upcase(M.Lines[y][x]) else begin Result := True; case Upcase(M.Lines[y][x]) of 'Ä': code := code + 'AE'; 'Ö': code := code + 'OE'; 'Ü': code := code + 'UE'; 'ß': code := code + 'SS'; else code := code + ' '; end; end; M.Lines [y] := code; end; end; Hoffe, das hilft Dir weiter Gruß onlinekater |
Re: Trim funktion
Man könnte es auch so machen: ;)
Delphi-Quellcode:
Memo1.Text := StringReplace(Memo1.Text,'ä','ae', [rfReplaceAll,rfIgnoreCase]);
Memo1.Text := StringReplace(Memo1.Text,'ö','oe', [rfReplaceAll,rfIgnoreCase]); Memo1.Text := StringReplace(Memo1.Text,'ü','ue', [rfReplaceAll,rfIgnoreCase]); Memo1.Text := StringReplace(Memo1.Text,'ß','ss', [rfReplaceAll,rfIgnoreCase]); |
Re: Trim funktion
Wenn schon, dann so (Damit das Memo den String nicht ständig neu bearbeiten muß):
Delphi-Quellcode:
Aber mit Groß-/Kleinschreibung macht's sich bestimmt auch nicht schlecht ^_^
Var S: String;
S := StringReplace(Memo1.Text,'ä','ae', [rfReplaceAll,rfIgnoreCase]); S := StringReplace(S,'ö','oe', [rfReplaceAll,rfIgnoreCase]); S := StringReplace(S,'ü','ue', [rfReplaceAll,rfIgnoreCase]); Memo1.Text := StringReplace(S,'ß','ss', [rfReplaceAll,rfIgnoreCase]);
Delphi-Quellcode:
Var S: String;
S := StringReplace(Memo1.Text,'ä','ae', [rfReplaceAll]); S := StringReplace(S,'ö','oe', [rfReplaceAll]); S := StringReplace(S,'ü','ue', [rfReplaceAll]); S := StringReplace(S,'Ä','Ae', [rfReplaceAll]); S := StringReplace(S,'Ö','Oe', [rfReplaceAll]); S := StringReplace(S,'Ü','Ue', [rfReplaceAll]); Memo1.Text := StringReplace(S,'ß','ss', [rfReplaceAll]); Aber da er ja nicht nur die äöüß übersetzt, sondern auch noch alles in Großschreibung umwandelt und alles was kein A-Z ist durch ein Leerzeichen ersetzt...
Delphi-Quellcode:
Oder mit dem Rückgabewert von der männlichen Katze (ich frag mich nur, warum die auf'n Strich geht :roll: )
procedure TForm1.trimmen(M: TMemo);
var s : string; i : integer; begin s := AnsiUpperCase(M.Text); s := StringReplace(S,'Ä','AE', [rfReplaceAll]); s := StringReplace(S,'Ö','OE', [rfReplaceAll]); s := StringReplace(S,'Ü','UE', [rfReplaceAll]); s := StringReplace(S,'ß','SS', [rfReplaceAll]); for i := 1 to Length(s) do if not (s[i] in [#10, #13, 'A'..'Z') then s[i] := ' '; Memo1.Text := s; end;
Delphi-Quellcode:
function TForm1.trimmen(M: TMemo): Boolean;
var s, temp : string; i : integer; begin s := AnsiUpperCase(M.Text); temp := s; s := StringReplace(S,'Ä','AE', [rfReplaceAll]); s := StringReplace(S,'Ö','OE', [rfReplaceAll]); s := StringReplace(S,'Ü','UE', [rfReplaceAll]); s := StringReplace(S,'ß','SS', [rfReplaceAll]); for i := 1 to Length(s) do if not (s[i] in [#10, #13, 'A'..'Z']) then s[i] := ' '; Memo1.Text := s; result := s <> temp; end; |
Re: Trim funktion
@himitsu: wäre es nicht geschickter, auch beim Beispiel 3 und 4 den geänderten Text in das Memo zurückzuschreiben?
|
Re: Trim funktion
Also erst mal vielen dank für die vielen und schnellen Antworten.
Mit dem StringReplace ist nur das Problem,das nachher die Formatierung nicht mehr stimmt, also die Zeilenümbrüche nicht mehr da sind. deswegen habe ich das jetzt so gelöst:
Delphi-Quellcode:
und ob er was ersetzt hat oder nichtm das brauche ich für mein Programm nicht, also hab ich das auch mal weggelassen.
procedure TForm1.trimmen(M:TMemo);
var y,i : integer; s : string; begin for y := 0 to M.Lines.count-1 do begin s := AnsiUpperCase(M.Lines[y]); s := StringReplace(S,'Ä','AE', [rfReplaceAll]); s := StringReplace(S,'Ö','OE', [rfReplaceAll]); s := StringReplace(S,'Ü','UE', [rfReplaceAll]); s := StringReplace(S,'ß','SS', [rfReplaceAll]); for i := 1 to Length(s) do if not (s[i] in ['A'..'Z']) then s[i] := ' '; M.Lines[y] := s; end; end; |
Re: Trim funktion
Zitat:
Der Name erklärt sich dadurch, daß ich Katzen bzw. Katerliebhaber bin und einfach zuviel vor der Kiste bzw. im Internat rumhänge :dancer: Gruß onlinekater aka Thomas |
Re: Trim funktion
Zitat:
Zitat:
Also dürfte der 3. Code für dich passend sein ^_^
Delphi-Quellcode:
@onlinekater: OK, wenn man das sooo sieht -.-''
procedure TForm1.trimmen(M: TMemo);
var s : string; i : integer; begin s := AnsiUpperCase(M.Text); s := StringReplace(S, 'Ä', 'AE', [rfReplaceAll]); s := StringReplace(S, 'Ö', 'OE', [rfReplaceAll]); s := StringReplace(S, 'Ü', 'UE', [rfReplaceAll]); s := StringReplace(S, 'ß', 'SS', [rfReplaceAll]); for i := 1 to Length(s) do if not (s[i] in [#10, #13, 'A'..'Z') then s[i] := ' '; Memo1.Text := s; end; Oder mal als Gag, wie wäre es mit dieser total unleserlichen, aber dennoch funktionalen Lösung :mrgreen:
Delphi-Quellcode:
procedure TForm1.trimmen(M: TMemo);
var s : string; i : integer; begin s := StringReplace(StringReplace(StringReplace(StringReplace(AnsiUpperCase(M.Text), 'Ä', 'AE', [rfReplaceAll]), 'Ö', 'OE', [rfReplaceAll]), 'Ü', 'UE', [rfReplaceAll]), 'ß', 'SS', [rfReplaceAll]); for i := 1 to Length(s) do if not (s[i] in [#10, #13, 'A'..'Z') then s[i] := ' '; Memo1.Text := s; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 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