Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi unbekannte zeichen löschen... (https://www.delphipraxis.net/33511-unbekannte-zeichen-loeschen.html)

glkgereon 8. Nov 2004 14:46


unbekannte zeichen löschen...
 
hi, ich möchte aus einem richedit alle unbekannten zeichen löschen, und den rest in ein zweites richedit kopieren...

ich hatte mir das so gedacht:
Delphi-Quellcode:
procedure TForm1.Los1Click(Sender: TObject);
var i,j:integer;
    Buchstaben, Zahlen, Interpunktion, Mathe, Sonderzeichen:set of char;
    zeichen:set of char;
begin
  buchstaben:=   ['a'..'z','A'..'Z','ß','ä','Ä','ö','Ö','ü','Ü'];
  zahlen:=       ['1'..'9'];
  Interpunktion:= ['.',',',':',';','!','?','-','_'];
  Mathe:=        ['²','³','+','-','*','/','(',')','{','}','{','}','%','='];
  Sonderzeichen:= ['^','°','"','§','$','&','/','´','`','~','#','''','@','&#8364;','<','>','|',#13,' '];
  zeichen:= buchstaben + zahlen + interpunktion + mathe + sonderzeichen;
  for i:=0 to RichEdit1.Lines.Count-1 do
    for j:=0 to Length(RichEdit1.Lines[i]) do
      if RichEdit1.Lines[i][j] in zeichen
      then RichEdit2.Lines[i]:=RichEdit2.Lines[i]+RichEdit1.Lines[i][j];
end;
aber es gibt immer einen error...bei der if abfrage...

fkerber 8. Nov 2004 14:48

Re: unbekannte zeichen löschen...
 
Hi!

Sagst du uns auch, welcher Error da kommt?


Ciao Frederic

glkgereon 8. Nov 2004 14:54

Re: unbekannte zeichen löschen...
 
öhh, moment...

Zugriffsverletzung bei der Adresse 00401DEC bei Lesen von Adresse FFFFFF

fkerber 8. Nov 2004 14:55

Re: unbekannte zeichen löschen...
 
Hi!

dein [j] geht wohl zu weit. Mach da auch mal length(..)-1



Ciao Frederic

shmia 8. Nov 2004 14:59

Re: unbekannte zeichen löschen...
 
Deine innere For-Schleife habt üble Neben Effekte:
Delphi-Quellcode:
for j:=0 to Length(RichEdit1.Lines[i]) do
      if RichEdit1.Lines[i][j] in zeichen
      then RichEdit2.Lines[i]:=RichEdit2.Lines[i]+RichEdit1.Lines[i][j];
Du gehst Zeichen für Zeichen über den String RichEdit1.Lines[i] und änderst gleichzeitig RichEdit1.Lines[i].
Ich würde dir folgende Funktion aus der JCL empfehlen:
Delphi-Quellcode:
function StrKeepChars(const S: AnsiString; const Chars: TSysCharSet): AnsiString;
var
  Source, Dest: PChar;
begin
  SetLength(Result, Length(S));
  UniqueString(Result);
  Source := PChar(S);
  Dest := PChar(Result);
  while (Source <> nil) and (Source^ <> #0) do
  begin
    if Source^ in Chars then
    begin
      Dest^ := Source^;
      Inc(Dest);
    end;
    Inc(Source);
  end;
  SetLength(Result, (Longint(Dest) - Longint(PChar(Result))) div SizeOf(AnsiChar));
end;
Und damit kurz und knackig:
Delphi-Quellcode:
for j:=0 to Length(RichEdit1.Lines[i]) do
      RichEdit2.Lines[i]:=StrKeepChars(RichEdit2.Lines[i], zeichen);

glkgereon 8. Nov 2004 15:45

Re: unbekannte zeichen löschen...
 
also ich habs jetzt so gelöst:

Delphi-Quellcode:
procedure TForm1.Los1Click(Sender: TObject);
var i,j:integer;
    Buchstaben, Zahlen, Interpunktion, Mathe, Sonderzeichen:set of char;
    zeichen:set of char;
    temp, temp2:string;
begin
  RichEdit2.Clear;
  buchstaben:=   ['a'..'z','A'..'Z','ß','ä','Ä','ö','Ö','ü','Ü',' '];
  zahlen:=       ['1'..'9'];
  Interpunktion:= ['.',',',':',';','!','?','-','_'];
  Mathe:=        ['²','³','+','-','*','/','(',')','{','}','{','}','%','='];
  Sonderzeichen:= ['^','°','"','§','$','&','/','´','`','~','#','''','@','&#8364;','<','>','|',#13];
  zeichen:= buchstaben + zahlen + interpunktion + mathe + sonderzeichen;
  temp:=RichEdit1.Text;
  for i:=0 to length(temp)-1 do if temp[i] in zeichen then temp2:=temp2+temp[i];
  for i:=length(temp)-2 downto 0 do
    begin
    if (temp[i]=temp[i+1]) and (temp[i]=' ') then delete(temp,i,1);
    if (temp[i]=temp[i+1]) and (temp[i]=#13) then delete(temp,i,1);
    end;
  RichEdit2.Lines.Add(temp2);
end;
aber das mit den doppelten Zeilenzmbrüchen löschen funzt nicht :(

shmia 8. Nov 2004 16:49

Re: unbekannte zeichen löschen...
 
Zitat:

Zitat von glkgereon
also ich habs jetzt so gelöst:
...
aber das mit den doppelten Zeilenzmbrüchen löschen funzt nicht :(

Dein Code ist ja auch wieder falsch!!! :wall:
Delphi-Quellcode:
temp:=RichEdit1.Text;
  for i:=0 to length(temp)-1 do if temp[i] in zeichen then temp2:=temp2+temp[i];
  // das Ergebnis ist nun in Variable temp2

  // aber nun arbeitest du wieder mit temp (=die orginal-daten)
  for i:=length(temp)-2 downto 0 do
    begin
    if (temp[i]=temp[i+1]) and (temp[i]=' ') then delete(temp,i,1);
    if (temp[i]=temp[i+1]) and (temp[i]=#13) then delete(temp,i,1);
    end;
  // auch falsch: der geänderte Text wird an den bestehenden Text angehängt
  // richtig wäre RichEdit2.Lines.Text := ....
  RichEdit2.Lines.Add(temp2);
end;
Ich empfehle dir, unbedingt die function StrKeepChars zu verwenden. Vorteile
  • auf Geschwindigkeit optimiert
  • garantiert fehlerfrei, da gut getestet
  • wiederverwendbar (dazu sind ja Proceduren & Funktionen da)
  • erhöht die Lesbarkeit des Programmcodes

glkgereon 8. Nov 2004 17:19

Re: unbekannte zeichen löschen...
 
boah nee, (2mal)
nummer 1: boah nee, das will ich selbst hinkriegen
nummer 2: boah nee, schon wieder falsch??? :shock:

ich hoffe ich kriegs nochma hin....


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 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