Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringReplace (https://www.delphipraxis.net/93112-stringreplace.html)

warefare 31. Mai 2007 23:18


StringReplace
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich bin neu hier :)
Habe eigentlich nur im Informatikunterricht mit delphi gearbeitet aber nu wo ich
mein Abi habe da brauche ich es doch schon wieder *g*

Konkret zu meinem Problem:
Ich habe ein kleines Tool geschrieben mit dem man gewisse Abschnitte aus einem Text ersetzen kann.


Um dies zu realisieren habe ich die Funktion StringReplace genutzt.. das funktioniert soweit auch super.
Allerdings klappt es nicht wenn die variable "replace" ( = replace_item.text ) wie in dem bild zu sehen eine eckige klammer
hat.
siehe unten, neues problem

Da ich für ein Forum aus einer Tabelle "post_text" alte BBCodes entfernen muss à la "[img:width:height]
muss ich unbedingt eckige Klammern verwenden können.

fLaSh11 31. Mai 2007 23:20

Re: StringReplace und eckige Klammern
 
bei den ReplaceFlags ein rfIgnoreErrors einfügen?!

warefare 1. Jun 2007 02:37

Re: StringReplace und eckige Klammern
 
Zitat:

Zitat von fLaSh11
bei den ReplaceFlags ein rfIgnoreErrors einfügen?!

Ich habe bereits "rfIgnoreCase" ausprobiert .. rfIgnoreErrors gibts doch gar net oder sollte das ein scherz sein ;o

Hier mal die den "Convert Click" .. vllt sieht einer den Fehler:

Variablen
Code:
procedure TForm1.convertClick(Sender: TObject);

var search_term, text, result, del_to_sign, replace, del_string :string;
n, del_to_sign_pos, speicher, i, position, del_to_sign_pos_real:integer;
Eingaben
Code:
begin
search_term := trim(item.text) ;

if (text <> '' ) and (search_term <> '')
then
showmessage('Alles Ok !')

        else if (text = '' ) and (search_term = '')
        then
        showmessage('Eingaben überprüfen!');
Repeat Schleife
Code:

n := richedit1.Lines.Count;

repeat

//for n := 0 to richedit1.Lines.count-1 do begin
Zuweisung von Variabeln
Code:
 text := richedit1.Text ; //(richedit1.text, 0, length(richedit1.text));

begin

    if (delete_to_sign.text <> '')  then begin
    del_to_sign := trim(delete_to_sign.text);
    end;

    if (replace_with.text <> '')  then begin
    replace := trim(replace_with.text);
    end;

    Position:=Pos(search_term, text);
    del_to_sign_pos_real := (Pos(del_to_sign, text) ) ;
    del_to_sign_pos := (Pos(del_to_sign, text) - Position );

if bedingung

Code:
if ( position < del_to_sign_pos_real) AND (Pos(search_term, text) <> 0) then begin // Pos <> o wichtig !! da er sonst den anfang wieder löscht


     del_string := copy(text, position, (del_to_sign_pos)+1);

     s := StringReplace(richedit1.text, del_string, replace,[rfReplaceAll,rfIgnoreCase]);

     richedit1.text := s ;

end

  else if ( position > del_to_sign_pos_real) then begin

       del_to_sign_pos_real := (PosEx(del_to_sign, text, position) - Position);

       del_string := copy(text, position, (del_to_sign_pos_real)+1 );

       s := StringReplace(richedit1.text, del_string, replace,[rfReplaceAll,rfIgnoreCase]);

       richedit1.text := s ;

  //ShowMessage(inttostr(position)); ---> wenn nicht ausgeklammert dann klappt zumindest ein teil

  end;
Abbruchbedingung
Code:
    end;
                            //  end ;
 until (Pos(search_term, text) = 0);

   end;
komischerweise schmiert das programm nicht ab wenn ich eine "showmessage einbaue"
wenn ich diese aber auskommentiere dann schmiert er ab .. das gleiche bei den eckigen klammern
vllt ist die abbruchbedingung aber auch net so toll

edit: habe gerade noch rausgefunden, dass er mehr ersetzt als er soll wenn der string mit dem man ersetzen will länger ist als der eigentliche string den man überschreiben will

Sharky 1. Jun 2007 06:06

Re: StringReplace und eckige Klammern
 
Hai warefare,

ersteinmal: "Herzlich Willkommen in der Delphi-PRAXiS" :-D

Sei doch bitte so nett und hänge das Bild in deinem ersten Posting als Anhang an. Nicht jeder hat eine DSL-Leitung und möchte mehr als 70kByte laden müssen.

Klicke dafür einfach bei deinem ersten Posting auf den [EDIT] Button.

Danke :-D

warefare 1. Jun 2007 14:04

Re: StringReplace und eckige Klammern
 
Zitat:

Zitat von Sharky
Hai warefare,

ersteinmal: "Herzlich Willkommen in der Delphi-PRAXiS" :-D

Sei doch bitte so nett und hänge das Bild in deinem ersten Posting als Anhang an. Nicht jeder hat eine DSL-Leitung und möchte mehr als 70kByte laden müssen.

Klicke dafür einfach bei deinem ersten Posting auf den [EDIT] Button.

Danke :-D

Danke :)

Hmm da musst mir aber mal einen zeigen.. in einem Programmierer Forum sollte DSL eigentlich Standard sein.
Ich jedenfalls kenne keinen der noch mit nem 56K Modem rumeiert.


Werd mal sehen wie ich jetzt die Abbruch Bedingung überarbeiten kann..

Edit: Ok also es klappt alles aber wenn der "replace term" in etwa dem "search_term" ähnelt dann hat er probleme das nächste wort zu finden und ersetzt deshalb nur das erste Vorkommen.
Vllt muss ich nen counter doer so einbauen.


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