in AnsiString nach \n\r suchen um Zeilenanzahl zu ermitteln



  • ela schrieb:

    den Code vom Peter hab ich bei mir eingefügt, allerdings den Zweiten Til nicht in eine Funktion ausgelagert.

    Wieso nicht? Ist doch optimal für eine Funktion....

    Ansonsten äh, ja, _WAS_ funktioniert denn nicht? Was passiert beim durchsteppen?

    Was deine zweite Frage anbelangt.. das wirst du doch jetzt hoffentlich selbst hinkriegen oder? strcmp kennst du?

    -junix



  • @ junix:

    ich habs nicht ausgelagert, weil ich es erstmal testen will und schauen muss, wie ich das gesamte am besten hinbekomme, lauft es und ich kann die Funktion nutzen und vielleicht noch etwas abändern, dann wirds ausgelagert.

    Okay, also strcmp kenn ich. Da kann man zwei Strings miteinander vergleichen, du meinst also, ich solle test mit "Name" vergleichen? Und dann? In Test steht immer mehr drin wie nur "Name" ??? Ich weiß nicht auf was du hinaus willst, ich glaub ich hab nen Brett vorm Kopf.



  • ela schrieb:

    ich habs nicht ausgelagert, weil ich es erstmal testen will und schauen muss, wie ich das gesamte am besten hinbekomme, lauft es und ich kann die Funktion nutzen und vielleicht noch etwas abändern, dann wirds ausgelagert.

    Was spricht dagegen, einfach die Funktion zu verwenden? Wieso erst den Code in das Listing eingliedern und dann wieder in eine Funktion ausgliedern? Peters Code ist eigentlich eine typische - eigenständige Funktion, wieso nicht einfach so belassen? Ich rieche Spaghetti-Code...

    ela schrieb:

    Okay, also strcmp kenn ich. Da kann man zwei Strings miteinander vergleichen, du meinst also, ich solle test mit "Name" vergleichen? Und dann? In Test steht immer mehr drin wie nur "Name" ??? Ich weiß nicht auf was du hinaus willst, ich glaub ich hab nen Brett vorm Kopf.

    Du weisst doch, wie lang der String ist den du suchst? Also einen Teilstring extrahieren, vergleichen, gut is... Ausser Peter hat mal wieder ne schnellere Lösung...

    -junix



  • Hab zwischendurch mal schnell was zusammengeschustert:

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    	int linecount;
    	AnsiString str;
    
    	str="Zeile1\tZeile2\tEla\nZeile3\tZeile4\t";
    
    	linecount=CountTabs(str.c_str(), "Ela");
    
    	ShowMessage(linecount);
    }
    //---------------------------------------------------------------------------
    int TForm1::CountTabs(char *str, char *termstr)
    {
    	register int lents=strlen(termstr);
    	register char *p;
    	register int tabs=0;
    
    	for(p=str; *p!=0; p++)
    	{   if(!strncmp(p, termstr, lents))
    			break;
    		if(*p=='\t')
    			tabs++;
    	}
    	return tabs;
    }
    

    @junix
    Über das Thema AnsiString und Pointer hatten wir uns ja auch schon mal früher unterhalten, gell 🙂
    In Punkto Forentreff, wenn es in der Stuttgarter Gegend stattfinden sollte und Du auch dabei bist wäre die Möglichkeit groß, daß ich da auch hinkomme. AndreasW habe ich inzwischen schon kennengelernt, allerdings nicht auf einem Forentreff sondern der Roadshow zum BuilderX 😉



  • Stimmt... strncmp hiess das Ding... ich wusste doch da gabs was (o:

    @Peter: Ne das ist auf Höhe Frankfurt (o: Aber ich fahr eh in Stuttgart vorbei, da könnte ich dich mitnehmen (o;

    -junix



  • Auch auf die Gefahr hin, mich hier sehr beliebt zu machen, will ich Euch
    meinen Vorschlag nicht vorenthalten.
    Als Freund der TStringList würde ich das ganze so lösen:

    TStringList* slTemp = new TStringList();
      slTemp->Text = help;
      int anzZeilen = slTemp->Count;
    

    Ob das allerdings auch funktioniert, wenn nur "\n" anstatt "\r\n" verwendet
    wird, weiß ich nicht. Leerzeilen werden natürlich auch mitgezählt.

    Nur mal so als Anregung.

    Gruß,

    Alexander



  • Abgesehen vom Problem, dass ja offensichtlich \t und nciht \r\n der Delimiter ist, hat die Idee natürlich auch was für sich... man könnte auch TStringList::CommaText verwenden (o: Aber wenn du nur Zeilen zählen willst, dann finde ich die StringList etwas äh Overkill...

    -junix



  • junix schrieb:

    Abgesehen vom Problem, dass ja offensichtlich \t und nciht \r\n der Delimiter ist

    Wieso offensichtlich? Wenn ich mir mal die Überschrift dieses Threads anschaue
    (und dabei den Dreher "\n\r" ignoriere) und einen Ausschnitt aus einem Posting
    von ela:

    ela schrieb:

    Ich habs im Moment so:

    ...
      if(help.Pos("\r\n") != 0)  //help beinhaltet den Clipboardinhalt
    

    Da könnte bei mir schon der Eindruck entstehen, als ob "\r\n" gesucht werden
    soll.

    junix schrieb:

    Aber wenn du nur Zeilen zählen willst, dann finde ich die StringList etwas äh Overkill...

    Deshalb ja auch meine kleines "Vorwort". Dennoch spricht schon was dafür, vor-
    gefertigte und (offensichtlich) bewährte Funktionen zu verwenden. Sicherlich
    gibt's da effizienteres als die Verwendung einer TStringList. Der Dreizeiler
    ist wesentlich überschaubarer und damit weniger fehleranfällig als eine selbst-
    geschriebene Routine mit for-Schleife (auch wenn die nicht wirklich kompliziert
    ist). Und falls man vielleicht die einzelnen Zeilen noch irgendwie weiterver-
    arbeiten will, bietet sich eine Stringliste vielleicht ohnehin an?

    Gruß,

    Alexander



  • OK, offensichtlich war vielleicht der falsche Ausdruck (o: Im Laufe des Threads stellte sich dies aber heraus.

    Was das Weiterverarbeiten betrifft: Sicherlich hast du recht. War an dieser Stelle allerdings nicht gefragt. Naja egal. Beide Lösungen haben ihre Vor- und Nachteile. Der grösste Nachteil an der StringList ist das leider etwas langsame ObjectPascal das hinter den Algorithmen steht.

    -junix



  • Jou, man könnte hergehen, mit StringReplace alle '\t' durch Komma ersetzen und per CommaText in die TStringList lutschen. Dann Zeile für Zeile durchzählen bis zu dem begrenzenden Textteil ... oder so ähnlich. Wäre auch eine Möglichkeit 🙄



  • Peter schrieb:

    Jou, man könnte hergehen, mit StringReplace alle '\t' durch Komma ersetzen [...]

    Naja, es gibt ja auch noch DelimitedText. Damit läßt sich das etwas eleganter
    lösen.

    Gruß,

    Alexander



  • Guten Morgen,

    vielen Dank für eure Hilfe, ich werd den Code vom Peter nachher gleich mal testen.
    Um nochmal deutlich zu sagen und alle Zweifel zu zerstören, die Thread Überschrift stimmt, das war das was ich gesucht habe, da ich aber die Funktion vom Peter gut finde, und ich nicht nur die Zeilen die im Clipboard stehen brauche, sondern dann auch die Anzahl der Tabs hab ich den Thread auf dieses Problem ausgeweitet.

    Also nochmal vielen Danke 🙂 👍


Anmelden zum Antworten