| Autor |
Beitrag |
Gerhard_S
      
Beiträge: 98
|
Verfasst: Di 16.12.08 13:16
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
      
Beiträge: 186
Erhaltene Danke: 2
|
Verfasst: 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 
      
Beiträge: 98
|
Verfasst: 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 16.12.08 18:21
Hi!
Seit wann ist denn so etwas möglich?
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 
      
Beiträge: 98
|
Verfasst: 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 
      
Beiträge: 98
|
Verfasst: 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":
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; |
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 18.12.08 19:29
Man muss ja nicht alle Neuerungen nutzen 
|
|
|