Hallo,
I heb me code aangepast, en het is nu wat sneller,
maar nu worden er ge
en subnodes meer aangemaakt, en in het resultaat zijn de waardes for the columns opgeschoven.
Waar ik een naam had, heb ik nu een basename met wat onbekende data en waar een basename moet zijn, is het leeg.
En zo zijn er nog wel een paar.
Code:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf,
FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, FireDAC.UI.Intf,
FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Phys, FireDAC.VCLUI.Wait,
FireDAC.Comp.Client, Vcl.StdCtrls, VirtualTrees, Data.DB, FireDAC.Comp.DataSet,
FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs,
Generics.Collections,system.ioutils;
type
TForm1 = class(TForm)
SwitchQuery: TFDQuery;
dbconnection: TFDConnection;
SwitchTree: TVirtualStringTree;
procedure FormCreate(Sender: TObject);
procedure SwitchTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
procedure FormDestroy(Sender: TObject);
private
FIndex : Tstringlist;
procedure BuildTree;
function NodeWithBaseName (const BaseName : string) : PVirtualNode;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//---------------------------------
function TForm1.NodeWithBaseName (const BaseName: string): PVirtualNode;
var
SavedRecNo : Integer;
Node : PVirtualNode;
idx : Integer;
begin
idx := FIndex.IndexOf(BaseName);
if idx <> -1 then
result := PVirtualNode(FIndex.Objects[idx])
else
result := nil;
// Result := nil;
// SavedRecNo := SwitchQuery.RecNo;
// try
// Node := SwitchTree.GetFirst;
// while Node.IsAssigned do
// begin
// SwitchQuery.RecNo := Node.GetData<Integer>;
// if SwitchQuery.Fields.FieldByName ('Basename').AsString = BaseName then
// Exit (Node);
// Node := SwitchTree.GetNext (Node);
// end;
// finally
// SwitchQuery.RecNo := SavedRecNo;
// end;
end;
//---------------------------------
procedure TForm1.BuildTree;
var
Node : Tobject;
begin
SwitchTree.BeginUpdate;
SwitchQuery.First;
while (not SwitchQuery.Eof) do
begin
FIndex.AddObject(SwitchQuery.Fields.FieldByName ('Basename').AsString, Node);
if SwitchQuery.Fields.FieldByName ('ID').AsString.EndsWith ('000') then
SwitchTree.AddChild (nil, Pointer (SwitchQuery.RecNo));
SwitchQuery.Next;
end;
SwitchQuery.First;
while (not SwitchQuery.Eof) do
begin
if not SwitchQuery.Fields.FieldByName ('ID').AsString.EndsWith ('000') then
SwitchTree.AddChild (NodeWithBaseName (SwitchQuery.Fields.FieldByName ('Basename').AsString), Pointer (SwitchQuery.RecNo));
SwitchQuery.Next;
end;
SwitchTree.EndUpdate;
end;
//---------------------------------
procedure TForm1.SwitchTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
SavedRecNo : Integer;
begin
if not Column in [0..3] then Exit;
SavedRecNo := SwitchQuery.RecNo;
try
SwitchQuery.RecNo := Node.GetData<Integer>;
CellText := SwitchQuery.Fields[Column].AsString;
finally
SwitchQuery.RecNo := SavedRecNo;
end;
end;
//---------------------------------
procedure TForm1.FormCreate (Sender: TObject);
begin
SwitchTree.NodeDataSize := SizeOf (Integer);
dbconnection.Params.Database := '..\..\database.db';
dbconnection.Params.Values['FailIfMissing'] := 'False';
dbconnection.Params.Values['SharedCache'] := 'True';
dbconnection.Open;
SwitchQuery.SQL.Text := 'SELECT * FROM SWITCHDATA';
SwitchQuery.Open;
SwitchQuery.Last;
FIndex:=tstringlist.Create;
BuildTree;
end;
//---------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
begin
dbconnection.Close;
end;
//---------------------------------
end.
Bookmarks