Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

AW: Firemonkey Treeview mit Daten aus ClientDataSet füllen

  Alt 23. Okt 2014, 20:44
Eine kleine Pfadbehandlung und schon kann man mit einer Funktion beliebig tiefe Pfade im Tree suchen und/oder erstellen.
Delphi-Quellcode:
function TForm1.FindOrCreateItem(ItemParent: TFmxObject; ItemPath: string; InsertDuplicate: Boolean=False): TTreeViewItem;
var
  i: Integer;
begin
  if ContainsStr(ItemPath, PathDelim) then
    ItemParent := FindOrCreateItem(ItemParent, ExtractFileDir(ItemPath), False);
  ItemPath := ExtractFileName(ItemPath);
  if not InsertDuplicate then
    if ItemParent is TCustomTreeView then begin
      for i := TCustomTreeView(ItemParent).Count downto 0 do begin
        Result := TCustomTreeView(ItemParent).Items[i];
        if SameStr(Result.Text, ItemPath) then
          Exit;
      end;
    end else if ItemParent is TTreeViewItem then begin
      for i := TTreeViewItem(ItemParent).Count downto 0 do begin
        Result := TTreeViewItem(ItemParent).Items[i];
        if SameStr(Result.Text, ItemPath) then
          Exit;
      end;
    end else
      raise Exception.Create('Ungültiger Parent-Typ.');
  Result := TTreeViewItem.Create(ItemParent);
  Result.Parent := ItemParent;
  Result.Text := ItemPath;
end;

procedure TForm1.PresentDataset;
var
  ItemPath: string;
begin
  TreeView1.BeginUpdate;
  try
    TreeView1.Clear;
    ClientDataSet1.First;
    while not ClientDataSet1.Eof do
      begin
        ItemPath := ClientDataSet1Jahr.AsString + PathDelim + ClientDataSet1KW.AsString + PathDelim
          + ClientDataSet1Tag.AsString + PathDelim + ClientDataSet1ID.AsString;
        with FindOrCreateItem(TreeView1, ItemPath, True) do begin // True = Datensätze mit doppelter "ID" auch mehrfach einfügen
          //Text := ClientDataSet1ID.AsString; // hat FindOrCreateItem bereits gesetzt
          Tag := ClientDataSet1.RecNo; // so hätte man einen Zugang vom Item zu seinem DataRecord
        end;
        ClientDataSet1.Next;
      end;
  finally
    TreeView1.EndUpdate;
  end;
end;
Aber ich merk immer mehr, daß dieser TreeView einfach nur ein totaler Schrotthaufen ist.
  • Es gibt keinen (unsichtbaren) Root-Knoten, womit man in dem Baum den Hauptknoten und die Unterknoten unterschiedlich behandeln muß, obwohl der Code gleich aussieht.
  • Das public ItemByIndex(i) ist ja sowas von sinnlos und ja genau dem Items[i], aber es gibt keinerlei Funktionen zum Suchen von Items, vorallem nicht über den Text.
  • Selbst der uralte VCL-TreeView ist dem Ding haushoch überlegen und hat unmassen mehr Features. (angefangen bei den Icons und einer Sortierung)
  • Einfügen an beliebiger Stelle (Insert mit Index) und Verschieben von Knoten.
  • Und LiveBindings hat man hier total vergessen, obwohl man dafür so viel Werbung macht und meint wie cool die doch seinen. (nja, an allen Ecken haben die sowieso enorme Bugs und sind nicht wirklich benutzbar)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (23. Okt 2014 um 20:46 Uhr)
  Mit Zitat antworten Zitat