Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - String zur Laufzeit mit for-in-Schleife ändern


Gerhard_S - Di 16.12.08 13:16
Titel: String zur Laufzeit mit for-in-Schleife ändern
Um einen String (HTML-Code) zu ändern, verwende ich folgenden

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
BigStr:= Memo1.Text;
clstr := 'class=';
p := 1;
k := PosEx(clstr, BigStr, p);
n := Length(clstr);
for clstr in BigStr do
      begin
      Insert('"', BigStr, k+n);
      o := PosEx('>', BigStr, k+n); //erstes Auftreten von '>' nach 'class='
      Insert('"', BigStr, o);
      end;

Leider tut er nicht das, was ich will: Bei jedem Auftreten von 'class=' den nachfolgenden Text bis zum '>' in Hochkommata zu setzen - zwecks Erfüllung der W3C-Anforderungen. Stattdessen habe ich nach dem Durchlauf eine große Anzahl von Hochkommata vor und nach dem nachfolgenden Text. Ahnt jemand, woran das liegt?

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


martin300 - Di 16.12.08 16:17

Hallo,
du kannst dir deine
Ausgabe durch

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
for clstr in BigStr do
      begin
      Insert('"', BigStr, k+n);
      o := PosEx('>', BigStr, k+n); //erstes Auftreten von '>' nach 'class='
      Insert('"', BigStr, o);
      memo1.Lines.Add(bigstr);
      end;

end;

hinzufügen der Ausgabe in memo1 ansehen. Alternativ gibt es noch einen
Haltepunkt der mit der Taste F5 gesetzt wird. So solltest du
das programmierte Verhalten sehen.


Gerhard_S - Di 16.12.08 17:36

Den Code zum Ansehen des Ergebnisses hatte ich bewusst weggelassen. Hier ist er:

Quelltext
1:
2:
3:
Memo1.Text := BigStr;
Memo1.Update;
Memo1.SelStart:= 0;

Doch das ist nicht das Thema - es geht darum, wie die for-in-Schleife arbeitet. Ich habe den Eindruck, dass es Unterschiede zu Microsofts for each ... next gibt. Leider ist die Online-Hilfe dazu ziemlich trivial.


Marc. - Di 16.12.08 18:21

Hi!
Seit wann ist denn so etwas möglich? :shock:
Das habe ich ja noch nie gesehen:

Delphi-Quelltext
1:
for clstr in BigStr do                    

Handelt es sich dabei um eine Neuerung bei Delphi?

Gruß,
Marc


Gerhard_S - Di 16.12.08 18:35

Ich benutze BDS 2006. For Element in Container gibt's seit Delphi 2005. Es unterscheidet sich wohl ganz erheblich von for each ... next. Ich habe die Online-Hilfe noch mal genauer gelesen und verstanden, dass immer nur die kleinsten Elemente im Container durchgegangen werden. Bei einem String sind das die Characters. D.h., bei der Suche nach Substrings ist diese Funktion nutzlos.


Gerhard_S - Do 18.12.08 19:26

Hier die didaktisch leicht verschönerte komplette Prozedur zur Erreichung des Ziels "Finde den String 'class=' im String, setze ein erstes Doppelhochkomma hinter das Gleichheitszeichen und ein zweites Doppelhochkomma hinter den auf das Gleichheitszeichen folgenden Begriff. Das Begriffsende ist durch ein > markiert":

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure TForm1.Button3Click(Sender: TObject); 
var i1, i2, cntr, o, p: integer; BigStr, Substr: string;
begin
BigStr:= Memo1.Text;
Substr := 'class=';
Label1.Caption := 'Gefunden an Position:' ;
i1 := 1;
i2 := 1;
cntr := 0;
if  Pos(Substr,BigStr) > 0 then
  begin
    while i1 > 0 do
     begin
      i1 := PosEx(SubStr,BigStr,i2);
      if i1 > 0 then
                begin
                Label1.Caption := Label1.Caption + ' '+IntToStr(i1);
                i2 := i1 +1; //reduziert Zahl der Schleifendurchläufe
                Inc(cntr);
                p := i1 + Length(Substr);
                Insert('"', BigStr, p);
                o := PosEx('>', BigStr, p);
                if o > 0 then Insert('"', BigStr, o);
                end;
     end;
  end;
Label2.Caption := 'Zahl der Fundstellen: '+IntToStr(cntr);
Memo1.Text := BigStr;
Memo1.Update;
Memo1.SelStart:= 0;
end;


Delete - Do 18.12.08 19:29

Man muss ja nicht alle Neuerungen nutzen ;)