Autor Beitrag
Gerhard_S
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Di 16.12.08 13:16 
Um einen String (HTML-Code) zu ändern, verwende ich folgenden
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 186
Erhaltene Danke: 2



BeitragVerfasst: Di 16.12.08 16:17 
Hallo,
du kannst dir deine
Ausgabe durch
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Di 16.12.08 17:36 
Den Code zum Ansehen des Ergebnisses hatte ich bewusst weggelassen. Hier ist er:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Di 16.12.08 18:21 
Hi!
Seit wann ist denn so etwas möglich? :shock:
Das habe ich ja noch nie gesehen:
ausblenden Delphi-Quelltext
1:
for clstr in BigStr do					

Handelt es sich dabei um eine Neuerung bei Delphi?

Gruß,
Marc
Gerhard_S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: 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":
ausblenden volle Höhe 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;
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 18.12.08 19:29 
Man muss ja nicht alle Neuerungen nutzen ;)