Delphi-PRAXiS

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 13:29


bis zu einem bestimmten zeichen suchen?
 
hallo delphipraxis :hi:

wie kann ich in einem string der beispielsweise
'1 2 3 4 5'
es hinbekommen dass ich bei 1 anfange bis zu einem bestimmten zeichen, zum beispiel 3, zu suchen?

mit AnsiPos hab ich es nicht hinbekommen

Nuclear-Ping 15. Nov 2007 13:31

Re: bis zu einem bestimmten zeichen suchen?
 
Delphi-Quellcode:
for a := 1 to Length (String) do
  if (String[a] = DeinZeichen) then
    Gefunden;

SirThornberry 15. Nov 2007 13:31

Re: bis zu einem bestimmten zeichen suchen?
 
am einfachsten geht es mit pos (wobei ansipos ebenso einfach funktionieren sollte). Wenn du es nicht hinnbekommst sage einfach wie du es versucht hast und wir sagen dir was daran falsch ist :)

Nuclear-Ping 15. Nov 2007 13:34

Re: bis zu einem bestimmten zeichen suchen?
 
So wie ich es verstanden habe, will er "ab ..." suchen, bzw. hat das vor. Bei Pos / AnsiPos müsste er den String danach trimmen, damit die Funktionen nicht wieder vom Anfang an starten.

shadow999 15. Nov 2007 13:35

Re: bis zu einem bestimmten zeichen suchen?
 
ok. danke.

ist das selbe auch möglich mit zb.
wenn ich einen string mit
'ABCDEF' habe

von A bis D zu suchen?

SirThornberry 15. Nov 2007 13:36

Re: bis zu einem bestimmten zeichen suchen?
 
ja, es geht mit beliebigen zeichen.

shadow999 15. Nov 2007 13:41

Re: bis zu einem bestimmten zeichen suchen?
 
"for a := 'A' to Length(String) do"

das mit dem length(string) stört mich etwas..

denn in meinem programm weis man ja nicht, wielang dieser string ist odr sein kann.

SirThornberry 15. Nov 2007 13:43

Re: bis zu einem bestimmten zeichen suchen?
 
stop - versuche den Quelltext zu verstehen. Die schleife muss immer von 1 los laufen. Schließlich willst du ab dem ersten zeischen sucben und nicht ab dem Aaaten.

shadow999 15. Nov 2007 13:45

Re: bis zu einem bestimmten zeichen suchen?
 
for a := 1 to 4 do

ok.. aber das kann ich ja schlecht nehmen denn man weis ja nicht
wielang der string nun ist..

da ist noch ein problem.

der sucht dann aber, wenn irgentwo im text A steht, nicht ab dem A sondern ab der aller ersten position im memo.

SirThornberry 15. Nov 2007 13:48

Re: bis zu einem bestimmten zeichen suchen?
 
genau. Mit der Funktion Length kannst du aber die länge des Strings ermitteln.
Wenn dein String also von 1 bis Length(DeinString) geht und dein String 5 zeischen lang ist geht die Schleife von 1 bis 5.

Schaue dir am besten mal auf http://www.dsdt.info/grundlagen/ die Grundlagen an.

[Edit]
Wenn du ab dem A und nicht ab dem ersten A suchen willst musst du trotzdem das erste A finden damit du weißt ab wo du suchen musst
[/Edit]

shadow999 15. Nov 2007 13:49

Re: bis zu einem bestimmten zeichen suchen?
 
genau das ist ja das problem
- die länge des strings ist unbekannt.

also ich meine, es gibt eigentlich keinen string er soll ja in einem memo suchen.

SirThornberry 15. Nov 2007 13:51

Re: bis zu einem bestimmten zeichen suchen?
 
Memo1.lines.Text ist ein String.
Delphi-Quellcode:
var
  deinstring: String;
begin
  deinstring := memo1.lines.text;
aber wie bereits erwähnt würde ich dir die Grundlagen nahe legen. Ohne die wirst du nicht weit kommen.

shadow999 15. Nov 2007 18:22

Re: bis zu einem bestimmten zeichen suchen?
 
