Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit If schleife ... (https://www.delphipraxis.net/10741-problem-mit-if-schleife.html)

sharkx 24. Okt 2003 11:55


Problem mit If schleife ...
 
Hallo, im folgenden Source lese ich eine Textdatei aus, bestimmte Strings möchte ich ( Wenn sie nicht schon in der ListView stehen ) in ein listView adden. Jedoch scheitere ich, warum auch immer *gg , an der abfrage ob dieser String schon geaddet wurde.


Delphi-Quellcode:
// logfile auf "[Time] [Tag] und String" durchsuchen
function ReadString(path : string) : string;
const
  searchstring = '[blaaaa] + bluuuub bluuuub:';      
var
  gefunden : boolean;
  list, newlist : TStrings;
  z1,datum,release : string;
  i,a,p1,p2 : integer;
begin
  list := TStringList.Create;
  newlist := TStringList.Create;
  list.LoadFromFile(path);

// Release parsen
  for i := 0 to list.Count-1 do
  begin
    p1 := Pos(searchstring,list[i]);
    if p1 = 0 then continue;

    z1 := list.Strings[i];
    p1 := Pos('[',z1);             // first Time String auslesen
    p2 := Pos(']',z1);             // last Time String auslesen

    datum := Copy(z1,p1+1,(p2-p1)-1);

    p1 := Pos(searchstring,z1);
    z1 := Copy(z1,p1+length(searchstring)+1,length(z1));

    p2 := Pos(' ',z1);

    release := Copy(z1,1,p2-1);

// Release schon geaddet?
    begin
      for a := 0 to list.Count-1 do
      if newlist.Count <> 0 then
      begin
        if newlist.Strings[a] = (datum+' '+release) then
        begin
          gefunden := true;
          break;
        end;
        gefunden := false;
      end;
      if not gefunden then
        newlist.Add(datum+' '+release)
    end;
  result := newlist.CommaText;
  list.free;
  newlist.free;
  end;
end;


thnx für eure hilfe

[edit=sakura] Code durch [Delphi]-Tags ersetzt. Mfg, sakura[/edit]

Tanadirian 24. Okt 2003 12:31

Re: Problem mit If schleife ...
 
Mit

Delphi-Quellcode:
newlist.Sorted:=True;
newlist.Duplicates:=dupIgnore;
wird das Eintragen von doppelten Strings in eine sortierte Stringlist einfach ignoriert!

mfg Tanadirian

neolithos 24. Okt 2003 12:44

Re: Problem mit If schleife ...
 
Das heißt


IF-Bedingung

Schleifen sind...

- for
- while
- repear .. until

weiter Bedingung:

case

sharkx 24. Okt 2003 12:46

Re: Problem mit If schleife ...
 
hmm, trotz Sorted und duIgnore added er aber doppelte einträge in der ListView?!

Tanadirian 24. Okt 2003 12:59

Re: Problem mit If schleife ...
 
Delphi-Quellcode:
list, newlist : TStrings;
Vielleicht mußt du sie ja auch als TStringList deklarieren? Ich weis nicht ob das so auch ok ist!

mfg Tanadirian

sharkx 24. Okt 2003 13:00

Re: Problem mit If schleife ...
 
Ich habs als StringList deklariert, jedoch added er immer noch die Dupes :/

gekmihesg 24. Okt 2003 13:55

Re: Problem mit If schleife ...
 
das is einfach:

Code:
if liste.IndexOf('string') = -1 then
  liste.add('string');

sharkx 24. Okt 2003 19:55

Re: Problem mit If schleife ...
 
Würde mich nun aber auch mal Interessieren warum er trotz
Code:
var
 newlist : TStringList;
begin
 newlist.Sorted:=True;
 newlist.Duplicates:=dupIgnore;
.......
doppelte Strings added.

APP 24. Okt 2003 20:14

Re: Problem mit If schleife ...
 
Hallo,
vielleicht fehlt
Delphi-Quellcode:
newlist.CaseSensitive := False;

sharkx 24. Okt 2003 20:18

Re: Problem mit If schleife ...
 
Nein, habe ich auch schon getestet. ich poste nochmal die ganze funktion, vieleicht liegt der fehler ja sonstwo ...

Delphi-Quellcode:
// logfile auf "[Time] [Tag] und String" durchsuchen
function ReadString(path : string) : string;
const
  searchstring = '[bla] + blaa bluuuub:';      
var
  list, newlist : TStringList;
  z1,datum,release : string;
  i,p1,p2 : integer;
begin
  list := TStringList.Create;
  newlist := TStringList.Create;
// StringList sortieren und keine doppelten Strings hinzufügen
  newlist.Sorted := True;
  newlist.Duplicates := dupIgnore;
  newlist.CaseSensitive := False;
  list.LoadFromFile(path);

// Release parsen
  for i := 0 to list.Count-1 do
  begin
    p1 := Pos(searchstring,list[i]);
    if p1 = 0 then continue;

    z1 := list.Strings[i];
    p1 := Pos('[',z1);            
    p2 := Pos(']',z1);            

    datum := Copy(z1,p1+1,(p2-p1)-1);

    p1 := Pos(searchstring,z1);
    z1 := Copy(z1,p1+length(searchstring)+1,length(z1));

    p2 := Pos(' ',z1);

    release := Copy(z1,1,p2-1);
    newlist.Add(datum+' '+release)
    end;
  result := newlist.CommaText;
  list.free;
  newlist.free;
end;

sakura 24. Okt 2003 20:22

Re: Problem mit If schleife ...
 
@sharkx: Nutze mal statt der [code]-Tags die [delphi]-Tags.

Danke,
...:cat:...

APP 24. Okt 2003 20:34

Re: Problem mit If schleife ...
 
Hallo sharkx,
kann es sein, dass Du diese Funktion mehrmals hintereinander aufrufst?

Wenn ja, dann ist klar, dass Deine Funktion immer die gleichen Ergebnisse mehrfach als String zurückgibt.
(Du zerstörst die Stringlist ja jedesmal, und erzeugst sie immer neu)

Ansonsten scheint die Funktion zu Funken (bei einmaligem Aufruf).

sharkx 24. Okt 2003 20:35

Re: Problem mit If schleife ...
 
Die funktion steht in einer endlosschleife, ja ...


Hmmm, wie löse ich dann am besten das Problem?

APP 24. Okt 2003 20:37

Re: Problem mit If schleife ...
 
Indem Du die Stringliste ausserhalb Deiner Funktion erzeugst.

sharkx 25. Okt 2003 11:28

Re: Problem mit If schleife ...
 
hallo,

App, irgendwie versteh ich das nicht so ganz. Ich soll die StringList auserhalb der Funktion erzeugen. Wo bzw wie soll ich die erzeugen?

APP 25. Okt 2003 16:03

Re: Problem mit If schleife ...
 
Hallo sharkx,

falls ich Dich richtig verstanden habe, dann meinte ich in etwa so:

Delphi-Quellcode:
PROCEDURE TForm1.Button3Click(Sender: TObject);
VAR
   NewList                        : TStringList;
   j                              : Integer;

   // logfile auf "[Time] [Tag] und String" durchsuchen
   FUNCTION ReadString(path: STRING): STRING;
   CONST
      searchstring                = '[bla] + blaa bluuuub:';
   VAR
      list                        : TStringList;
      z1, datum, release          : STRING;
      i, p1, p2                    : integer;
   BEGIN
      list := TStringList.Create;
      list.LoadFromFile(path);
      // Release parsen
      FOR i := 0 TO list.Count - 1 DO
         BEGIN
            p1 := Pos(searchstring, list[i]);
            IF p1 = 0 THEN continue;

            z1 := list.Strings[i];
            p1 := Pos('[', z1);
            p2 := Pos(']', z1);

            datum := Copy(z1, p1 + 1, (p2 - p1) - 1);

            p1 := Pos(searchstring, z1);
            z1 := Copy(z1, p1 + length(searchstring) + 1, length(z1));

            p2 := Pos(' ', z1);

            release := Copy(z1, 1, p2 - 1);
            newlist.Add(datum + ' ' + release)
         END;
      result := newlist.CommaText;
      list.free;
   END;

BEGIN
   NewList := TStringList.Create;
   TRY
      // StringList sortieren und keine doppelten Strings hinzufügen
      NewList.Sorted := True;
      NewListt.Duplicates := dupIgnore;
      NewList.CaseSensitive := False;
      // Deine "Endlosschleife"
      FOR j := 0 TO 10 DO
         BEGIN
            Memo1.Clear;
            Memo1.Lines.add(ReadString('C:\LB.txt'));
         END;
      beep;
   FINALLY
      NewList.Free;
   END;
END;
Das ist nur ein Ansatz, Du kannst "newlist" auch als Parameter mitgeben,
wenn Deine Funktion keine Unter-Funktion sein soll.
Oder Du kannst "newlist" global deklarieren...

Auf alle Fälle sollte deine Funktion immer mit der Stringliste
arbeiten die vorher einmal erzeugt wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz