Announcement

Collapse
No announcement yet.

TObjectList - Inhalte ausgeben?

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

  • TObjectList - Inhalte ausgeben?

    Servus.
    Ich würde gerne wissen, wie ich die Inhalte (Strings) von TStringList's die in einer TObjectList enthalten sind auslesen kann. (Es sei mal egal, dass sich die ObjectList in einer übergeordneten TObjectList befinden!!)
    Mir ist jedoch nicht klar, wie ich an dise Inhalte der TStringList's komme.

    Evt zur Info:
    Mein Programm liest eine, nach einem bestimten Format geschriebene, Datei ein. Die $-Zeichen markieren einen Bereich in der Datei, ähnlich wie Überschriften. Das Programm liest nun diese und die darunter folgenden Zeilen ein, bis zum Auftreten eines weitern $-Zeichens an der ersten Position. Die einzelnen Zeilen beinhalten mehrere Einträge, durch Pipes ( |-Zeichen) getrennt. Diese einzelnen Einträge werden nun in StringListen (tsl_stylecheat) gespeichert. Diese Stringlisten werden in einer Objektliste gespeichert (tol_stylecheatDetail). Diese Objektlisten werden wiederum in einer Objektliste gespeichert (tol_StylecheatMain). Somit wollte ich eine während der Laufzeit dynamisch erweiterbare, mehrdimensionale TStringList erzeugen. Der Grund sei mal dahin gestellt, sowie die Art der Programmierung, es geht allein um das Verständnis.

    So sieht z.B. die einzulesende Datei aus
    Code:
    $0
    $1
    $2
    aaa|1|0|FFFFFF|000000|1|
    bbb|1|0|FFFFFF|000000|0|
    $3
    aaa|1|1|FFFFFF|000000|1|
    bbb|1|1|FFFFFF|000000|1|
    ddd|1|1|FFFFFF|000000|1|
    $4
    $5
    aaa|1|1|FFFFFF|000000|0|
    $6
    $7
    aaa|0|1|FFFFFF|000000|0|
    bbb|0|1|FFFFFF|000000|0|
    Der folgende Sourcecode zeigt, wie ich das einlesen der Datei realisiert habe
    Code:
    [...]
     
    #define Filename ExtractFilePath(ParamStr(0)) + "testdatei.txt"
     
    [...]
     
    TObjectList *tol_StylecheatMain = new TObjectList();
    TObjectList *tol_StylecheatDetail = new TObjectList();
      
    TStringList *tsl_Stylecheat = new TStringList();
      
    int position = 0;
    AnsiString ListMark = "$";
    AnsiString Line = "";
    
    if(FileExists(Filename))
    {
      tsl_StylecheatFile->LoadFromFile(Filename);
    
      for(int index = 0;index < tsl_StylecheatFile->Count;index ++)
      {
        Line = tsl_StylecheatFile->Strings[index];
    
        if(Line.SubString(1,1) == ListMark)
        {
          tol_StylecheatDetail = new TObjectList();
          tol_StylecheatMain->Add(tol_StylecheatDetail);
        }
        else
        {
          tsl_Stylecheat = new TStringList();
    
          position = Line.AnsiPos("|") + 1;
          Line = Line.SubString(position,Line.Length());
          //tsl_Stylecheat->Add(Line);
    
          for(int x = 0;x < 5;x ++)
          {
            position = Line.AnsiPos("|") + 1;
            Line = Line.SubString(position,Line.Length());
            tsl_Stylecheat->Add(Line);
          }
    
          tol_StylecheatDetail->Add(tsl_Stylecheat);
        }
      }
    }
    [...]
    Wenn man die Funktion dieses Einlesen verbildlicht, könnte es so aussehen:
    Code:
    - $0 // (Neue TObjectListMain: tol_StylecheatMain)
    - $1 
    - $2 
      - // (Neue TObjectListDetail: tol_StylecheatDetail)
        - aaa // (Neue TStringList: tsl_Stylecheat)
        - 1
        - 0
        - FFFFFF
        - 000000
        - 1
      - 
        - bbb
        - 1
        - 0
        - FFFFFF
        - 000000
        - 0
    - $3 
      - 
        - aaa
        - 1
        - 1
        - FFFFFF
        - 000000
        - 1
      - 
        - bbb
        - 1
        - 1
        - FFFFFF
        - 000000
        - 1
      - 
        - ddd
        - 1
        - 1
        - FFFFFF
        - 000000
        - 1
    - $4 
    - $5 
      - 
        - aaa
        - 1
        - 1
        - FFFFFF
        - 000000
        - 0
    - $6 
    - $7
      - 
        - aaa
        - 0
        - 1
        - FFFFFF
        - 000000
        - 0
      - 
        - bbb
        - 0
        - 1
        - FFFFFF
        - 000000
        - 0
    Ich muss nun, wie oben beschrieben, die Inhalte der TStringList's.
    Zuletzt editiert von Antz; 12.01.2010, 19:45. Reason: Sourcecode-Änderung
    Ants aren't dead

  • #2
    Originally posted by Shibuya View Post
    Mir ist jedoch nicht klar, wie ich an dise Inhalte der TStringList's komme.
    Denke dass du meinst: Es ist mich nicht klar wie ich an diese TStringList's komme.

    Denn wenn du ein pointer auf eine TStringList hast weist du doch an die Strings zu kommen denke ich.

    So:

    StringList->Strings[nr];

    Comment


    • #3
      Grund sei mal dahin gestellt, sowie die Art der Programmierung,
      Man kann natürlich alles auch umständlich programmieren......
      Christian

      Comment


      • #4
        Umständlich? Mag sein aber ich wüsste nicht wie ich's anders machen kann. Klär mich auf gib mir ne Idee!

        Hast Recht Hans, an die Inhalte von TStringlisten weiß ich wie ich komme( so wie du's geschrieben hast) aber ich muss dem Programm iwie mitteilen welche stringlisten ich meine ( welche in dem verschachtelten objektlisten)

        ich Stelle mir das so vor:
        Code:
        // Pseudocode
        
        objectlistmain->items[4]->objectlistDetail->items[0]->stringlist->strings[0]
        natürlich klappt das so nicht daher möchte ich ja gerne Hilfe bekommen um zu wissen wie man es macht. Wenn das ganze Gebilde einfacher zu realisieren ist, und man mir sagt wie, kann ich es gerne auch so machen. Möchte es ja lernen wieans richtig macht.
        Ants aren't dead

        Comment


        • #5
          Schon mal überlegt dafür 3 Klassen zu schaffen, die deine gewünschten Methoden implementieren?

          Diese werden mit den Daten aus der Datei gefüllt und du kannst einfach auf die Daten in der von dir gewünschten Form zugreifen
          Christian

          Comment


          • #6
            Originally posted by Shibuya View Post
            objectlistmain->items[4]->objectlistDetail->items[0]->stringlist->strings[0]
            Das wäre dann:

            objectlistmain->Items[4]->Items[0]->Strings[0];

            Aber dass Problem is das ObjectList->Items[nr] ein TObject pointer is und kein TObjectList pointer. Aber: der TObject pointer zeigt hier nach eine instance einer TObjectlist. Also die adresse die der pointer angibt is gültig. Nur acceptiert sie der Compiler nicht.

            Deshalb: cast.

            TObjectList *MainObjectList = .....

            TObjectList *DetailObjectList = (TObjectList*)MainObjectList->Items[nr];

            TStringList *StringList = (TStringList*)DetailObjectList->Items[itemnr];


            du kanst die zeile:

            objectlistmain->Items[4]->Items[0]->Strings[0];

            auch eine Zeile lassen duch die drei cast's hinein zu fühgen.

            Das überlasse Ich dir dann.


            Edit: Uebrigens bleiben alle TstringList's in deine code leer.

            Comment


            • #7
              Ich habe mal über den Code geschaut aber kann nicht den Fehler finden, warum die Listen nicht gefüllt werden sollten. Ich glaub' dir gerne, denn durch mein Problem kann ich die (wenn vorhanden) Inhalte der Listen ja nicht prüfen.

              Wie ich das mit den Klassen machen sollte wüsste ich jetzt dire´kt nicht. ich weiß zwar wie ich klassen verwende, tu ich ja sonst auch, aber nicht wie ich durch Klassenen es schaffen soll, im Endeffekt mehrdimensionale Listen anzulegen. Wobei ich ja aber nicht weiß, wie groß, bzw tief diese Listen verschachtelt werden. Mom, doch klar ich weiß dass ich eine 3-Dimensionale TStringliste brauche. Dennoch weiß ich nicht wie ich das mit Klassen machen soll, es sei denn ich würde pro Klasse eine ObjectList bauen. Allerdings muss ich dann noch schauen ob ich daruf zugreifen kann (Klar kann man darauf zugreifen, nur schwebt mir das noch nicht direkt vor meinem Geistigen Auge)

              Aber Danke schon mal für die Mühe und Hilfestellung!!
              Ants aren't dead

              Comment


              • #8
                Originally posted by Shibuya View Post
                Ich habe mal über den Code geschaut aber kann nicht den Fehler finden, warum die Listen nicht gefüllt werden sollten.
                Erzähle dann bitte wo du etwas in deine neu angelegte TStringList's schreibst. Es gibt nicht solche code.

                Was tuts's du z.B. mit Line = .... ? (in die for loop)

                Du machst nichts mit Line.

                Comment


                • #9
                  Ach sooo, hehe ja stimmt. In dem Quelltext oben ist die wirklich der Fall, hab ich anscheinend beim Kopieren / Formatieren hier weggelassen, was totaler Unfug ist. Ich änders...
                  Ants aren't dead

                  Comment

                  Working...
                  X