Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Text durchsuchen (https://www.delphipraxis.net/126860-text-durchsuchen.html)

Matze 5. Jan 2009 09:21

Re: Text durchsuchen
 
Hallo,

mal ein ganz anderer Ansatz: Du könntest den kompletten String an bestimmten Trennzeichen auftrennen und die dazwischen liegenden Einträge bsp. in eine TStringList schreiben. Die gehst du durch und prüfst auf das @-Zeichen (falls dies zur Feststellung einer E-Mail-Adresse für dich ausreicht.

Da gibt es zum Beispiel diese Prozedur in der Code-Library: Strings trennen.

Ein Aufruf könnte ungefähr so aussehen (ich habe das nur anhand des Beispiels aus der CL zusammengetippt):

Delphi-Quellcode:
procedure ShowEmails(const s: string); // s ist dein dein zu durchsuchender Text (Memo1.Text)
var
  StrList, NewList: TStringlist;
  i: Integer;
begin
  StrList := TStringlist.Create;
  NewList := TStringlist.Create;
  try
    // Hinzufügen aller Trennzeichen
    StrList.Append(',');
    StrList.Append(';');
    StrList.Append('|');
    StrList.Append('"');
    StrList.Append(' ');
    StrList.Append(#13#10);

    DivideString(s, StrList, NewList);

    // Prüfen auf eine E-Mail-Adresse
    for i := 0 to NewList.Count - 1 do
    begin
      // E-Mail-Adressen ausgeben
      if Pos('@', NewList[i]) > 0 then
        ShowMessage(NewList[i]);
    end;
  finally
    FreeAndNil(NewList);
    FreeAndNil(StrList);
  end;
end;
Wie gesagt, das ist komplett ungetestet, doch ich könnte mir vorstellen, dass es in der Art funktioniert.

Grüße, Matze

fkerber 5. Jan 2009 09:38

Re: Text durchsuchen
 
Hi!

Fehlt das Zeichen immer nur, wenn es quasi auch das letzte Zeichen der Datei war?


Ciao, Frederic

Thomas F 5. Jan 2009 09:51

Re: Text durchsuchen
 
Zitat:

Zitat von fkerber
Hi!

Fehlt das Zeichen immer nur, wenn es quasi auch das letzte Zeichen der Datei war?

Ciao, Frederic

STIMMT !

Immer wenn das Zeichen das letzte Zeichen in der Datei ist , fehlt es !
Ansonsten kein Fehler mehr !

fkerber 5. Jan 2009 09:55

Re: Text durchsuchen
 
Hi!

Dann sollte diese Veränderung wohl die gewünschte Lösung sein:

Delphi-Quellcode:
while (...  stop <= length(aValue)
Ciao, Frederic

jfheins 5. Jan 2009 09:55

Re: Text durchsuchen
 
Zitat:

Zitat von Thomas F
Zitat:

Zitat von fkerber
Hi!

Fehlt das Zeichen immer nur, wenn es quasi auch das letzte Zeichen der Datei war?

Ciao, Frederic

STIMMT !

Immer wenn das Zeichen das letzte Zeichen in der Datei ist, fehlt es !
Ansonsten kein Fehler mehr !

Ja.

Weil diese Schleife (und die davor übrigens auch)

Zitat:

Zitat von Thomas F
Delphi-Quellcode:
  stop := at+1;
  while (aValue[stop] in permittedChar) and (stop < length(aValue)) do
  begin
    Inc (stop)
  end;

Aufhört, wenn an der Endposition ein falsches Zeichen gefunden wird, oder das Ende des Textes erreicht wurde. Somit ist bei aValue[stop] immer entweder ein falsches Zeichen oder der Ende des Textes ;)

Besser:
Delphi-Quellcode:
  stop := at;
  while (aValue[stop+1] in permittedChar) and (stop < length(aValue)) do
  begin
    Inc (stop)
  end;
P.S. Dann aber beim Copy() bitte nichts mehr abschneiden ;)

Thomas F 5. Jan 2009 10:04

Re: Text durchsuchen
 
Ja, Danke für die Hilfe !

An diesem Fehler hab ich jetzt schon 2 Tage rumgebastelt ! :wall:

Uwe Raabe 5. Jan 2009 11:27

Re: Text durchsuchen
 
Also dieser Code ist arg bösartig:

Delphi-Quellcode:
 
stop := at;
while (aValue[stop+1] in permittedChar) and (stop < length(aValue)) do
begin
  Inc (stop)
end;
weil nämlich im Falle von "stop = length(value)" der Zugriff auf "aValue[stop+1]" einen RangeError auslösen sollte (passiert immer dann, wenn eine Mail-Adresse am Ende von aValue steht). Ditto bei der Suche nach dem Anfang der Mail-Adresse. Deswegen soll man ja auch beim Entwicklen und Debuggen diverse Compiler-Flags wie "Bereichsüberprüfung" und "Überlaufprüfung" einschalten.

Besser wäre hier (unter der Annahme, daß "Vollst. Boolesche Auswertung" abgeschaltet ist):

Delphi-Quellcode:
 
start := at-1;
while (start > 0) and (aValue[start] in permittedChar) do
begin
  Dec (start)
end;
{ hier steht start vor dem ersten gültigen Zeichen (kann 0 sein) }

stop := at+1;
while (stop <= length(aValue)) and (aValue[stop] in permittedChar) do
begin
  Inc (stop)
end;
{ hier steht stop nach dem letzten gültigen Zeichen (kann length() + 1 sein) }

Mytext:= Copy (aValue, start, stop - start - 1);

Thomas F 5. Jan 2009 14:17

Re: Text durchsuchen
 
Zitat:

Zitat von Uwe Raabe

Delphi-Quellcode:
 
start := at-1;
while (start > 0) and (aValue[start] in permittedChar) do
begin
  Dec (start)
end;
{ hier steht start vor dem ersten gültigen Zeichen (kann 0 sein) }

stop := at+1;
while (stop <= length(aValue)) and (aValue[stop] in permittedChar) do
begin
  Inc (stop)
end;
{ hier steht stop nach dem letzten gültigen Zeichen (kann length() + 1 sein) }

Mytext:= Copy (aValue, start, stop - start - 1);

Dieser Code funktioniert leider auch nicht , habs getestet.

Der einzige Code, der mit allen Dateien fehlerfrei funktioniert

Delphi-Quellcode:
start := at-1;
while (start > 0) and (aValue[start] in permittedChar) do
begin
  Dec (start)
end;
stop := at;
  while (aValue[stop+1] in permittedChar) and (stop < length(aValue)) do
  begin
    Inc (stop)
  end;

Mytext:= Copy (aValue, start+1, stop - start );

jfheins 5. Jan 2009 16:45

Re: Text durchsuchen
 
Aber da hat er schon recht, es wäre besser, wenn du die beiden Abfragen vertauschen würdest.

Also so:
Delphi-Quellcode:
start := at-1;
while (start > 0) and (aValue[start] in permittedChar) do
begin
  Dec (start)
end;
stop := at;
  while (stop < length(aValue)) and (aValue[stop+1] in permittedChar) do
  begin
    Inc (stop)
  end;

Mytext:= Copy (aValue, start+1, stop - start );
Und schlate ruhig die Bereichsprüfung ein ;)

P.S. "funktioniert nicht" ist irgendwie ne doofe Fehlerbeschreibung ;)

Thomas F 5. Jan 2009 17:12

Re: Text durchsuchen
 
Zitat:

Zitat von jfheins

P.S. "funktioniert nicht" ist irgendwie ne doofe Fehlerbeschreibung ;)

...mit dem Code hab ich wieder diesselben Probleme.
An die Email wird noch ein Anführungszeichen gehängt, wenn ich ein Zeichen abziehe ,
dann fehlt manchmal wieder ein Zeichen :gruebel:
Ich habs x-mal getestet, der Code oben ist der einzige , bei dem alles funkt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:28 Uhr.
Seite 2 von 3     12 3      

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