ich glaube ihr versteh mich nicht :(

angenommen das folgende ist mein text IM memo von oben nach unten:

A
B
C
DE
F
GH
I
J

So.. er sollte dann bei DE anfangen zu suchen bis er auf GH stößt, alles dazwischen ist nicht wichtig

DeddyH 15. Nov 2007 18:28

Re: bis zu einem bestimmten zeichen suchen?
 
Du redest die ganze Zeit von String und meinst TStrings.

[edit] Was willst Du denn "suchen"? [/edit]

shadow999 15. Nov 2007 18:33

Re: bis zu einem bestimmten zeichen suchen?
 
Zitat:

Zitat von DeddyH
[edit] Was willst Du denn "suchen"? [/edit]

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.

anmerkung: ich habe keinen string, ich habe demnach auch keine exakte länge eines strings.
nur inhalt im memo der immer unterschiedlich ist.

DeddyH 15. Nov 2007 18:35

Re: bis zu einem bestimmten zeichen suchen?
 
Ich meinte, was möchtest Du als Ergebnis? Den Index des gefundenen Eintrags?

shadow999 15. Nov 2007 18:38

Re: bis zu einem bestimmten zeichen suchen?
 
aso letztendlich geht es nur um die letzten zwei bis drei buchstaben bzw. zeichen.

DeddyH 15. Nov 2007 18:42

Re: bis zu einem bestimmten zeichen suchen?
 
Sry, vielleicht bin ich ein bisschen begriffsstutzig. Zeig doch mal ein Beispiel mit Deinem Memo und was Du genau haben möchtest.

shadow999 15. Nov 2007 18:46

Re: bis zu einem bestimmten zeichen suchen?
 
ok. sagen wir mal das da unten ist ein memo
und unten ein button:

----------------------------------------------
A
B
C
DE
F
GH
I
J
----------------------------------------------

--------
*Suchen
--------


sogar mit rahmen damit man es erkennt.

klickt man auf *suchen sollte er das memo erstmal durchsuchen
bis er "DE" gefunden hat. hat er "DE" gefunden, soll er von da aus
weiter suchen, aber nur bis er auf "GH" trifft.

DeddyH 15. Nov 2007 18:48

Re: bis zu einem bestimmten zeichen suchen?
 
Und als Ergebnis soll F herauskommen?

shadow999 15. Nov 2007 18:56

Re: bis zu einem bestimmten zeichen suchen?
 
erm... ergebnis sollte "GH" sein.

ich bin grad dran da eine funktion zu schreiben.
aber mein problem ist es ab "DE" zu suchen.
ab dem ersten zeichen im memo zu suchen geht ja, aber aber "DE" und dann von "DE" bis "GH" kriege ich nicht hin :oops:

Sharky 15. Nov 2007 19:00

Re: bis zu einem bestimmten zeichen suchen?
 
Ich verstehe zwar nicht wofür es gut ist.... aber das passiert mir ja öfters.
Du möchtest also wissen ob:
  1. DE in der StringListe vorhanden ist
  2. GH in der StringListe ist
  3. nur ein Positives ergebniss wenn GH nach DE kommt und DE vorhanden ist

Also einfach .IndexOf("DE") und IndexOf("GH) ermitteln. Wenn der erste <>-1 und kleiner als der zweite ist hast Du es.

DeddyH 15. Nov 2007 19:03

Re: bis zu einem bestimmten zeichen suchen?
 
Obwohl ich die Aufgabenstellung immer noch nicht ganz verstanden habe:
Delphi-Quellcode:
var start, ende, i: integer;
begin
  start := Memo.Lines.IndexOf('DE');
  ende := -1;
  if (start > -1) then
    begin
      i := start;
      while (i < Memo.Lines.Count - 1) and (ende < 0) do
        begin
          inc(i);
          if Memo.Lines[i] = 'GH' then
            ende := i;
        end;
    end;
end;
Kann man zwar alles mit IndexOf machen, aber Du musst ja wissen, was Du willst.

shadow999 15. Nov 2007 19:13

Re: bis zu einem bestimmten zeichen suchen?
 
ich habe mir das mal angeguckt.
dieser code gibt die zeilennummer aus in der zb. F gefunden wurde.
"A
B
C
DE
F // 5
GH
I
J"

Das mit dem IndexOf habe ich zwar verstanden aber funktionniert quasi genau so wie das oben.
naja also das klappt alles nicht so richtig :(
eigentlich sollte "GH" ausgegeben werden

shadow999 15. Nov 2007 19:31

Re: bis zu einem bestimmten zeichen suchen?
 
Edit:

habe nochmal ü+berlegt das ist rausgekommen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i, x, StartPos, Ende: Integer;
Text: String;
begin
Text := Memo1.Lines.Text;

for i := 1 to Length(Text) do
 begin
  if (Text[i] = 'D') then
    begin
     StartPos := i;
     Caption := '1. Schleife: '+IntToStr(i);

       for x := StartPos to Length(Text) do
        if (Text[x] = 'F') then
          begin
           Caption := '2. Schleife: '+Copy(Text, x, 1);
          end;
    end;
 end;
So.. das ist die grundidee, denke ich.

Nur was nicht funktioniert ist zb.
(Text[x] = 'GH') ..

marabu 15. Nov 2007 19:49

Re: bis zu einem bestimmten zeichen suchen?
 
Hallo,

du bemühst dich zwar dein Problem programmtechnisch zu beschreiben, aber bevor du das sauber hinkriegst, musst du noch viel lernen. Deshalb ist es besser, wenn du dein Problem nicht als Programmierer, sondern als Anwender zu beschreiben versuchst. Es ist für den benötigten Programmcode ein gewaltiger Unterschied, ob du in einem oder mehreren Strings suchst. Die ganzen Feinheiten, die dein Problem vollständig beschreiben würden, kannst du mit deinem Wissensstand nicht sehen. Wenn du dich dann noch bemühst, die eigentliche Problemspäre zu verschleiern, dann wird dein Thread auf eine unangenehme Weise sehr spannend.

Was steht in dem Memo? Welche Bedeutung hat der Inhalt? Was hast du vor?

Freundliche Grüße vom marabu

shadow999 15. Nov 2007 19:58

Re: bis zu einem bestimmten zeichen suchen?
 
mit dem, dass ich das als anwender nicht ls programmierer erklären soll verstehe ich nicht.. egal.
verschleiern? was verschleiere ich denn? ok ich rede klartext:

ich habe einen text.. einen html text den ich von einer url aus hole.

diesen code möchte ich überprüfen lassen und beispielsweise alle
image-tags, zum beispiel der hier: <img alt="text" title="text">

in solche umwandeln:
<img alt="text" title="text" />

dafür müsste ich erstmal "<img" suchen. von da aus ginge es vortan drum bis zum nächsten ">" weiterzusuchen.
das ">" würde dann durch " />" ersetzt.

für mich zum "visualisieren" habe ich folgendes zurecht geschnitten:
Delphi-Quellcode:
for i := 1 to Length(Text) do
 begin
  if (Text[i] = 'd') then
    begin
     StartPos := i;
     TestMemo.Lines.Add('1. Schleife: "'+IntToStr(i)+'"');

       for x := StartPos to Length(Text) do
        if (Text[x+1] = 'f') then
          begin
           TestMemo.Lines.Add('1. Schleife: "'+Copy(Text, x, 2)+'"');
          end;
    end;
 end; // die TestMemos sind dafür da um alle inhalt festhalten zu können
damit sehe ich z.b.: "aha.. d fängt da und da an und f fängt da und da an.

d und f wären demnach <img und >

Progman 15. Nov 2007 20:06

Re: bis zu einem bestimmten zeichen suchen?
 
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.

taaktaak 15. Nov 2007 20:12

Re: bis zu einem bestimmten zeichen suchen?
 
Moin, Moin,
habe mir nicht alles bis zum letzten Punkt durchgelesen, aber warum machst du das nicht mit TRichEdit, da gibt es eine Methode FindText, die ist eigentlich ganz simpel anzuwenden ...
Gruß Ralph

Progman 15. Nov 2007 20:15

Re: bis zu einem bestimmten zeichen suchen?
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i, p: Integer; z: String;
begin
  for i:= 0 to Memo1.Lines-1 do begin
    z:=Memo1.Lines[i]; //Zeile aus Memo holen
    p:=Pos('<img',z);
    inc(p,4); //'<img' übergehen
    while z[p] <> '>' do inc(p); //p bleibt auf Position von '>' stehen
    Insert(' /',z,p);
    Memo1.Lines[i]:=z; //Zeile wieder zurück ins Memo
  end;
end;
Ungetestet, aber so müsste es klappen, vorausgesetzt, der img-Tag ist auch komplett in einer Zeile.

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 04:43 Uhr.

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