AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Brauche hilfe mit der VirtualTreeview
Thema durchsuchen
Ansicht
Themen-Optionen

Brauche hilfe mit der VirtualTreeview

Ein Thema von Wishmaster · begonnen am 14. Apr 2012 · letzter Beitrag vom 9. Mai 2012
Antwort Antwort
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#1

Brauche hilfe mit der VirtualTreeview

  Alt 14. Apr 2012, 22:42
Hi
Ich versuch mich in die VirtualTreeview einzuarbeiten, mein Problem ist, wie mache ich das mit den Pointer (wichtig!) in der Standard TreeView hast du ja Selected.Data

Ich möchte ne DB in die VirtualTreeview einlesen und natürlich auch bearbeiten können
Synchron zur DB

Kann mir da jemand weiterhelfen?

Hier ist ein wenig Code wie ich das vorher gemacht hatte

Delphi-Quellcode:
{******************************* Fill Group-List ******************************}

procedure TMain_Form.GroupList_Fill();
 procedure FillTreeNode(TreeNode: TTreeNode);
 var I, FolderID : Integer;
     Node : TTreeNode;
     Count : Integer;
     GroupData : TGroupData;
 begin
   FolderID := Integer(TreeNode.Data); << Pointer
   GroupTable.Filter:= 'ParentID=' + IntToStr(FolderID);
   GroupTable.Filtered:= true;
   GroupTable.First;
   Count:= GroupTable.RecordCount;

  for I := 0 to Count - 1 do
   begin
    Get_GroupData(GroupData);
    Node := GroupTree.Items.AddChild(TreeNode, GroupData.Title);
    Node.Data := Pointer(GroupTable.FieldByName('ID').AsLargeInt); << Pointer
    Node.SelectedIndex:= GroupData.Icon;
    Node.ImageIndex:= GroupData.Icon;

    GroupTable.Next;
   end;


  for I := 0 to TreeNode.Count - 1 do
   FillTreeNode(TreeNode.Item[I]);
 end;

begin
  GroupTree.Items.BeginUpdate;
  GroupTree.Items.Clear;

  with GroupTree.Items.Add(nil, 'My Data') do
   begin
    Data := Pointer(0);
    ImageIndex := 0;
    SelectedIndex := 0;
   end;

   FillTreeNode(GroupTree.Items[0]);
  if GroupTree.Items.Count > 0 then
   GroupTree.Items[0].Expanded:= true;
   GroupTree.Items.EndUpdate;
   GroupTree.Items[Temp_NodeIndex].Selected := True;
   GroupTree.Items[Temp_NodeIndex].MakeVisible;
   ValueList_Fill(Temp_FolderID);


  SetNodeBoldState(GroupTree.Items[0], true);
end;

Delete

Delphi-Quellcode:
(******************************** Delete Group ********************************)

Function TMain_Form.Group_Delete(): Boolean;
function GetHeight(TreeNode: TTreeNode): Integer;
 function MaxLevel(TreeNode: TTreeNode): Integer;
  var i, level: Integer;
  begin
    Result := TreeNode.AbsoluteIndex;
   if TreeNode.Count > 0 then
    begin
     for i := 0 to Pred(TreeNode.Count) do
      begin
       level := MaxLevel(TreeNode.Item[i]);
       if Result < level then
        Result := level;
      end
    end;
  end;
begin
  if Assigned(TreeNode) then
   Result := MaxLevel(TreeNode) - TreeNode.AbsoluteIndex
 else
   Result := -1;
end;

var
    FolderID, Res, I : Integer;
    StartIdx, EndIdx : Integer;
    TreeNode : TTreeNode;
begin
  Result:= false;

  if GroupTree.Selected = nil then
   Exit;

   TreeNode:= GroupTree.Selected;

 if FConfirmOnDelFolder then
  begin
   Res:= ShowMSDlg(PWideChar(Format(ID_MSG_0020, [GroupTree.Selected.Text])), PWideChar(ID_MSG_0009), MB_ICONQUESTION or MB_YESNO);
   // Res := ShowMSDlg(PChar('Are you sure you want to delete the folder " ' + GroupTree.Selected.Text + ' and all its content?'), 'Confirm deletion', MB_ICONQUESTION or MB_YESNO);
  if Res = ID_NO then
   Exit;
  end;


  if TreeNode.HasChildren then
   begin
     StartIdx:= GroupTree.Selected.AbsoluteIndex;
     EndIdx:= GetHeight(TreeNode) + GroupTree.Selected.AbsoluteIndex;
    for I := EndIdx downto StartIdx do
     begin
       FolderID := Integer(GroupTree.Items[i].Data); << Pointer
       GroupTable.Filtered := False;
       GroupTable.IndexName:= 'ID';
      if GroupTable.FindKey([FolderID]) then
       begin
         GroupTable.Delete;
         ValueTable.Filtered := False;
         ValueTable.IndexName:= 'ByFolderID';
        while ValueTable.FindKey([FolderID]) do
         begin
          ValueTable.Delete;
         end;
        GroupTree.Items[i].Delete;
       end;
     end;
   end
  else
   begin
     FolderID := Integer(TreeNode.Data); << Pointer
     GroupTable.Filtered := False;
     GroupTable.IndexName := 'ID';
    if GroupTable.FindKey([FolderID]) then
     begin
       GroupTable.Delete;
       ValueTable.Filtered := False;
       ValueTable.IndexName:= 'ByFolderID';
      while ValueTable.FindKey([FolderID]) do
       begin
        ValueTable.Delete
       end;
      TreeNode.Delete;
     end;
   end;

 Result:= true;
end;
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Brauche hilfe mit der VirtualTreeview

  Alt 15. Apr 2012, 12:23
Vielleicht hilft dir das ja weiter...
Angehängte Dateien
Dateityp: zip VTree.zip (632,9 KB, 56x aufgerufen)
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#3

AW: Brauche hilfe mit der VirtualTreeview

  Alt 19. Apr 2012, 07:59
Hi
Sorry dass ich mich erst jetzt melde, ich hatte bis jetzt keine Zeit das zu testen.
Ich habe den Code ein wenig angepasst und wie es scheint funzt es!
jetzt muss ich nur noch mein Programm an die VirtualTreeview anpassen.

Besten danke für deine Hilfe!!!
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#4

AW: Brauche hilfe mit der VirtualTreeview

  Alt 7. Mai 2012, 08:43
Hi
Wie es aussieht klappt es doch noch nicht so recht. Insbesondere mit der GroupList_Fill Funktion
Und ich finde den feiler nicht, ich arbeite mit der Absolute Database 7.0x
Wie es scheint wird alles richtig in die DB gespeichert aber beim Auslesen werden einige Einträge
Falsch dargestellt

Ich habe auch drei Bilder im Anhang.

Bild1. wenn ich das erste mall in eine Lehre DB Schreibe, alles OK
Bild2. Wen ich das Programm neu starte und die DB Lade dann noch einige eintrage mach, die zuletzt gemachten Einträge werden beim nächstem laden der DB falsch angezeigt.



Delphi-Quellcode:

 (* Folder Table *)

 with Folder_Table do
  begin
    DatabaseName:= 'MyDBv2';
    TableName:= 'FolderList';
   with AdvFieldDefs do
    begin
     Clear;
     Add('ID', aftAutoIncLargeint, 0, false);
     Add('ParentID', aftLargeint);
     Add('Title', aftWidestring, 255);
  // Add('IconID', aftLargeint);
     Add('Image', aftGraphic, 0, false, caZLIB, 4);
    end;
   with IndexDefs do
    begin
     Clear;
     Add('ID', 'ID', [ixPrimary]);
     Add('ByParentID', 'ParentID', []);
     Add('Title', 'Title', []);
    end
  end;

(******************************* Fill Folder-List *****************************)

function TMain_Form.FolderList_Fill(ExpandedNood : Boolean) : boolean;
 procedure FillTreeNode(Parent: PVirtualNode);
 var Node: PVirtualNode;
     Data: PNodeData;
 begin
  if Assigned(Parent) then
   begin

     Data:= FolderTree.GetNodeData(Parent);
     Folder_Table.Filter:= 'ParentID = ' + IntToStr(Data^.ID);
     Folder_Table.Filtered:= true;
     Folder_Table.First;
    while not Folder_Table.Eof do
     begin
      Node:= FolderTree.AddChild(Parent);
      Data:= FolderTree.GetNodeData(Node);
      Data^.ID:= Folder_Table.FieldByName('ID').AsLargeInt;
      Data^.Caption:= Folder_Table.FieldByName('Title').AsWideString;
      Folder_Table.Next;
     end;

     Node:= Parent.FirstChild;
    while Assigned(Node) do
     begin
      FillTreeNode(Node);
      FolderTree.Expanded[Node]:= true;
      Node:= Node.NextSibling;
     end;

   end;
 end;

 var Node: PVirtualNode;
     Data: PNodeData;
begin
  Result:= False;
  FolderTree.BeginUpdate;
 try
  FolderTree.Clear;
  Node:= FolderTree.AddChild(Nil);
  Data:= FolderTree.GetNodeData(Node);
  Data^.ID:= 0;
  Data^.Caption:= 'My Data';
  FillTreeNode(Node);
  FolderTree.Expanded[Node]:= ExpandedNood;
 finally
  FolderTree.EndUpdate;
  RecordGrid_Fill(0);
  Result:= True;
 end;
end;

(******************************* Add New Folder *******************************)

function TMain_Form.FolderList_Add(Title : Widestring) : Boolean;
var Node : PVirtualNode;
     NodeData : PNodeData;
     ParentID : Int64;
