2006. május 12., péntek

How to use a TTreeView to list all available reports in a program


Problem/Question/Abstract:

I am trying to use the TTreeView to list all the available reports in my application. I would like to click on a specific treenode and then click an button to print a specific report. I don't know what property to use or how can I go about getting the results.

Answer:

Solve 1:

There are a few ways to do this. The way I usually do this is to allocate memory for the report name and then add this as a pointer to the node. You can then dereference the pointer to get the info back. Here's an example of attaching information from a database.

if wwTable5.RecordCount > 0 then
begin
  TreeNode := Items.AddChildObject(CurrentPatient, 'Treatments', nil);
  TreeNode.ImageIndex := 5;
  TreeNode.SelectedIndex := 5;
  wwTable5.First;
  while not wwTable5.EOF do
  begin
    New(NodeRecord);
    NodeRecord^.RecType := Treatment;
    NodeRecord^.RecInfo := wwTable5Number.AsInteger;
    Items.AddChildObject(TeeNode, 'Course: ' + wwTable5CourseNumber.AsString,
      NodeRecord);
    wwTable5.Next;
  end;
end;

I'm allocating a record, filling it with info from the database and then adding the node. You can also cast an integer to a pointer and add it as the object pointer. You can then cast it back to an integer and retrieve the information associated with the node.

Here's an example of getting the info back out of the node:

SelectedNode := SelectedNode.GetFirstChild;
while SelectedNode <> nil do
begin
  if PNodeType(SelectedNode.data)^.RecInfo = FindPatient then
    break;
  SelectedNode := SelectedNode.GetNextSibling;
end;


Solve 2:

If you have a two level tree (node -> subnodes(your_reports)). To determine what item is selected use property TTreeView.Selected:

procedure TForm1.PrintButtonClick(Sender: TObject);
var
  SelectedNode: TTreeNode;
  i: integer;
begin
  SelectedNode := TTreeView1.Selected;
  for i := 0 to SelectedNode.Count - 1
  begin
    if SelectedNode.Item[i].Selected then
      MyPrintReport_procedure(Item[i].Text);
  end;
end;

Nincsenek megjegyzések:

Megjegyzés küldése