AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi [TStringlist/string] Position => Zeile
Thema durchsuchen
Ansicht
Themen-Optionen

[TStringlist/string] Position => Zeile

Ein Thema von _frank_ · begonnen am 5. Feb 2009 · letzter Beitrag vom 6. Feb 2009
Antwort Antwort
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#1

[TStringlist/string] Position => Zeile

  Alt 5. Feb 2009, 18:08
Moin,
gibt es eine Möglichkeit aus der Zeichen-Position in TStringlist.Text an die Zeilennummer heranzukommen?
klar könnte ich die Zeilenumbruch-Zeichen rückwärts zählen, aber vielleicht gibt es eine einfachere/schnellere Variante.

Gruß Frank
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#2

Re: [TStringlist] Position => Zeile

  Alt 5. Feb 2009, 18:38
Hallo,

meinst du vielleicht:

Delphi-Quellcode:
for i := 0 to Pred(StringList.Count) do
  ShowMessage(StringList.Strings[i]);
also diesen Part:
StringList.Strings[i]
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: [TStringlist] Position => Zeile

  Alt 5. Feb 2009, 18:42
Hallo Frank,

du könntest es mit dieser Funktion versuchen:

Delphi-Quellcode:
function LineIndexFromCharIndex (
           const aString : string;
           const aCharIndex : Integer
         ) : Integer;
begin
  with TMemo.CreateParented(HWND(HWND_MESSAGE)) do
    try
      Text := aString;
      Result := SendMessage(Handle, EM_LINEFROMCHAR, aCharIndex, 0);
    finally
      Free;
    end;
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#4

Re: [TStringlist] Position => Zeile

  Alt 5. Feb 2009, 19:12
@Helmi:
Prinzipiell brauche ich das i aus deinem Beispiel.

Sinn und Zweck des ganzen ist, dass ich nach einer Textsuche die Zeile haben möchte, in der der Teilstring gefunden wurde. ich könnte zwar Zeilenweise suchen, aber wenn der gesuchte Text zeilenübergreifend ist, wird dieser nicht gefunden.

@Hawkeye
daran hatte ich auch schon gedacht, wollte aber ungern die VCL bzw. Windows-Controls dazu misbrauchen.

Gruß Frank
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#5

Re: [TStringlist] Position => Zeile

  Alt 5. Feb 2009, 19:14
und das:

i := StringList.IndexOf(S) ?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#6

Re: [TStringlist] Position => Zeile

  Alt 5. Feb 2009, 19:19
schau dir mal Hawkeyes code an...der dürfte das machen...

ich hab ne position, sagen wir 200 (ermittelt mittels pos(ex)&co) in nem string...dieser String hat zeilenumbrüche und ich weise das daher einfach mal einer stringliste zu (evtl. wird das auch nicht benötigt).
wie gesagt, ich könnte mittels

Delphi-Quellcode:
line:=0;
for i:=200 downto 1 do
begin
  if s[i]=#13 then inc(line);
end;
die zeilenende-zeichen zählen, aber vielleicht geht das ja auch eleganter

Gruß Frank
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: [TStringlist] Position => Zeile

  Alt 5. Feb 2009, 19:21
Zitat von Helmi:
und das:

i := StringList.IndexOf(S) ?
..funktionier nur dann, wenn der gesuchte Text mit der gesammten Zeile übereinstimmt.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Sereby

Registriert seit: 31. Mär 2008
91 Beiträge
 
#8

Re: [TStringlist/string] Position => Zeile

  Alt 6. Feb 2009, 09:22
sowas hab ich mir auch mal programmiert:
Delphi-Quellcode:
function TStringsHelper.GetLineByPos(const MyPosition: Integer): Integer;
var
  I,Line: Integer;
begin
  Result := -1;
  if (MyPosition = -1) then Exit;

  Line := 0;
  I := 1;
  while I < MyPosition do
  begin
    if (Text[I] = #13) then Line := Line + 1;
    I := I + 1;
  end;
  Result := Line;
end;
das ganze habe ich bei delphi 2009 in einen classhelper gepackt aber kannst es ja leicht umschreiben, dass es bei einer per parameter übergebenen stringlist sucht
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: [TStringlist/string] Position => Zeile

  Alt 6. Feb 2009, 09:55
Hallo,

versuch' es mal damit:
Delphi-Quellcode:
Function PosToLine(sl : TStrings;
                   sSearchText : String) : Integer;
Var
          iPos : Integer;
          iStart : Integer;
          iEnde : Integer;
          s : String;
begin
  // Position des gesuchten Textes ermitteln.
  iPos := Pos(sSearchText,sl.Text);
  // Von dieser Position rückwärts den vorherigen Zeilenvorschub suchen.
  iStart := iPos;
  Repeat
    Dec(iStart);
  Until sl.Text[iStart] = #10;
  // Wir brauchen die Position hinter dem vorherigen Zeilenvorschub.
  Inc(iStart);
  // Von der Postion der gesuchten Zeichenfolge aus den nächsten Zeilenvorschub suchen.
  iEnde := iPos;
  Repeat
    Inc(iEnde);
  Until sl.Text[iEnde] = #13;
  // Die Zeichenfolge zwischen vorherigem und folgenden Zeilenvorschub holen.
  s := Copy(sl.Text,iStart,iEnde - iStart);
  // Die Zeile mit der Zeichenfolge suchen und den Index zurückgeben.
  Result := sl.IndexOf(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(PosToLine(Memo1.Lines,Edit1.Text)));
end;
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#10

Re: [TStringlist/string] Position => Zeile

  Alt 6. Feb 2009, 15:51
nahpets Lösung finde ich schon originell, ist aber um einiges langsamer als die Zählvariante (copy).
sereby's variante ist ähnlich meiner, da kommt mir aber gerade die idee, evtl pos(ex) mit einzuspannen...

so mal die messergebnisse (queryPerformanceCounter, gettickcount hat nicht gereicht):
frankw:34
sereby:34
sereby_pos:52
sereby_var:40
hawkeye:8352
nahpets:37050

wie man erkennt, sind sereby's und meine variante die schnellsten, danach serebys-variante mit var-parameter für s und danach die pos/posex-variante. irgendwann kommen dann die letzten beiden

für genauere messinfos hab ich mal das benchmark-programm angehängt.

Danke für die Antworten

//edit
hab das mal noch in µs/ms umgerechnet (mess-programm aktualisiert, gleich noch paar Fehler rausgemacht ):
frankw:7µs
sereby:7µs
sereby_pos:12µs
sereby_var:7µs
hawkeye:2,573ms
nahpets:11,478ms

da seh ich gerade, dass hawkeyes Version scheinbar falsch ist (249). die anderen Ergebnisse musste ich nur um 1 inkrementieren (position 5000 wäre zeile 109).

Gruß Frank
Angehängte Dateien
Dateityp: zip postoline_benchmark_161.zip (127,1 KB, 29x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 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