begin
  Result:= False;
  Node:= FolderTree.FocusedNode;
 try
  if Assigned(Node) then
   begin
   {
    if FolderTree.AbsoluteIndex(Node) = 0 then
    ParentID:= 0;
    if FolderTree.AbsoluteIndex(Node) > 0 then
    }

     ParentID:= Int64(FolderTree.AbsoluteIndex(Node));

     Folder_Table.Filtered:= False;
     Folder_Table.Append;
     Folder_Table.FieldByName('ParentID').AsLargeInt:= ParentID;
     Folder_Table.FieldByName('Title').AsWideString:= Title;


     Node:= FolderTree.AddChild(Node);
     NodeData:= FolderTree.GetNodeData(Node);
     NodeData^.ID:= Folder_Table.FieldByName('ID').AsLargeInt;
     NodeData^.Caption:= Folder_Table.FieldByName('Title').AsWideString;

     Folder_Table.Post;

     FolderTree.GetLast();
     FolderTree.Selected[Node]:= true;
    // FolderTree.EditNode(Node, -1);

   end;
 finally
  Result:= True;
 end;
end;

(******************************* Reaname Folder *******************************)

function TMain_Form.FolderList_Rename(Title : Widestring) : Boolean;
var Node: PVirtualNode;
     NodeData: PNodeData;
     FolderData : TFolderData;
     FolderID : Int64;
begin
  Result:= false;
  Node:= FolderTree.FocusedNode;
 try
  if Assigned(Node) then
   begin
     FolderID:= FolderTree.AbsoluteIndex(Node);
     Folder_Table.Filtered:= False;
     Folder_Table.IndexName:= 'ID';
    if Folder_Table.FindKey([FolderID]) then
     begin
      FolderData.Title:= Title;
      Folder_Table.Edit;
      Folder_Table.FieldByName('Title').AsWideString:= Title;
      Folder_Table.Post;

      NodeData:= FolderTree.GetNodeData(Node);
      NodeData.Caption:= Title;
     end;
   end;
 finally
  Result:= True;
 end;
end;
thx
Miniaturansicht angehängter Grafiken
bild1.jpg   bild2.jpg   bild3.jpg  
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Brauche hilfe mit der VirtualTreeview

  Alt 7. Mai 2012, 23:45
Wenn es an der Sortierung liegt, liegt es vielleicht an deinem SQL-Statement. Hast du da ein ORDER BY drin?

Wie sieht deine Datenbanktabelle aus (Inhalt).
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#6

AW: Brauche hilfe mit der VirtualTreeview

  Alt 8. Mai 2012, 06:30
Hi.
Zitat:
liegt es vielleicht an deinem SQL-Statement. Hast du da ein ORDER BY drin?
Nein!

Zitat:
Wie sieht deine Datenbanktabelle aus (Inhalt).
Siehe Bild3

DB Struktur
Delphi-Quellcode:
 

    DatabaseName:= 'MyDBv2';
    DatabaseFileName:= DBFilename;
    PageSize:= 2048;
    PageCountInExtent:= 4;
    MaxConnections:= 1;
    MultiUser:= false;
    Exclusive:= true;
   if Exists then
    begin
     Close;
     DeleteDatabase;
    end;

 (* Folder Table *)

 with Folder_Table do
  begin
    DatabaseName:= 'MyDBv2';
    TableName:= 'FolderList';
   with AdvFieldDefs do
    begin
     Clear;
     Add('ID', aftAutoIncLargeint, 0, false);
     Add('ParentID', aftLargeint);
     Add('Title', aftWidestring, 255);
  // Add('IconID', aftLargeint);
     Add('Image', aftGraphic, 0, false, caZLIB, 4);
    end;
   with IndexDefs do
    begin
     Clear;
     Add('ID', 'ID', [ixPrimary]);
     Add('ByParentID', 'ParentID', []);
     Add('Title', 'Title', []);
    end
  end;

Ich habe denselben Code mit der Standard “ TTreeView getestet und es funzt!
in fact ich wollte nur die Standard TTreeView durch die VirtualTreeview tauschen.
So abgesehen von der VirtualTreeview und Versions Nr. der DB von v6.5 nach v7.0
hat sich nichts geändert.

Ich denke langsam es könnte an der DB Liegen



thx
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#7

AW: Brauche hilfe mit der VirtualTreeview

  Alt 9. Mai 2012, 04:46
Hi
Ok! Habe den feiler gefunden, scheint so das mein Gehirn einen kleinen Aussetzer hatte!

In der Funktion FolderList_Add(); habe ich ParentID:= FolderTree.AbsoluteIndex(Node); Benutzt anstatt
Delphi-Quellcode:
     Data:= FolderTree.GetNodeData(Node);
     ParentID:= Data^.ID;
Noch einmal Danke für deine Hilfe!!!!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:12 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