Type PItemInfo = ^TItemInfo;
TItemInfo = Record
Typ : Integer; //folder or item
ID : Integer; //RecordID
PID : Integer; //ParentID
Name : String[50];
end;
Function TF_AG.FindParent(Tree : TVirtualStringTree; ID,TYP : Integer) : PVirtualNode;
var I : Integer;
Node : PVirtualNode;
AData : PItemInfo;
found : Boolean;
begin
Result := Nil;
Node := Tree.GetFirstNode;
found := False;
while (Node <> nil) and not(found) do
begin
Adata := Tree.GetNodeData(Node);
found := (AData.ID = ID) and
(AData.Typ = Typ);
if not Found then
Node := Tree.GetNext(Node);
end;
If found then
result := Node;
end;
procedure TF_AG.SB_RefreshClick(Sender: TObject);
var
PForm : TfrmProgress;
PCount : Integer;
SNode,ANode : PVirtualNode;
List : TList;
I : Integer;
SCount : Integer;
SData,AData : PItemInfo;
begin
PForm := TfrmProgress.Create(Self);
TreeView1.BeginUpdate;
if Assigned(Parent) then
Parent.Enabled := False;
try
Q_Count.SQL.Text := 'Select Count(AGG_ID) From AGG';
Try
Q_Count.Prepare;
Q_Count.Open;
PCount := Q_Count.Fields[0].AsInteger;
Q_Count.Close;
except
Raise;
end;
PForm.ProgressBar1.Max := PCount;
PForm.ProgressBar1.Position := 0;
PForm.ProgressBar1.Step := 1;
PForm.Label1.Caption := 'Lade Gruppen für Arbeitsgänge';
Application.ProcessMessages;
PForm.Show;
FTreeInsert := True;
TreeView1.Clear;
List := TList.Create;
Try
//Caching Information
Q_AGG.SQL.Text := 'Select AGG_ID,AGG_PID,AGG_NAME from AGG order by AGG_PID,AGG_NAME';
Q_AGG.Prepare;
try
Q_AGG.Open;
except
raise;
end;
While Not Q_AGG.Eof do
Begin
New(ItemInfo);
ItemInfo^.Typ := 0;
ItemInfo^.ID := Q_AGG.FieldByName('AGG_ID').AsInteger;
If Q_AGG.FieldByName('AGG_PID').IsNull then
ItemInfo^.PID := -1
else
ItemInfo^.PID := Q_AGG.FieldByName('AGG_PID').AsInteger;
ItemInfo^.Name := Q_AGG.FieldByName('AGG_NAME').AsString;
List.Add(ItemInfo);
Q_AGG.Next;
PForm.ProgressBar1.StepIt;
End;
Q_AGG.Close;
//Add Roots First
I := 0;
PForm.ProgressBar1.Max := PCount;
PForm.ProgressBar1.Position := 0;
PForm.ProgressBar1.Step := 1;
PForm.Label1.Caption := 'Ordne Gruppen für Arbeitsgänge';
Application.ProcessMessages;
While I < List.Count do
Begin
If PItemInfo(List[i])^.PID = -1 then
begin
PForm.ProgressBar1.StepIt;
end
else inc(i);
end;
//Add Rest of Group
While List.Count > 0 do
Begin
SCount := List.Count;
I := 0;
While I < List.Count do
Begin
ANode := FindParent(TreeView1,PItemInfo(List[i])^.PID,0);
If ANode <> Nil then
Begin
ANode := TreeView1.AddChild(ANode);
AData := TreeView1.GetNodeData(ANode);
AData.ID := PItemInfo(List[I])^.ID;
AData.PID := PItemInfo(List[I])^.PID;
AData.Typ := PItemInfo(List[I])^.Typ;
AData.Name := PItemInfo(List[I])^.Name;
try
Dispose(PItemInfo(List[i]));
except
end;
List.Delete(i);
PForm.ProgressBar1.StepIt;
end
else inc(i);
end;
//Konnte nichts mehr zugeordnet werden,
//und es liegen noch Einträge vor,
//dann kann was nicht stimmen
If List.Count = SCount then
Raise Exception.Create('Es liegt ein Dateninkonsistenz vor!'+#10+'Benachrichtigen Sie den Entwickler!');
end;
finally
List.Free;
end;
//Nun zu den Nicht-Gruppen Einträgen
i := 0;
Q_Count.SQL.Text := 'Select Count(AG_ID) From AG';
Try
Q_Count.Prepare;
Q_Count.Open;
PCount := Q_Count.Fields[0].AsInteger;
Q_Count.Close;
except
Raise;
end;
PForm.ProgressBar1.Max := PCount;
PForm.ProgressBar1.Position := 0;
PForm.ProgressBar1.Step := 1;
PForm.Label1.Caption := 'Lade und Ordne Items für Arbeitsgänge';
Application.ProcessMessages;
Q_AG.Open;
try
While Not Q_AG.Eof do
begin
SNode := FindParent(TreeView1,Q_AG.FieldByName('AG_AGG_ID').AsInteger,0);
if assigned(SNode) then
begin
ANode := TreeView1.AddChild(SNode);
AData := TreeView1.GetNodeData(ANode);
AData.Typ := 1;
AData.ID := Q_AG.FieldByName('AG_ID').AsInteger;
AData.PID := 0;
AData.Name := Q_AG.FieldByName('AG_NAME').AsString;
PForm.ProgressBar1.StepIt;
end
else
Raise Exception.Create('Es liegt ein Dateninkonsistenz vor!'+#10+'Benachrichtigen Sie den Entwickler (2)!');
Q_AG.Next;
end;
finally
Q_AG.Close;
end;
FTreeInsert := False;
TreeView1.FullCollapse;
If TreeView1.GetFirstNode <> Nil then
begin
TreeView1.Selected[TreeView1.GetFirstNode] := True;
TreeView1.FocusedNode := TreeView1.GetFirstNode;
end;
FAG_EditContext := AGG;
FAG_EditState := AG_Browse;
AdJustNav;
finally
if Assigned(Parent) then
Parent.Enabled := True;
TreeView1.EndUpdate;
PForm.Release;
Application.ProcessMessages;
end;
end;