Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Zeilen in einem String zählen (https://www.delphipraxis.net/168164-zeilen-einem-string-zaehlen.html)

lbccaleb 8. Mai 2012 15:25

Zeilen in einem String zählen
 
Gefunden habe ich erstmal das:

http://www.delphipraxis.net/51285-ze...trahieren.html

Das ist so schon ganz fein, allerdings Blick ich den Code noch nicht 100%ig.
Ich habe es so umgemodelt:

Delphi-Quellcode:
function CountStringLines(const S: AnsiString): Integer;
var i, i2, i3, i4: Integer;
  begin;
    Result := 0;
    i := 1; i2 := 1; i3 := 1;
    while i <= Length(S) do begin
      if i2 <= i then begin i2 := PosEx(#13, S, i); if i2 = 0 then i2 := Length(S) + 1; end;
      if i3 <= i then begin i3 := PosEx(#10, S, i); if i3 = 0 then i3 := Length(S) + 1; end;
      if i2 < i3 then i4 := i2 else i4 := i3;

      i := i4;
      if (i <= Length(S)) and (S[i] = #13) Then Inc(i);
      if (i <= Length(S)) and (S[i] = #10) Then Inc(i);
      Inc(Result);
    end;
  end;
Das scheint erstmal so zu funktionieren, wie es soll.
Nun ist mein Problem eigenltich nur, ob man es so machen kann wie ich es Umgebaut hab. Nicht das in bestimmten Fällen irgendwas unvorhergesehenes passiert, da ich nicht wirklich weis, was ich da getan hab muss ich zugeben :shock:

Vllt kann himitsu ja dazu was genaueres sagen :)

p80286 8. Mai 2012 15:35

AW: Zeilen in einem String zählen
 
Wenn in Deinem String Kein CRLF vorhanden ist, dann bekommt i4 keinen Wert, und das könnte unangenehm werden.

Und ich würde die vielen Is mit etwas aussagekräftigeren Namen versehen.

Gruß
K-H

DeddyH 8. Mai 2012 15:37

AW: Zeilen in einem String zählen
 
Mehrere Befehle in einer Zeile sind ja auch nicht der Hit im Bezug auf Lesbarkeit.

p80286 8. Mai 2012 15:41

AW: Zeilen in einem String zählen
 
[OT]
Du kennst doch bestimmt noch die Zeitungen, die ein komplettes TP-Programm als 4 Zeiler abgedruckt haben? [/OT]

Gruß
K-H

DeddyH 8. Mai 2012 15:44

AW: Zeilen in einem String zählen
 
[OT] 1 Kilo Byte? Kenn ich noch :) [/OT]

Klaus01 8. Mai 2012 15:47

AW: Zeilen in einem String zählen
 
.. sollte das Problem denn nicht auch mit einer TStringList zu erschlagen sein.

Delphi-Quellcode:
function CountStringLines(const S: AnsiString): Integer;
var
  sl: TStringList; // nachträglich eingefügt
begin
  result := 0;
  sl := TStringList.create;
  try
    sl.Text := s;
    result := sl.count;
  finally
    sl.free;
  end;
end;

Iwo Asnet 8. Mai 2012 16:13

AW: Zeilen in einem String zählen
 
Oder den hier
Delphi-Quellcode:
Function CountCRLF (Const aString : String) : Integer;
Var
  i : Integer;
Begin
  Result := 0;
  For i:=1 to Length(aString)-1 do
    if (aString[i]=#13) and (aString[i+1]=#10) then
      inc(Result);
End;

himitsu 8. Mai 2012 16:22

AW: Zeilen in einem String zählen
 
Du hast deine Variablendeklaration vergessen, aber notfalls kann man auch die Variable einfach weglassen.
Delphi-Quellcode:
function CountStringLines(const S: String): Integer;
begin
  with TStringList.Create do
    try
      Text := S;
      Result := Count;
    finally
      Free;
    end;
end;

function CountStringLines(const S: String): Integer;
begin with TStringList.Create do try Text:=S; Result:=Count; finally Free; end; end;
Aber wenn es auf Geschwindigkeit und Speicherverbraucht drauf ankommt, dann geht der Trick mit der Stringliste nicht wirklich,
denn da mußt du mit einigen Speicheroperationen (speicher für die Liste und vorallem die Strings reservieren + Freigeben) und dazu ist mit mindestens nochmals 100% des Stringsspeichers zu rechnen. (bei einem TStream als Quelle anstatt einem String, sogar mit locker zusätzlichen 300%)

Delphi-Quellcode:
function CountLines(const S: string): Integer;
var
  P: PChar;
begin
  if S <> '' then begin
    Result := 1;
    P := PChar(S);
    while P^ <> #0 do begin
      if P^ = #13 then begin
        Inc(Result);
        if (P + 1)^ = #10 then
          Inc(P);
      end else if P^ = #10 then
        Inc(Result);
      Inc(P);
    end;
  end else
    Result := 0;
end;

Klaus01 8. Mai 2012 16:27

AW: Zeilen in einem String zählen
 
Zitat:

Zitat von himitsu (Beitrag 1165399)
Du hast deine Variable vergessen.

habe ich eingefügt, danke.

Zitat:

Zitat von himitsu (Beitrag 1165399)
Aber wenn es auf Geschwindigkeit und Speicherverbraucht drauf ankommt, dann geht der Trick mit der Stringliste nicht wirklich,
denn da mußt du mit einigen Speicheroperationen (speicher für die Liste und vorallem die Strings reservieren + Freigeben) und dazu ist mit mindestens nochmals 100% des Stringsspeichers zu rechnen. (bei einem TStream als Quelle anstatt einem String, sogar mit locker zusätzlichen 300%)

stimme ich Dir zu, aber schön lesbar ist es mit der StringList schon.

Grüße
Klaus

Aphton 8. Mai 2012 16:31

AW: Zeilen in einem String zählen
 
Ich persönlich finde es absolut hässlich, auch wenn es unheimlich gut lesbar ist! Es ist, so wie Himitsu es beschrieben hat, zu ressourcenlästig!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 Uhr.
Seite 1 von 3  1 23      

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