![]() |
Delphi-Version: 10 Seattle
"Pos" findet String wegen Einrückung nicht
Es geht um folgende Code, in dem "Pos" einfach einen String in einer StringList finden und die gefundene Stelle als Integer zurückgeben soll.
Delphi-Quellcode:
Über dem gefundenen String (String ist in der benötigten Datei als Kommentar hinterlegt) wird ein neuer Text eingefügt. Geschrieben wird das ganze in eine .pas. Wenn ich den Kommentar am Anfang der Zeile schreibe, macht der Code auch was er soll. Eigentlich sollte der Kommentar aber "ordentlich formatiert" mit Einrückungen in der Zeile stehen. In diesem Fall wird er aber nicht mehr gefunden.
var
sList: TStringList; Index: integer; begin sList := TStringList.Create; Result := -1; sList := TStringList.Create; sList.LoadFromFile(FileName); for Index := 0 to sList.Count do if Pos(SearchText, sList.Strings[Index]) > 0 then begin Result := Index; sList.Free; Exit; end else ShowMessage('Einstiegspunkt wurde nicht gefunden.'); sList.Free; end; Hat da jemand eine Idee? Und gibt es eine Möglichkeit die "Einrückungen" in einer Zeile als Integer wieder zu bekommen, um einzufügenden Code vorher schon zu formatieren? |
AW: "Pos" findet String wegen Einrückung nicht
Entschuldigung, der Code sieht so aus.... :
Delphi-Quellcode:
var
sList: TStringList; Index: integer; begin sList := TStringList.Create; try sList.LoadFromFile(FileName); Index := sList.IndexOf(SearchText); if Index > -1 then begin Result := Index; end else ShowMessage('Text nicht in ausgewaehlter Datei vorhanden.'); finally sList.Free; end; end; |
AW: "Pos" findet String wegen Einrückung nicht
Sollte ein String 'BlaBlaBla' in einer Zeile (Stringlist[i]) enthalten sein so kommt
Delphi-Quellcode:
mit einem Wert >0 zurück!
pos
Suchst Du nach 'blaBlaBla' und enthalten ist 'Blablabla' dann kommt 0 zurück! Einrückungen haben da keinen Einfluß darauf! Gruß K-H P.S. Was denn nun
Delphi-Quellcode:
oder
pos
Delphi-Quellcode:
da gibt es kaum bemerkbare aber wichtige Unterschiede!
.Indexof
|
AW: "Pos" findet String wegen Einrückung nicht
[/s].. du prüfst ja auch ob der SearchText am Zeilenanfang steht.
Liefert pos nicht -1 wenn nichts gefunden wurde?[s] Eventuell mal über die Benutzung von regex nachdenken. Bei IndexOf kommt es auf die Groß-Kleinschreibung an. IndexOf prüft meines Wissens auch nur ob der gesamte Zeileninhalt dem SearchText entsprictht Grüße Klaus |
AW: "Pos" findet String wegen Einrückung nicht
Ich habe eine .txt-Datei zum testen. Hier steht der Kommentar am Anfang der Zeile. Hier funktioniert alles wunderbar.
In meiner .pas-Datei steht der Kommentar eben mit Einrückungen in einer Zeile. Hier wird der Text nicht gefunden. Ich verstehe das nicht :| Wenn ich den Kommentar übrigens in der .pas-Datei an den Anfang der Zeile setze wird er gefunden und es funktioniert! |
AW: "Pos" findet String wegen Einrückung nicht
|
AW: "Pos" findet String wegen Einrückung nicht
Wie Klaus01 schon sagt.
Versuche mal in deiner Testdatei den Text auch einzurücken (in der es vorher funktionierte) und sieh die das Ergebnis an. Ich denke für "IndexOf" ist es dann einmal der String mit Einrückung " text" und ohne Einrückung "text". Somit unterscheidet sich dein Ergebnis dementsprechend. Du müsstest dann vermutlich die Einrückung weg trimmen oder anders berücksichtigen (so wie gerade zwischenzeitlich auch erwähnt). |
AW: "Pos" findet String wegen Einrückung nicht
Käme Trim() für dich in Frage?
Delphi-Quellcode:
if Pos(SearchText, Trim(sList.Strings[Index])) > 0 then
|
AW: "Pos" findet String wegen Einrückung nicht
Zitat:
![]() ![]() |
AW: "Pos" findet String wegen Einrückung nicht
Ich würde bei einer verschönerten Variante der ersten geposteten Funktion bleiben und Pos benutzen. Das IndexOf funktioniert in dem von die beschriebenen Szenario nicht.
|
AW: "Pos" findet String wegen Einrückung nicht
Zitat:
"Trim" hat übrigens auch nichts geholfen. TrimLeft auch nicht. Wenn ich es in der Textdatei einrücke, wird es da auch nicht mehr gefunden. |
AW: "Pos" findet String wegen Einrückung nicht
Zitat:
|
AW: "Pos" findet String wegen Einrückung nicht
Zitat:
|
AW: "Pos" findet String wegen Einrückung nicht
Delphi-Quellcode:
Also, wenn der Suchbegriff erst in der zweiten Zeile steht, klappt das schon nicht mehr.
var
sList: TStringList; Index: integer; begin sList := TStringList.Create; Result := -1; sList := TStringList.Create; sList.LoadFromFile(FileName); // for Index := 0 to sList.Count do // Falsch for Index := 0 to sList.Count-1 do if Pos(SearchText, sList.Strings[Index]) > 0 then begin Result := Index; sList.Free; Exit; end else ShowMessage('Einstiegspunkt wurde nicht gefunden.'); sList.Free; end; Deswegen bist du auch der Meinung, dass IndexOf besser funktioniert. Aber dort bekommst du Probleme, wenn du mit Einrückungen (führenden Leerzeichen) arbeitest. Meine Prüfung sähe so aus, wenn ich deinen Stil beibehalte:
Delphi-Quellcode:
Der Unterschied ist, dass ich nicht in der Schleife prüfe, ob der Einstiegspunkt falsch ist, sondern nach der Schleife prüfe, ob ein gültiges Ergebnis vorliegt.
var
sList: TStringList; Index: integer; begin sList := TStringList.Create; Result := -1; sList := TStringList.Create; sList.LoadFromFile(FileName); for Index := 0 to sList.Count-1 do if Pos(SearchText, sList.Strings[Index]) > 0 then begin Result := Index; sList.Free; //Exit; Das ist natürlich falsch Break; sList.Free; if Result = -1 then ShowMessage('Einstiegspunkt wurde nicht gefunden.'); end; |
AW: "Pos" findet String wegen Einrückung nicht
Zitat:
Sieht bei mir jetzt so aus:
Delphi-Quellcode:
Danke an alle.
var
sList: TStringList; Index: integer; begin sList := TStringList.Create; Result := -1; sList := TStringList.Create; sList.LoadFromFile(FileName); for Index := 0 to sList.Count do begin if Pos(SearchText, sList.Strings[Index]) <> 0 then begin Result := Index; sList.Free; Exit; end end; ShowMessage('Einstiegspunkt wurde nicht gefunden.'); sList.Free; end; |
AW: "Pos" findet String wegen Einrückung nicht
Ändere das bitte noch so:
Delphi-Quellcode:
var
sList: TStringList; Index: integer; begin sList := TStringList.Create; Result := -1; sList := TStringList.Create; sList.LoadFromFile(FileName); // for Index := 0 to sList.Count do Das ist auch falsch for Index := 0 to sList.Count-1 do begin if Pos(SearchText, sList.Strings[Index]) <> 0 then begin Result := Index; sList.Free; Break; // Nicht Exit! end end; ShowMessage('Einstiegspunkt wurde nicht gefunden.'); sList.Free; end; |
AW: "Pos" findet String wegen Einrückung nicht
...aber bitte mit try-finally wie in
![]() |
AW: "Pos" findet String wegen Einrückung nicht
Irgendwie kommt mir das aber alles unsauber vor. Wieso wird die Stringlist 2x erzeugt und frei gegeben, das passt doch alles nicht.
Delphi-Quellcode:
var
sList: TStringList; Index: integer; begin Result := -1; sList := TStringList.Create; try sList.LoadFromFile(FileName); for Index := 0 to sList.Count-1 do begin if Pos(SearchText, sList.Strings[Index]) <> 0 then begin Result := Index; Break; end end; //Das Folgende hab ich mal drin gelassen, aber eigentlich //gehört das z.B. in die aufrufende Prozedur verlagert if Result=-1 then ShowMessage('Einstiegspunkt wurde nicht gefunden.'); finally sList.Free; end; end; |
AW: "Pos" findet String wegen Einrückung nicht
Da ist eindeutig ein TStringList.Create/.Free zuviel drin!
So müsste das aussehen (nicht getestet):
Delphi-Quellcode:
begin
Result := -1; sList := TStringList.Create; try LTst := LowerCase(Trim(SearchText)); for i := 0 to sList.Count-1 do begin if Pos(LTst, LowerCase(sList[i])) > 0 then begin Result := i; Break; end; end; finally sList.Free; end; // If Result < 0 then ShowMessage('Einstiegspunkt wurde nicht gefunden.'); end; |
AW: "Pos" findet String wegen Einrückung nicht
PS:
![]() ![]() ![]() Zitat:
0, wenn nichts gefunden, und 1, wenn doch, da 1-basierender Index. Bei IndexOf isses natürlich anders, denn -1, wenn nichts gefunden, und 0, wenn doch, da 0-basierender Index. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz