Strukurierung von Schleifen und Abfragen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Strukurierung von Schleifen und Abfragen

Beitrag von Maik81ftl »

Moin moin,

Wenn ich den Bekannten ReadString zum Auslesen einer Textzeile anwende, habe ich Diesmal das kleine Problem, das keine werte übernommen werden, bzw nur ein wert der kompletten Liste.

Da ich a) nur max 255 Zeilen zulassen will, habe ich den Zähler auf diesen wert angesetzt, ergo diese SChleife kommt zum Einsatz.

Code: Alles auswählen

for Count:= 1 to 255 do
        begin
        fStringList.Add(ReadString(s, 'UserList'+intToStr(Count), ''));
        end;
kann es sein, das ich da einen kleinen Denkfehler auf dem leim gegangen bin???

HIer zur verdeutlichung die vollständige Function.

Code: Alles auswählen

function TUser.GetUserList: TStringlist;
var s: String;
    Count: Byte;
begin
  fFilename:= Format('%s%s', [fPath, fExt2+'.'+fList]);
  if FileExists(fFilename) then begin
    // Userliste Laden
    S:= Format('%s', [fList]);
    Temps:= S;
    with TIniFile.Create(fFilename) do try
{      repeat
            inc(Count)
      until ;}
      for Count:= 1 to 255 do
        begin
        fStringList.Add(ReadString(s, 'UserList'+intToStr(Count), ''));
        end;
      finally
        Free;
      end;
    end;
  Result:= fStringList;
end;
wenn alle Stricke reisen sollten, muß ich ggf auf eine Repeat Until-Schleife gehen nur überleg ich da schon, wie ich den Rückgabe des ReadString auswerte.

Hier noch zur Manuellen Durchspielen das listung, welche gelesen werden soll.
  • [[UserList]]
  • UserList1=Maxim Mustermann
  • UserList2=Maik Geßner
Edit!*

Habe gerade mal die function Wie folgt umgeschrieben auch mit meinem Lieblinggebugger. ^^

Code: Alles auswählen

function TUser.GetUserList: TStringlist;
var s: String;
    Count: Byte;
begin
  Count:= 0;
  fFilename:= Format('%s%s', [fPath, fExt2+'.'+fList]);
  if FileExists(fFilename) then begin
    // Userliste Laden
    S:= Format('%s', [fList]);
//    Temps:= S;
    with TIniFile.Create(fFilename) do try
      repeat
            fStringList.Add(ReadString(s, 'UserList'+intToStr(Count), ''));
            inc(Count);
            until fStringList[Count] = '';
      TempS:= fStringList[Count] + IntToStr(Count);
{      for Count:= 1 to 255 do
        begin
        fStringList.Add(ReadString(s, 'UserList'+intToStr(Count), ''));
        end;}
      finally
        Free;
      end;
    end;
  Result:= fStringList;
end;
und was sehe ich??? er liest nur die Maxim Mustermann aus. Verstehe wer will ich nicht.
Zuletzt geändert von Maik81ftl am Do 7. Apr 2011, 18:05, insgesamt 2-mal geändert.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ReadString läd keine Werte

Beitrag von pluto »

stellt mal Count auf 1 nicht auf 0.

edit01: Für den Fall würde ich nicht ReadString nutzen. Es gibt da noch eine andere Methode um ganze Sektionen einzulesen. *G*. Ich verrate aber mal nicht wie diese Methode von TIniFile heißt.
MFG
Michael Springwald

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: ReadString läd keine Werte

Beitrag von Maik81ftl »

pluto hat geschrieben:stellt mal Count auf 1 nicht auf 0.

edit01: Für den Fall würde ich nicht ReadString nutzen. Es gibt da noch eine andere Methode um ganze Sektionen einzulesen. *G*. Ich verrate aber mal nicht wie diese Methode von TIniFile heißt.
Den count = 1 habe ich auch schon versucht. nur wurde da kein wert übertragen...
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ReadString läd keine Werte

Beitrag von pluto »

