Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi bis zu einem bestimmten zeichen suchen? (https://www.delphipraxis.net/103413-bis-zu-einem-bestimmten-zeichen-suchen.html)

shadow999 15. Nov 2007 20:15

Re: bis zu einem bestimmten zeichen suchen?
 
Zitat:

ich würde so vorgehen:
Erst mal mit Pos('<img') die Position des img-Tags ermitteln, von da ab nach ">" suchen und an der Position von ">" einfach Insert(Zeile,Position,'/') machen.
geht meins denn auch so wie ich es gemacht habe?

zu folgendem ergebnis bin ich gekommen:

Delphi-Quellcode:
var
i, x, StartPos, Ende: Integer;
Text: String;
begin
Text := Memo1.Lines.Text;

for i := 1 to Length(Text) do
 begin
  if (Text[i] = '<') then
    begin
     StartPos := i;
     TestMemo.Lines.Add('1. Schleife: "'+Copy(Text, i, 4)+'"');
      // <img gefunden?
      if Copy(Text, i, 4) = '<img' then
        begin
         for x := StartPos to Length(Text) do
          if (Text[x] = '>') then
            begin
             TestMemo.Lines.Add('2. Schleife: "'+Copy(Text, x, 1)+'"');
            end;
        end;
    end;
 end;
end;

wer es testen will braucht: 2 memos.

tipps im memo1 folgendes ein:
[img][/img]
bei klick auf den button kommen 2 sachen ins TestMemo.
einmal <img und das zweite ist >

damit habe ich DAS schonmal geschafft.. von (schmetaisch) C bis E zu suchen..

mashutu 15. Nov 2007 20:28

Re: bis zu einem bestimmten zeichen suchen?
 
Zitat:

Zitat von shadow999
Angenommen im Memo stehen folgende Buchstaben wie folgt:
A
B
C
DE
F
GH
I
J

Dann möchte ich bei "DE" anfangen zu suchen. Wenn er dann bis auf GH stößt, soll er aufhören.
Also da drum gehts eigentlich, das Suchen von einer bestimmten stelle im text bis zu einer bestimmten stelle.

[untested ON]
Delphi-Quellcode:
function foo(sl:TStringList;AStart,AStop:String):tStringList; //result is NIL if nothing found
var
  sTmp : string;
  i,j,k : integer;
begin
  result:=TStringList.Create; //optimistic version
  i:=0;
  while i<sl.count do
  begin
    sTmp:=sl[i];                   //analyze a line
    k:=pos(AStart,sTmp);     //is there anything we are looking for?

    if k>0 then        
    begin                            //start found
      j:=i;                            //keep this for next search
      i:=sl.count;                 //more elegant than exit
      result.add(copy(sTmp,k,length(sTmp)); //include this into the result
    end;
   
    inc(i);                         //next line
  end;                             //of while construct

  if result.count>0 then    //did we find a start
  begin
    i:=j;
    while i<sl.count do
    begin
      sTmp:=sl[i];
      k:=pos(AStop,sTmp);

      if k>0 then
      begin
        i:=sl.count;          //exit this while construct
        result.add(copy(sTmp,1,k+length(AStop)-1); //
      end
      else
        result.add(sTmp);
   
      inc(i);
    end;//while
  end//AStart found
  else//otherwise we do not deliver any result
     FreeAndNil(result);
end;

Wenn Du nur ein Ergebnis haben willst, falls das Ende auch gefunden wurde muesstest Du noch zwei Zeilen einfuegen.
Hab das ganze jetzt nur mal schnell so hingetippert, weil ich auf diesem Rechner kein Delphi habe.
Es geht sicherlich eleganter/effizienter, aber das sollte auch einigermassen erlaeutern, was zu tun ist.

marabu 15. Nov 2007 20:30

Re: bis zu einem bestimmten zeichen suchen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Progman,

was machst du, wenn im HTML-Dokument ein solches Element auftaucht?

Code:
[img]assets/media.gif[/img]
Nachdenkliche Grüße

PS: Auch FindText() löst das Problem nicht viel besser als Pos()

Progman 15. Nov 2007 20:33

Re: bis zu einem bestimmten zeichen suchen?
 
dann nehm ich eben AnsiLowerCase und geb die Zeile dann als AnsiLowerCase(z) zurück, denn Tags sollen in Kleinschreibung sein ;)
Natürlich muss man in der Endversion noch Prüfungen einbauen, ob nicht /> schon korrekt da steht. Mein Beispiel sollte ja nur die etwaige Vorgehensweise zeigen.
Hier korrigierter Source:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i, p: Integer; z: String;
begin
  for i:= 0 to Memo1.Lines-1 do begin
    z:=LowerCase(Memo1.Lines[i]); //gleich in Kleinbuchstaben umwandeln :-)
    p:=Pos('<img',z);
    if p > 0 then begin
      inc(p,4); //'<img' übergehen
      while z[p] <> '>' do inc(p); //p bleibt auf Position von '>' stehen
      if z[p-1] <> '/' then Insert(' /',z,p);
      Memo1.Lines[i]:=z;
    end;
  end;
end;

Tommy1988 18. Nov 2007 00:12

Re: bis zu einem bestimmten zeichen suchen?
 
-
Editiert

shadow999 18. Nov 2007 02:05

Re: bis zu einem bestimmten zeichen suchen?
 
Ich habe da immernoch ein kleines Problem..

Undzwar folgendes:
Wenn der Cursor an der mit X markierten Stelle ist, funktioniert alles super..
ist der cursor aber irgentwo nach der mit Y markierten stelle gibts probleme.
Code:
<body"X">"Y"
// text text und mehr text
</body>
mein schlechter code:
(<body wird gefunden, kein problem. der rest .. naja)
Delphi-Quellcode:
for x := CurPosition-4 downto 0 do
begin
StartTag := Copy(SynMemo1.Text, x, 5);
 if StartTag = '<body' then
  begin
   iEndTag := PosEx('>', SynMemo1.Text, CurPosition);
    if iEndTag <> 0 then
      begin
       GetCaretPos(Point);
       bodyPopUp.Popup(Point.X+125, Point.Y+50);
       exit;
      end;
  end;
end;
eigentlich dachte ich sollte es so gehen:
Ab der cursorposition soll "<body " gesucht werden (rückwärts). ist es gefunden, gehts weiter in die schleife.

ich dachte ich suche mit PosEx bis ich ">" finde, ist es gefunden so wird ein popupmenu angezeigt.
da ist das problem: hat man den cursor aber hinter dem ">", also danach irgentwo (*), so wird zwar "<body" gefunden (logisch) aber es wird nicht drauf geachtet,
ob der cursor noch im "gültgen bereich" ist .. kann man da was machen?
mir fällt jetzt nix ein was sinn machen würde.

shadow999 18. Nov 2007 03:19

Re: bis zu einem bestimmten zeichen suchen?
 
ich hab es mal so probiert das eine abfrage stattfindet ob der cursor sich
zwischen p und p2 befindet mein code klappt aber niciht ganz

Delphi-Quellcode:
 
procedure TForm1.SynMemo1Change(Sender: TObject);
begin
 CurPosition := SendMessage(SynMemo1.handle,EM_LineIndex,Ln,0);
 CurPosition := SynMemo1.SelStart-CurPosition;
end;

 for i:= CurPosition downto 0 do
  begin
    z:=LowerCase(SynMemo1.Lines[i]); //gleich in Kleinbuchstaben umwandeln :-)
    p:=Pos('<img',z);
    if p > 0 then begin
      inc(p,4); //'<img' übergehen
      p2 := p;
      while z[p2] <> '>' do
       begin
       inc(p2); //p2 bleibt auf Position von '>' stehen
       end;
      if (CurPosition < p-2) and (CurPosition > p2-2) then
       begin
       // tue etwas
        Caption := 'Tue etwas';    // wird nicht angezeigt
       end;
      //
      SynMemo1.Lines[i]:=z;
    end;
  end;

shadow999 18. Nov 2007 12:33

Re: bis zu einem bestimmten zeichen suchen?
 
will mir keiner mehr helfen :idea: :cry:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 Uhr.
Seite 4 von 4   « Erste     234   

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