Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Trim funktion (https://www.delphipraxis.net/64179-trim-funktion.html)

1ceman 28. Feb 2006 15:31


Trim funktion
 
Ich hab ne kleine funktion für ein projekt geschrieben, die Sonderzeichen und Umlaute aus einem Memo-Feld ersetzt:

Delphi-Quellcode:
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;
FehlerMeldung:
---------------------------
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);

TBx 28. Feb 2006 15:46

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:
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;
Jetzt bekommst Du aus der Funktion ein True zurück, wenn etwas umkodiert wurde, andernfalls ein False.

Hoffe, das hilft Dir weiter

Gruß

onlinekater

leddl 28. Feb 2006 15:56

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]);

himitsu 28. Feb 2006 16:28

Re: Trim funktion
 
Wenn schon, dann so (Damit das Memo den String nicht ständig neu bearbeiten muß):

Delphi-Quellcode:
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]);
Aber mit Groß-/Kleinschreibung macht's sich bestimmt auch nicht schlecht ^_^
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:
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 mit dem Rückgabewert von der männlichen Katze (ich frag mich nur, warum die auf'n Strich geht :roll: )
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;

Hawkeye219 28. Feb 2006 18:28

Re: Trim funktion
 
@himitsu: wäre es nicht geschickter, auch beim Beispiel 3 und 4 den geänderten Text in das Memo zurückzuschreiben?

1ceman 28. Feb 2006 18:41

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:
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;
und ob er was ersetzt hat oder nichtm das brauche ich für mein Programm nicht, also hab ich das auch mal weggelassen.

TBx 28. Feb 2006 21:14

Re: Trim funktion
 
Zitat:

Oder mit dem Rückgabewert von der männlichen Katze (ich frag mich nur, warum die auf'n Strich geht)
@Himitsu: hmmm .... könnte daran liegen, dass Deine Interpretation nicht stimmt :freak:
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

himitsu 1. Mär 2006 13:34

Re: Trim funktion
 
Zitat:

Zitat von Hawkeye219
@himitsu: wäre es nicht geschickter, auch beim Beispiel 3 und 4 den geänderten Text in das Memo zurückzuschreiben?

Jupp, wäre es ...
Zitat:

Zitat von 1ceman
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.

... und außerdem dürfen natürtürlich auch die Zeilenumbrüche nicht mit gelöscht werden :wall:

Also dürfte der 3. Code für dich passend sein ^_^
Delphi-Quellcode:
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;
@onlinekater: OK, wenn man das sooo sieht -.-''

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:48 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