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); 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
Narses: 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); 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 ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!