Das Problem ist die Abbruch Bedienung. Deine Liste fängt mit 1 an. D.H. muss Count auch mit 1 Anfangen.
Speicher einfach die Anzahl mit Ab und lese sie zuerst ein und starte dann eine Forschleife. Wenn du ReadSec(...) nicht einsetzten möchte.
Es gibt wie gesagt, Methoden, die können ganze Sektionen in einer Stringlist einlesen.
MFG
Michael Springwald

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: ReadString läd keine Werte

Beitrag von Maik81ftl »

pluto hat geschrieben:Das Problem ist die Abbruch Bedienung. Deine Liste fängt mit 1 an. D.H. muss Count auch mit 1 Anfangen.
Speicher einfach die Anzahl mit Ab und lese sie zuerst ein und starte dann eine Forschleife. Wenn du ReadSec(...) nicht einsetzten möchte.
Es gibt wie gesagt, Methoden, die können ganze Sektionen in einer Stringlist einlesen.
Glaube das Übel gefunden zu haben...

Grade mal den wert aus der ComboBox gelöscht, um zu sehen, was er überhaupt macht. nach kleiner änderung des Wertes war auch dieser wert weg. ergo vermutlich mal ein fehler in der Datenverwaltung...

Denkste. :S

Code: Alles auswählen

function TUser.GetUserList: TStringlist;
var s: String;
    Count: Byte;
begin
  fStringList2:= TStringList.Create;
  Count:= 0;
  fFilename:= Format('%s%s', [fPath, fExt2+'.'+fList]);
  if FileExists(fFilename) then begin
    // Userliste Laden
    fStringlist2.LoadFromFile(fFileName);
    S:= Format('%s', [fList]);
    with TIniFile.Create(fFilename) do try
      for Count:= 1 to FStringList2.Count do  // fStringList2.Count = 3
        begin
        fStringList.Add(ReadString(s, 'UserList'+intToStr(Count), '')); fStringList[0] = 'Maxim Mustermann'; fStringList[1] = ???
        end;
//      ReadSection(s, fStringList);
      TempS:= IntToStr(fStringList2.Count) + ' <|> ' + fStringList[1];
      finally
        Free;
      end;
    end;
  Result:= fStringList;
end;
Nach Letzter Auswertung der Zeile

Code: Alles auswählen

TempS:= IntToStr(fStringList2.Count) + ' <|> ' + fStringList[0];
hab ich erst mal rausgefunden, das das File insgesammt 3 Zeilen enthält. der Rückgabewert in fStrinlist[0] ist wie es auch sei Soll

Code: Alles auswählen

Maxim Mustermann
, jedoch sollte in der Zeile fStringList[1] noch ein wert stehen, aber dieser wird einfach verschluckt, so wie ich es sehe.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: ReadString läd keine Werte

Beitrag von Maik81ftl »

Bild Bild Bild, Grade nur mal aus Spaß einen weiteren User in mein Progi eingeführt und was sehe ich??? das lsiting schaut nun ganz anders aus.
  • [[UserList]]
  • UserList1=Maxim Mustermann
  • UserList5=Karl Heinz Schmidt
Das erklärt nun mal schon einiges...

Edit!*

und ich glaube mit dieser erkenntnis, kann ich getrost eine repeat until schleife fahren. muß diese halt nur richtig progen...
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: ReadString läd keine Werte

Beitrag von MAC »

Maik81ftl hat geschrieben:

Code: Alles auswählen

for Count:= 1 to FStringList2.Count do  // fStringList2.Count = 3
        begin
        fStringList.Add(ReadString(s, 'UserList'+intToStr(Count), '')); fStringList[0] = 'Maxim Mustermann'; fStringList[1] = ???
        end;
was ich nicht verstehe, 1. was hat das "fStringList[0] = 'Maxim Mustermann'; fStringList[1] = ???" dort zu suchen ? ist das nur komentar ?
wieso du von 1 to Count gehst.
denn eigendlich würde ich nur bis Count-1 gehen und von 0 beginnen...

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: ReadString läd keine Werte

Beitrag von Maik81ftl »

MAC hat geschrieben:
Maik81ftl hat geschrieben:

Code: Alles auswählen

for Count:= 1 to FStringList2.Count do  // fStringList2.Count = 3
        begin
        fStringList.Add(ReadString(s, 'UserList'+intToStr(Count), '')); fStringList[0] = 'Maxim Mustermann'; fStringList[1] = ???
        end;
was ich nicht verstehe, 1. was hat das "fStringList[0] = 'Maxim Mustermann'; fStringList[1] = ???" dort zu suchen ? ist das nur komentar ?
wieso du von 1 to Count gehst.
denn eigendlich würde ich nur bis Count-1 gehen und von 0 beginnen...
ok erwischt. Die zeile, die du so schön beschrieben hast ist ein Nachträglicher Komentar, den ich mal manuell durchgespielt habe, zugegeben "//" vergessen

Aber ich glaube mal, das was u.a. dich verunsichert ist der Count. zum einen als Rückgabewert vom TStringlist.Count und denne noch die Zählvariable.

fStringList2.Count liefert die Anzahl der Zeilen innerhalb eines Dokumentes daher fange ich bei Count := 1 an, was aber auch wiederum nicht an der Tatsache ändert, das fStringList.add an erster stelle immer bei "0" anfängt zu schreiben.
Aber hast recht! der Lokale Count irritiert hier wirlich.

ändern aber in erster Linie nix daran, das der Übertäter wo ganz anders lag. nun nur noch die Speicher routine so ändern, das alle Leerzeilen gelöscht werden dann ist das Fast Perfekt.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: ReadString läd keine Werte

Beitrag von MAC »

count iritiert, aber was ich meine ist trozdem:

FStringList2.Count liefert 3 zurück --> 3 einträge, der niedrigste eintrag ist eintrag nr 0 und der höchste ist eintrag nr 2.
ok , ich sehe gerade , es ist kein fehler, wenn du es auch vorher so gespeichert hast, totzdem sollte man die dann auch unter UserList0 , 1 und 2 speichern :)

übrigens, ich weis nicht genau wie sich das Count verhält, denn davor steht noch

Code: Alles auswählen

with TIniFile.Create(fFilename) do
Und TIniFile hat bestimmt auch ein Count oder ? :D

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: ReadString läd keine Werte

Beitrag von Maik81ftl »

MAC hat geschrieben:count iritiert, aber was ich meine ist trozdem:

FStringList2.Count liefert 3 zurück --> 3 einträge, der niedrigste eintrag ist eintrag nr 0 und der höchste ist eintrag nr 2.
ok , ich sehe gerade , es ist kein fehler, wenn du es auch vorher so gespeichert hast, totzdem sollte man die dann auch unter UserList0 , 1 und 2 speichern :)
wenn ich mir analog die Set anschaue, speichere ich den 1ten UserList auch mit 1 ab. ergo würde eine null auf jeden mind. unseren Lieblingsfehler bringen.
MAC hat geschrieben:übrigens, ich weis nicht genau wie sich das Count verhält, denn davor steht noch

Code: Alles auswählen

with TIniFile.Create(fFilename) do
Und TIniFile hat bestimmt auch ein Count oder ? :D
Also in der Verwendetes Class hab ich keines gefunden, Selber hab ich da auch keines zugewiesen.

Aber um es ggf Besser zu erkennen, wie ich das Handhabe, post i ma die Class und die beiden Routinen

Code: Alles auswählen

TUser = class
    FFilename,
    FPath,
    fList,
    FExt,
    fExt2,
    fName,
    fLastname,
    TempS,
    fGeburtstag  : String;
    fGroesse,
    fGewicht,
    fBMI         : real;
    fProgSet     : TProgSet;
    fStringList,
    fStringlist2 : TStringList;
    fUser        : T_User;
  private
    function GetUser: T_User;
    function GetUserList: TStringList;
    function GetColor: TProgSet;
  public
    constructor Create;
    destructor Done;
    procedure SetUser(User: T_User);
    Procedure SetUserList(sValue: TStringList);
    procedure SetColor(Progset: TProgSet);
    property User: T_User read GetUser write SetUser;
    property UserList: TStringList read GetUserList write SetUserList;
    property Farben: TProgSet read GetColor write SetColor;
  end;
 
function TUser.GetUserList: TStringlist;
var s: String;
    Count: Byte;
begin
  fStringList2:= TStringList.Create;
  Count:= 0;
  fFilename:= Format('%s%s', [fPath, fExt2+'.'+fList]);
  if FileExists(fFilename) then begin
    // Userliste Laden
    fStringlist2.LoadFromFile(fFileName);
    S:= Format('%s', [fList]);
    with TIniFile.Create(fFilename) do try
      for Count:= 1 to FStringList2.Count do
        begin
        fStringList.Add(ReadString(s, 'UserList'+intToStr(Count), ''));
        end;
//      ReadSection(s, fStringList);
      TempS:= IntToStr(fStringList2.Count) + ' <|> ' + fStringList[1];
      finally
        Free;
      end;
    end;
  Result:= fStringList;
end;
 
Procedure TUser.SetUserList(sValue: TStringList);
var s: String;
    Count: Byte;
    sValue2: TStringList;
begin
  sValue2:= TStringList.Create;
  sValue2:= sValue;
  // Eventuelle Leerzeilen löschen
//  for Count:= 1 to sValue.Count do
//    if sValue[Count-1] <> '' then sValue2.Add(sValue[Count-1]);
  fFilename:= Format('%s%s', [fPath, fExt2+'.'+fList]);
  TempS:= fFileName;
  if fFileName <> '' then
    begin
    if FileExists(fFilename) then DeleteFile(fFileName);
    s := Format('[%s]', [fList]);
    with TIniFile.Create(fFileName) do try
    For Count:= 1 to sValue2.Count do
      begin
      WriteString(s, fList+IntToStr(Count), sValue2[Count-1]);
      end;
    finally
      Free;
    end;
    end;
end;
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: ReadString läd keine Werte

Beitrag von Maik81ftl »

Hab das mal gerade mit einer Seperaten Befehlszeile und mit der Papier + Stift Methode durchgespiel.

Die schleife schaut dahingehen nun so aus.

Code: Alles auswählen

for Count:= 1 to FStringList2.Count do
        begin
        fStringList.Add(ReadString(s, 'UserList'+intToStr(Count), ''));
        TempS:= TempS + ' | '+ IntToStr(Count) + ' <|> ' + fStringList2[Count-1];
        end;
in dem String TempS steht der wert selbst sowie der Aktuelle Zählwert und die komplette Zeile der file drin.

wie ich rausgefunden habe scheint der Fehler direkt in der

Code: Alles auswählen

fStringList.Add(ReadString(s, 'UserList'+intToStr(Count), ''));
zu liegen.
Dahingehen Frage ich mich gerade allen Erstes, ob ich zu doof bin einen FunctionsString richtig zuzuweisen.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: ReadString läd keine Werte

Beitrag von shokwave »

Mein Tipp wäre die Property NICHT mit dem laden/speichern der Datei zu mixen. Guck dir mal TListbox an, wie es dort mit den Items gelöst wurde.
mfg Ingo

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: ReadString läd keine Werte

Beitrag von Maik81ftl »

shokwave hat geschrieben:Mein Tipp wäre die Property NICHT mit dem laden/speichern der Datei zu mixen. Guck dir mal TListbox an, wie es dort mit den Items gelöst wurde.
du meinst, das diese zeile

Code: Alles auswählen

property UserList: TStringList read GetUserList write SetUserList;
das Problem verursacht?
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: .[Gelöst] ReadString läd keine Werte

Beitrag von Maik81ftl »

ich sach ja... zum Scheißen zu Dähmlich bin.

Code: Alles auswählen

S:= Format('[%s]', [fList]);

Code: Alles auswählen

S:= Format('%s', [fList]);
ein kleiner einfacher und Fataler Fehler, mit Riesen wirkung.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: ReadString läd keine Werte

Beitrag von shokwave »

Maik81ftl hat geschrieben:du meinst, das diese zeile

Code: Alles auswählen

property UserList: TStringList read GetUserList write SetUserList;
das Problem verursacht?
Jain, ich hätte gedacht, dass

Code: Alles auswählen

Result:= fStringList;
nicht funktioniert.
BTW: Ein fStringList2.Free fehlt da auch noch irgendwo.
mfg Ingo

Antworten