Problem bei der String-Verarbeitung

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Problem bei der String-Verarbeitung

Beitrag von pascalts »

Hallo!

Ich möchte einen String aus einer Zeile einer TStringList bearbeiten, genauer, ich möchte ab einer bestimmten Position (die ich vorher bestimmt habe) alle Zeihen entfernen, den String quasi abschneiden. Dazu habe ich versucht Delete zu nutzen:

Code: Alles auswählen

Delete(FolgeGelesen[line], positionS1, length(FolgeGelesen[line]));


FolgeGelesen[line] ist meine Zeile, aus der ich die Anfangsposition ermittelt habe und in der das Ende entfernt werden soll. "positionS1" ist die Position, "length(FolgeGelesen[line])" das Ende des Strings. Leider erhalte ich beim compillieren folgende Meldung:

Code: Alles auswählen

usrc.pas(56,45) Error: Can't take the address of constant expressions


Diese Zeigt auf den String (also FolgeGelesen[line]). Habt ihr einen Tipp?

Grüße!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Problem bei der String-Verarbeitung

Beitrag von m.fuchs »

Du musst eine Stringvariable benutzen, in die du die Zeile kopierst, bearbeitest und dann wieder zurück in die StringList schreibst:

Code: Alles auswählen

 s := FolgeGelesen[line];
Delete(s, positionS1, length(s));
FolgeGelesen[line] := s;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Problem bei der String-Verarbeitung

Beitrag von pascalts »

m.fuchs hat geschrieben:Du musst eine Stringvariable benutzen, in die du die Zeile kopierst, bearbeitest und dann wieder zurück in die StringList schreibst:

Code: Alles auswählen

 s := FolgeGelesen[line];
Delete(s, positionS1, length(s));
FolgeGelesen[line] := s;


Okay, das geht auch. Habe mittlerweile durch Zufall eine andere Lösung gefunden, die direkter geht:

Code: Alles auswählen

FolgeGelesen[line]:=Copy(FolgeGelesen[line], 1 , positionS1-1);                      //Den relevanten Teil herauskopieren   

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Problem bei der String-Verarbeitung

Beitrag von pascalts »

Eine andere Sache: Kann man mit einem Simplen befehl testen, ob in FolgeGelesen[line] ein string vorkommt? Also mehr als nur ein Buchstabe... Ich suche beispielsweise nach ';FOLD', bisher also immer mit mehreren Abfragen buchstabenweise durchgegangen, das scheint mir aber wenig intelligent... :shock:

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Problem bei der String-Verarbeitung

Beitrag von baumina »

AnsiPos bzw. Pos
.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Problem bei der String-Verarbeitung

Beitrag von m.fuchs »

Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Problem bei der String-Verarbeitung

Beitrag von pascalts »

Danke!

Ich wusste gar nicht, dass das auch mit einem String geht, habe immer nur einen Char genommen.

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Problem bei der String-Verarbeitung

Beitrag von pascalts »

So... nun möchte ich einen leeren String löschen:

Code: Alles auswählen

if length(FolgeGelesen[line])=0 then // also wenn die Länge null ist
            begin
               //ShowMessage('Line ' + inttostr(line) + ' muss weg.');
               FolgeGelesen.Delete(line-1);
            end;         


Leider bekomme ich beim ausführen die Meldung "index out of Bounds". Wo liegt mein denkfehler?

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Problem bei der String-Verarbeitung

Beitrag von baumina »

Warum -1?
.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Problem bei der String-Verarbeitung

Beitrag von m.fuchs »

Da brauch mal wohl mehr Quellcode um etwas genaues zu sagen. Was ist zum Beispiel line?
Ich vermute mal eine Zählvariable, die hochgezählt wird. Das ist beim Durchführen von Löschoperationen nicht empfehlenswert. Du musst die Variable herunterzählen lassen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Problem bei der String-Verarbeitung

Beitrag von Komoluna »

oder

Code: Alles auswählen

i := 0;
while i < sl.Count do
begin
 Irgendwas;
  if length(sl.Strings[i])=0 then
    sl.Delete(i)
  else
    Inc(i);
end;
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Problem bei der String-Verarbeitung

Beitrag von pascalts »

Ich hab über das "Problem" nochmal genau nachgedacht. Also wurde das am Ende so:

Code: Alles auswählen

FolgeGelesen[line]:=TrimRight(FolgeGelesen[line]);                     //Alle nicht lesbaren Zeichen von Rechts entfernen
              if length(FolgeGelesen[line])=0 then                                   //String leer?
                begin
                   FolgeGelesen.Delete(FolgeGelesen.count-1);                        //Dann String löschen
                   line:=line-1;                                                     //--> da Zeile mit String verschwindet!
                end;


Damit habe ich wieder alles schön in einer Zeile <3

Danke euch! Ich stoße hier im Forum immer auf super Ideen und Denkanstöße. Dazu seid Ihr echt noch ziemlich schnell! Deswegen vielleicht kurz zu mir: Ich bin Dualer Student bei einem großen deutschen Elektronikkonzern. Da ich in den Semesterferien "nur" Azubi bin, bekomme ich Aufgaben die Dokumentationen zu erstellen. Da ich aber faul bin und die Dokumentation immer das selbe, habe ich mich mit meinem Chef kurzgeschlossen und automatisiere den ganzen Prozess der Dokumentaion. Eigentlich läuft schon alles, doch ich finde meinen Code zu unsauber, deswegen räume ich seit ein paar Tagen eben diesen auf, um die Performance und die Übersichtlichkeit zu verbessern.

Was mich geritten hat, in Free Pascal zu schreiben? Ich weiss es auch nicht. Vermutlich die kinderleichte Möglichkeit der Erstellung einer GUI und die Stille Hoffnung, dass wenn mein Programm auch auf Linux läuft (was es tut, sogar sehr gut) es auch dort mal genutzt wird...

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Problem bei der String-Verarbeitung

Beitrag von mschnell »

>> Delete(FolgeGelesen[line], positionS1, length(FolgeGelesen[line]));

Wenn FolgeGelesen ein "Array of String" ist, sollte das gehen.

-Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Problem bei der String-Verarbeitung

Beitrag von m.fuchs »

mschnell hat geschrieben:Wenn FolgeGelesen ein "Array of String" ist, sollte das gehen.


pascalts hat geschrieben:Ich möchte einen String aus einer Zeile einer TStringList bearbeiten
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten