Announcement

Collapse
No announcement yet.

Eine Art StringList

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Eine Art StringList

    Hallo Leute,

    ich möchte gerne in einer Liste (die nicht sichtbar ist, sondern nur der Abarbeitung dient) Strings speichern. Dann soll immer der erste Eintrag dieser Liste gelesen, verarbeitet und danch gelöscht werden, sodaß Eintrag Nummer 2 zum ersten Eintrag wird. Bisher verwende ich TStrings, wobei hier natürlich ein "DELETE" nur den Eintrag auf "" setzt, ihn aber nicht so entfernt, da0 der nächste zum ersten Eintrag wird. Irgendeine Idee, wie ich das lösen könnte??

    Vielen Dank,

    Pascal

  • #2
    Die TStringList macht doch genau das, was Du suchst:<p>
    <pre class="sourcecode"><code>
    <b>Var</b> MyStrList: TStringList;
    <b>begin</b>
    MyStrList := TStringList.Create;
    MyStrList.Add(<font color="#9933CC">'123'</font>);
    MyStrList.Add(<font color="#9933CC">'456'</font>);
    ShowMessage(MyStrList[0]);<font color="#003399"><i>// zeigt 123</i></font>
    MyStrList.Delete(0); <font color="#003399"><i>// löscht 123</i></font>
    ShowMessage(MyStrList[0]);<font color="#003399"><i>// zeigt 456</i></font>
    MyStrList.Free;

    </code></pre><p>Wo liegt Dein Problem
    Schöne Grüße, Mario

    Comment


    • #3
      In deinem Falle solltest Du auf das .Delete() sowieso verzichten. Statt dessen nutzt du eine Schleife die die List vom nullten Eintrag bis zum Count-1'ten Eintrag abarbeitet. Dadurch wird die Liste nicht ständig im Speicher verändert und dies ist wesentlich schneller als jedesmal den 0'ten Eintrag zu löschen.<br>

      Gruß Hage

      Comment


      • #4
        Hallo und erst einmal vielen Dank für eure umfassenden und schnellen Antworten. Nun, die Liste wird ständig von einer anderen Funktion gefüllt und wenn ich die Liste bis zum Ende durchlaufen lasse, dann wäre die Schleife zu Ende und ich müßte sie irgendwie wieder aufrufen. Bei hundert Einträgen müßte doch das Löschen der ersten Zeile schnell genug gehen, oder??

        Nochmals vielen Dank und herzlicher Gruß,
        Pasca

        Comment


        • #5
          Hallo nochmal!

          Ich müßte dasselbe in embedded Visual Basic machen. Dort gibt es aber, soweit ich weiß, keine StringList. Habt ihr eine Ahnung, wie ich dieses Problem trotzdem lösen könnte?? Wie wäre es mit einem Array of strings? Kann man bei einem Array den ersten Eintrag löschen und wenn ja, wie??

          Danke im voraus,

          Pasca

          Comment


          • #6
            Hi Pascal, (wie passend :-P)
            <br>kannst du das mit der Liste nicht ganz sein lassen und stattdessen der Funktion, die die Liste füllen soll, eine Callback-Funktion/Methodenzeiger übergeben? Anstatt einen String an die Liste anzuhängen, würde einfach der Callback mit dem String als Parameter aufgerufen. (Ich hoffe, das ging jetzt nicht am Thema vorbei.)
            <br>Ciao, Uli

            Comment


            • #7
              Hallo Ulrich,

              das klingt toll, ich habe aber (ehrlich gesagt) keine Ahnung, wie Du Dir das vorstellst. Wärst Du so freundlich und würdest mir ein kurzes Codebeispiel geben?? Die Liste war eine Art Notlösung für mich. Ich will folgendes machen:
              Kommunikation mit PocketPC, bei dem ich einen String übersende und der sendenden Funktion den ückgabewert, den der PocketPC antworten soll, mit übergebe. Daher dachte ich an zwei Listen, die eine enthält die SendeStrings und die andere die AntwortStrings, die mit der Antwort vom PocketPC verglichen werden sollen.

              Danke schon einmal,

              Pascal (Delphi finde ich super!!! - auch wenn der Name nicht unbedingt verpflichtet.....

              Comment


              • #8
                Noch ein Vorschlag

                <pre>
                const
                max = 100 // oder so

                var
                lesePos, schreibPos : integer;

                procedure schreibeListe(s:string)
                begin
                inc(schreibePos);
                if max<=schreibePos then schreibePos:=0;
                Liste[schreibePos]:=s;
                end;

                procedure leseListe;
                begin
                if lesePos=schreibePos then exit;
                inc(lesePos);
                if max<=lesePos then lesePos:=0;
                machWasMit(Liste[lesePos]);
                end;

                initialization
                lesePos:=max;
                schreibePos:=max;

                <pre>

                natürlich Liste vorher erstellen usw

                Comment


                • #9
                  Hi Pascal,
                  <br>ich hab an sowas gedacht (zugegeben -- blödes Beispiel):
                  <pre>
                  program Project2;
                  {$APPTYPE CONSOLE}
                  uses sysutils;
                  <br>
                  type
                  TStringCallback = procedure(const s: string) of object;
                  <br>
                  TStringSummierer = class
                  public
                  Summe: Integer;
                  procedure Add(const s: string);
                  end;
                  <br>
                  { TStringSummierer }
                  <br>
                  procedure TStringSummierer.Add(const s: string);
                  begin
                  inc(Summe, StrToInt(s));
                  end;
                  <br>
                  procedure StringLieferant(cb: TStringCallback);
                  begin
                  cb('42');
                  cb('666');
                  cb('23');
                  end;
                  <br>
                  procedure StringEmpfaenger;
                  var
                  summ: TStringSummierer;
                  begin
                  summ := TStringSummierer.Create;
                  summ.Summe := 0;
                  StringLieferant(summ.Add);
                  Writeln('StringLieferant lieferte Summe ', summ.Summe);
                  summ.Free;
                  end;
                  <br>
                  begin
                  StringEmpfaenger;
                  end.
                  </pre>
                  StringEmpfaenger ist die Routine, die bei der Listen-Idee die Liste erzeugen und auslesen würde, während StringLieferant sie dort befüllen würde.
                  <p>
                  Nachdem ich jetzt aber deine Antwort mit den PocketPCs gesehen (und nicht verstanden ;-)) habe, glaube ich fast, dass du was Asynchrones haben willst: Irgendwer schreibt in einen Puffer (die Liste) rein, und jemand anderes liest irgendwann aus dem Puffer? Das geht dann mit Callbacks nicht so einfach wie in meinem Codefragment.
                  <br>Uli

                  Comment


                  • #10
                    Im Falle des asynchronen Lesens/Schreibens handelt es sich hier um einen Stack. D.h. statt den ersten Eintrag zu lesen und zu löschen wird die Liste umgekehrt organisiert. In diesem Moment muß man immer mit Strings.Insert(0, String) einen Eintrag hinzufügen. Je nachdem was nun schneller gehen muß, das Lesen oder das Schreiben, wird die List normal benutzt oder umgekehrt.<br>

                    Die Callback wäre aber im synchronen Fall die beste Alternative

                    Comment

                    Working...
                    X