Einzelnen Beitrag anzeigen

Benutzerbild von BMI
BMI

Registriert seit: 16. Jul 2010
58 Beiträge
 
Delphi 2 Desktop
 
#1

Daten in Treeview einsortieren

  Alt 16. Jul 2010, 10:25
Delphi-Version: 2005
Hallo,

ich muß eine Liste in ein Treeview einsortieren.
Allerdings "schraub" ich jetzt schon 2 Tage daran herum, ohne ein vernünftiges Ergebnis erzielt zu haben.
Vielleicht weiß jemand von Euch eine Hilfe.

Mein weiter unten geposteter Code spiegelt meinen derzeitigen Stand wieder.
Er ist nochmehr verwurstet als vorher. Und ich weiß nicht mehr, was ich genau während des Probierens verändert habe.
Ich wollte damit alle bereits in dem aufzunehmenden String vorkommenden Teilelemnte eliminieren und nur den jeweils neuen Begriff (der hinten-dran ist) in dem Tree vermerken. Falls der letzte nicht vorkommt, soll das an einen frühren Knoten angehängt werden, sodaß ein vernünftiger Baum entsteht.

Das schwierige ist nicht der Tree, sondern das Kürzen der Zeilen auf das Wesentliche, Neue.

Vielleicht weiß aber jemand von Euch einen ganz neuen, simplen Ansatz.
auf den ich nicht gekommen bin?
evtl. lohnt es sicht gar nicht, meinen Code anzuschauen und zu reparieren/vestehen zu wollen, weil es vielleicht einfacher geht?

Großen Dank schon einmal hier.



Die Elelmente der Liste hab ich mal mit '\' getrennt. (im Original der Liste ist dies anderes, nicht darstellbares Zeichen)

Code:
{ Folgende Liste soll in einen Tree kopiert werden
####a\Schrauben
####a\Schrauben\Betonschrauben
####a\Schrauben\lang
####a\Schrauben\lang\Holzschrauben
####a\Schrauben\Metallschrauben
####a\Schrauben\sechskantig
####a\Nägel
####a\Nägel\Betonnägel
####a\Nägel\Holz
####a\Nägel\Holz\mitHaken
####b\isometrischeFormen\ ...

einsortiert in ein Treeview sollte das etwa so aussehen:

 Liste
 |- Schrauben
 |        |-Betonschrauben
 |        |-lang
 |            |-Holzschrauben
 |        |-Metallschrauben
 |        |-sechskantig
 |- Nägel
 |     |-Betonnägel
 |     |-Holz
 |         |-mitHaken
 |-isometrischeFormen
also so http://www.imagebanana.com/img/ibh7q...0716111537.png

Erklärung zum Code unten:
Also ich gehe die Liste im memo zeilenweise durch.
Packe mir dann, falls die Zeile (die steht in der Liste zwischen unbrauchbarem, daher der Filter), die in Frage kommt und scanne die Stringzeile nach "\" und füge die getrennten Elemente in eine Liste2 ein.
Kommt der Begriff in der Liste2 als nächstletzter vor, soll der Knoten als Child angehängt werden - falls nicht, soll er weiter LINKS im Baum angeordnet werden. ... soo.. dachte ich mir das ... aber das scheint wohl nicht zu funktionieren. Vielleicht ist es einfacher, das von Grundauf neu zu machen? Bloß wie?
Delphi-Quellcode:
procedure TForm1.STARTClick(Sender: TObject);
var
  z, DCounter, FCounter, i, v, k, maxL: integer; // Integer später Problem ???
Samm2, Samm, tt, t, vv, u, s: string;
  allmemo: tstringlist;
  tn: TTreeNode;
begin
TreeView1.items.clear;
  TreeView1.AlphaSort;
  ListBox1.Clear;
  ListBox2.Clear;
  ListBox3.Clear;
  ListBox4.Clear;
  allmemo := TStringList.create;
  allmemo.Assign(memo1.lines);
  maxL := memo1.lines.count - 1;
  FCounter := -1; DCounter := -1;
  i := 2;
  TreeView1.items.Addchild(nil, 'ERSTENS');
// tn.Expand;
  while i < maxL do
  begin
    inc(i);
    S := allmemo[i];
    Edit1.text := S;
    if (S <> '') then
    begin // wenn nicht leer
      if (posex('Dat(en)', S, 1) = 0)
        and (posex('Daten', S, 1) = 0)
        and (posex('<Masse>', S, 1) = 0)
        then
      begin
        if (posex(' Informationen über ', S, 1) <> 0) and (posex(':\', S, 1) <> 0) then // abchecken
        begin
          inc(DCounter);
          s := Copy(s, 20, length(s)); // ' Informationen über '
          ListBox1.items.add(s);

          tn := TreeView1.items[DCounter];
          /////////////////
// z := length(s);
            z := 0;
              Tt := ''; Samm :='';
            while z < length(s) do
            begin
              inc(z);
              tt := s[z];
              if (tt = '\') //or (tt = ':')
               then
              begin
                ts.Items.add(Samm); // Samm := Copy(s, 1, z);
                Samm2 := Samm2 + Samm;
                Samm := '';
                Tt := ''; // vorsicht , nochmal
              end
              else
                Samm := Samm + tt;
            end;
          //2end; // END IF Informationen enthalten 2
          tt := copy(s, 1, z); //length(s)
          /////////////////
vv := TS.Items[TS.Items.count - 1 ];
          if posex(vv, s, 1) <> 0 then // wenn drin
          begin
            s := copy(s, Length(vv) + 1, length(s)); /// VORHER t
            TreeView1.Items.Add(Tn, s); //DCounter] := s ;
          end
          else
            TreeView1.Items.AddChild(Tn, s); //DCounter] := s ;;
          t := t + s + ' # ';
          // ongetimageindex << anderes BIld
        end
        else
        begin
          if (posex('Anzahl der angezeigten Daten:', S, 1) = 0) then
            inc(FCounter);
          ListBox2.Items.add(s);
        end;


      end;
      ; // End pos
    end; // End wenn String nicht leer
  end; // while?

// tn[0].Expand ( True);
  allmemo.Free;
  TreeView1.FullExpand;
end;
http://www.imagebanana.com/img/ibh7q...0716111537.png

Nochwas schlimmes muß ich beichten ... ich habe Delphi 3 Pro sorry.

P.S.:Warum sind eigentlich Bilder /bzw. verlinkte Vorschauen deaktiviert?
eine Signatur? - in 2022? - WOZU ?!!!

Geändert von BMI (16. Jul 2010 um 10:42 Uhr)
  Mit Zitat antworten Zitat