AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Trim funktion

Ein Thema von 1ceman · begonnen am 28. Feb 2006 · letzter Beitrag vom 1. Mär 2006
Antwort Antwort
1ceman

Registriert seit: 16. Dez 2005
Ort: Odenthal
134 Beiträge
 
Delphi 6 Personal
 
#1

Trim funktion

  Alt 28. Feb 2006, 16:31
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);
Roman
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#2

Re: Trim funktion

  Alt 28. Feb 2006, 16:46
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
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Trim funktion

  Alt 28. Feb 2006, 16:56
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]);
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.078 Beiträge
 
Delphi 12 Athens
 
#4

Re: Trim funktion

  Alt 28. Feb 2006, 17:28
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 )
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Trim funktion

  Alt 28. Feb 2006, 19:28
@himitsu: wäre es nicht geschickter, auch beim Beispiel 3 und 4 den geänderten Text in das Memo zurückzuschreiben?
  Mit Zitat antworten Zitat
1ceman

Registriert seit: 16. Dez 2005
Ort: Odenthal
134 Beiträge
 
Delphi 6 Personal
 
#6

Re: Trim funktion

  Alt 28. Feb 2006, 19:41
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.
Roman
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#7

Re: Trim funktion

  Alt 28. Feb 2006, 22:14
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
Der Name erklärt sich dadurch, daß ich Katzen bzw. Katerliebhaber bin und einfach zuviel vor der Kiste bzw. im Internat rumhänge

Gruß

onlinekater
aka Thomas
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.078 Beiträge
 
Delphi 12 Athens
 
#8

Re: Trim funktion

  Alt 1. Mär 2006, 14:34
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 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

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
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 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