![]() |
Brauche hilfe mit der VirtualTreeview
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; |
AW: Brauche hilfe mit der VirtualTreeview
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht hilft dir das ja weiter...
|
AW: Brauche hilfe mit der VirtualTreeview
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!!! :thumb: |
AW: Brauche hilfe mit der VirtualTreeview
Liste der Anhänge anzeigen (Anzahl: 3)
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 ![]() 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:
thx(* 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; |
AW: Brauche hilfe mit der VirtualTreeview
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). |
AW: Brauche hilfe mit der VirtualTreeview
Hi.
Zitat:
Zitat:
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 |
AW: Brauche hilfe mit der VirtualTreeview
Hi
Ok! Habe den feiler gefunden, scheint so das mein Gehirn einen kleinen Aussetzer hatte! :oops: In der Funktion FolderList_Add(); habe ich ParentID:= FolderTree.AbsoluteIndex(Node); Benutzt anstatt
Delphi-Quellcode:
Noch einmal Danke für deine Hilfe!!!!
Data:= FolderTree.GetNodeData(Node);
ParentID:= Data^.ID; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz