Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Frage zu DBTreeview (https://www.delphipraxis.net/90386-frage-zu-dbtreeview.html)

onkelmehli 16. Apr 2007 15:31


Frage zu DBTreeview
 
Hallo, ich möchte die DBTreeview-Komponente (DTADOTree) für meine Anwendung benutzen, habe aber noch keine großen Erfahrungen damit, somit hätte ich folgende Frage:

Wie kann ich per Drag&Drop ein Node-Item so verschieben, das in der Datenbank der Wert 0 in der parentid geschrieben wird, also das Note-Item praktisch als Root angelegt wird ?
Gibt es eine Einstell-Möglichkeit oder kann man diese nur als child verschieben ?

Gruß Matthias

onkelmehli 18. Apr 2007 09:38

Re: Frage zu DBTreeview
 
Hallo, hat niemand Erfahrung mit der DBTreeview ? In der Hilfe zur Komponente steht leider nichts dazu, auch in sämtlichen Foren nicht. :(

währe für schnelle Hilfe sehr dankbar !

Gruß

Matthias

Alter Mann 18. Apr 2007 11:59

Re: Frage zu DBTreeview
 
Hallo,

so wie ich es sehe geht das ganze nicht, da dir ein leerer/unsichtbarer Rootknoten fehlt.
Schau dir mal die Demo3 an, dort kann jedenfalls ein knoten auf ein anderen 'Rootknoten' verschoben
werden, daraus müsste man etwas machen können.


Gruß

(Melde mich heut noch mal).

onkelmehli 18. Apr 2007 13:24

Re: Frage zu DBTreeview
 
Hallo, danke erst einmal.

Die Funktionalitäten der Demos sind mir soweit schon klar, nur löst keiner von ihnen mein Problem.
Und wenn ich mir die Komponente selbst anschaue, dann wird beim Move oder Copy eines Knotens immer abgefragt, ob es sich beim Zielknoten um den Rootknoten handelt, wenn ja, dann verschiebt er den Knoten erst gar nicht.
Gibt es einen besonderen Grund warum das so sein soll ?
Ich habe schon versucht, im DragDrop-Ereignis das ganze selbst zu steuern, leider erfolglos mit Zugriffsverletzungen beim Aktualisieren der Treeview.
Denn eigentlich ist es doch nichts weiter, als das in der DB die parentid geändert wird und die Treeview danach aktualisiert wird, oder seh ich das falsch ?

Mir geht es eigentlich darum, das ich in der Tabelle keinen Datensatz haben möchte, mit dem ich z. B. bei Auswertungen Probleme bekommen könnte.

Gibt es vielleicht eine Alternative zu der DBTreeview mit der man so etwas realisieren kann ?

Gruß

Matthias

Alter Mann 18. Apr 2007 18:03

Re: Frage zu DBTreeview
 
Hallo Matthias,

wir bleiben mal bei der Demo3 und klinken uns in der Ereignisbehandlung DTTableTree1.OnDragDrop ein.

Delphi-Quellcode:
procedure TForm1.DTTableTree1DragDrop(Sender: TBaseVirtualTree;
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  NewParentNode: PVirtualNode;
  CurData     : PNodeItem;
begin
  if (Sender is TDTTableTree) then
  begin
    NewParentNode := TDTTableTree(Sender).GetNodeAT(Pt.X, Pt.Y);
    if NewParentNode = nil then
    begin
      with TDTTableTree(Sender).DataSource.DataSet, TDTTableTree(Sender) do
      begin
        DisableControls;
        Edit;
        FieldValues[DBTreeFields.ParentFieldName] := 0;
        Post;
        EnableControls;
      end;
    end
    else
    begin
      with TDTTableTree(Sender).DataSource.DataSet, TDTTableTree(Sender) do
      begin
        CurData := TDTTableTree(Sender).GetNodeData(NewParentNode);
        if Assigned(CurData) and Assigned(CurData^) then
        begin
          DisableControls;
          Edit;
          FieldValues[DBTreeFields.ParentFieldName] := CurData^.Key;
          Post;
          EnableControls;
        end;
      end;
    end;
  end;
end;
Das einzige was jetzt noch bleibt ist Aktualisierung der Anzeige.

Gruß

onkelmehli 19. Apr 2007 16:10

Re: Frage zu DBTreeview
 
Hallo Alter Mann (bitte nicht persönlich nehmen :zwinker: ),

vielen dank noch einmal, das sich jemand mit meinem Problem beschäftigt.

Bis zur Lösung in dem DragDrop-Ereignis war ich bisher schon gekommen und das danach eine Aktualisierung statt finden muß. Und genau hier lag mein Problem:
ich bekam immer eine Zugriffsverletzung beim aktualisieren, durch den Debugger stellte ich fest, das wärend meiner Aktualisierung, genauer gesagt nach dem Löschen der Knoten, noch eine Aktualisierung stattfand, als diese dann versuchte die Knoten zu löschen, kam natürlich bei FreeMem(ist ja kein Knoten mehr da) die Zugriffsverletzung.
Und gerade als ich hier schreibe, fiel mir in den Optionen auf, das ich AutoDeleteMovedNodes auf true hatte :wall: , somit war mein Problem glöst.

Gruß

Matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz