## FindObjectAt

Please discuss general Delphi programming topics here.

### FindObjectAt

Hi!

(I am new to Delphi, but still trying )

I am trying to draw a 'tree-like' directed graph with TSimpleGraph. The graph consists of nodes and links between the nodes in a 'collect-like' fashion.

What i mean is that i draw a link from a 'parent' node to another, horizontal link below it. Then i loop through the nodes that are supposed to be below that link and for each node that should, will get a link from the horizontal link to itself.

And i though of using the 'SimpleGraph.FindObjectAt(X,Y, [LookAfter:TGraphObject])' function to find the horizontal link again since i re-use the variable for it to draw another horizontal link elsewhere before i draw the nodes for the first horizontal link.

The problem is that the function gives me only 'nil' as an answer, eventhough i know that there should be a Link in the point i use the function on. (The horizontal links are always at the same height from the nodes)

So what am i doing wrong? Please give me some help, i am all new to Delphi too.
/VEIN
(Trying to become a Delphi-Developer)
Vein
Member

Posts: 3
Joined: January 29th, 2007, 3:27 pm

X and Y are in Graph coordinates. Did you pass the correct coordinates?

• To convert Screen to Graph coordinates use ScreenToGraph method.
• To convert SG's Client to Graph coordinates use ClientToGraph method.
Kambiz

Kambiz

Posts: 2424
Joined: March 7th, 2003, 7:10 pm

Kambiz wrote:X and Y are in Graph coordinates. Did you pass the correct coordinates?

• To convert Screen to Graph coordinates use ScreenToGraph method.
• To convert SG's Client to Graph coordinates use ClientToGraph method.

Hmm...the coordinates i gave the function is in the same format as the ones that i gave to the 'insertLink(array of Tpoint)' function. That should make them Client coordinates, right? But still when i tested that, i got nil as answer... Going to do some more testing...

/VEIN
(Trying to become a Delphi-Developer)
Vein
Member

Posts: 3
Joined: January 29th, 2007, 3:27 pm

The InsertLink method - as like as other graph related methods - uses graph coordinates.

Can you please post here a sample code to regenerate the issue?
Kambiz

Kambiz

Posts: 2424
Joined: March 7th, 2003, 7:10 pm

Kambiz wrote:The InsertLink method - as like as other graph related methods - uses graph coordinates.

Can you please post here a sample code to regenerate the issue?

Ok, first i insert the Link by:

Code: Select all
LinkPoints[1].X := Round(GraphStruct.Node(i).X -((GraphStruct.Node(i).CountLinks-countNotIn)/2*nodeWidth+spaceBetween));//Put link one nodeHeight below the node LinkPoints[1].Y := Round(GraphStruct.Node(i).Y+nodeHeight);LinkPoints[2].X := Round(GraphStruct.Node(i).X+nodeWidth + ((GraphStruct.Node(i).CountLinks- countNotIn)/2*nodeWidth+spaceBetween));        LinkPoints[2].Y := Round(GraphStruct.Node(i).Y+nodeHeight);LinkBetween := Graph.InsertLink(LinkPoints);LinkBetween.EndStyle := lsNone;

Where:
GraphStruct is an ordinary adj. list structure for graphs

I hope the rest is obvious.

Then i try to find the link again by:

Code: Select all
Node := NodeSearch(Target,GraphStruct);LinkBetween := TGraphLink(Graph.FindObjectAt(Node.Left,Node.Top-nodeHeight));if(LinkBetween = nil) then   LinkBetween := TGraphLink(Graph.FindObjectAt(Node.Left+nodeWidth,Node.Top-nodeHeight));

And here the NodeSearch function is tested and working. And it the node is previously added '2*nodeHeight' below the parent node below which the 'LinkBetween' is added.
/VEIN
(Trying to become a Delphi-Developer)
Vein
Member

Posts: 3
Joined: January 29th, 2007, 3:27 pm