Einzelnen Beitrag anzeigen

Monday

Registriert seit: 24. Aug 2012
103 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Baumstruktur darstellen

  Alt 1. Okt 2014, 20:54
Vielen Dank für die Antworten.

Ich habe gebastelt und bin dem Ziel schon näher

Wenn man die Tiefe / Ebene (=ebene (wie sagt man da richtig bei einer baumstruktur!?)) mitspeichert, dann hat man ja schon fast die Strukur. Also gleich einrücken. Dann muss man nur noch die Zeilen richtig vertauschen.

Also soweit bin ich schon:

Ich habe jetzt eine DB mit der Struktur

id, parentID, tiefe, text

Das ganze lade ich erstmal in ein StringGrid und dann der Versuch der sortierung.

Auf einer Form habe ich ein StringGrid (m. Schriftart Courier wegen des Einrücken) mit mind. 4 Spalten und drei Buttons.

Relevant ist eigentlich nur die "Text" Spalte, in diesem Beispiel Spalte Nr. 3 (beginnend von 0). Die ersten drei id, parentID, tiefe sindnur hilfsspalten.

Nun sieht es so aus:

Code:

// http://www.delphi-treff.de/tipps-tricks/komponenten/tstringgrid/zeilen-in-einem-stringgrid-tauschen/
procedure ExchangeStringGridRows(const AGrid: TStringGrid; Row1, Row2: Integer);
var
  Temp: TStrings;
begin
  Temp:=TStringList.Create;
  try
    Temp.Assign(AGrid.Rows[Row1]);
    AGrid.Rows[Row1].Assign(AGrid.Rows[Row2]);
    AGrid.Rows[Row2].Assign(Temp);
  finally
    Temp.Free;
  end;
end;





procedure TForm1.Button1Click(Sender: TObject); // "sortieren"
var
  i, max,a: integer;
  leer : string;
begin
ZQuery1.SQL.Text := 'SELECT max(id) as max from daten;';
ZQuery1.Open;
max := ZQuery1.FieldByName('max').AsInteger;

   for i := 1 to max do begin // alle zellen durchgehen

     if StringGrid1.cells[2,i] <> '1' then begin // 1 ist die niedrigste Ebene
       // parentID / ID
       if (StringGrid1.cells[1,i] <> StringGrid1.cells[0,i-1]) and (StringGrid1.cells[1,i] <> StringGrid1.cells[1,i-1]) then begin
         ExchangeStringGridRows(StringGrid1, i, i-1);
       end;
     end;
end;


end;





procedure TForm1.Button2Click(Sender: TObject); // einlesen
var
  i, max: integer;
  leer : string;
begin
 ZQuery1.SQL.Text := 'SELECT max(id) as max from daten;';
 ZQuery1.Open;
 max := ZQuery1.FieldByName('max').AsInteger;

  ZQuery1.SQL.Text := 'select * from daten order by parentID asc, id desc, texta';
  ZQuery1.Open;


 for i := 1 to max do begin

   StringGrid1.Cells[0,i] := ZQuery1.FieldByName('id').AsString;;
   StringGrid1.Cells[1,i] := ZQuery1.FieldByName('parentID').AsString;;
   StringGrid1.Cells[2,i] := ZQuery1.FieldByName('tiefe').AsString;;

   if ZQuery1.FieldByName('tiefe').AsString = '1' then begin leer := ''; end;
   if ZQuery1.FieldByName('tiefe').AsString = '2' then begin leer := '  '; end;
   if ZQuery1.FieldByName('tiefe').AsString = '3' then begin leer := '     '; end;
   if ZQuery1.FieldByName('tiefe').AsString = '4' then begin leer := '        '; end;
   if ZQuery1.FieldByName('tiefe').AsString = '5' then begin leer := '           '; end;

   StringGrid1.Cells[3,i] := leer + ZQuery1.FieldByName('texta').AsString;;

   StringGrid1.RowCount:= StringGrid1.RowCount+1;
   ZQuery1.Next;
 end;


end;

procedure TForm1.Button3Click(Sender: TObject); // nur zum testen
var
  i: integer;
begin
 for i := 1 to 1500 do begin
  Button1Click(Self);     end;
end;

Im Prinzip funktioniert das schon. Allerdings gibts noch ein paar Probleme:
- er sortiert falsch bzw. es entsteht eine Endlosschleife
- sehr laaaaangsam



Lg
Monday


Edit: SQlite3

Geändert von Monday ( 1. Okt 2014 um 21:50 Uhr)
  Mit Zitat antworten Zitat