For a project at Oasis Digital, we need to show the end user a graphical representation of a graph (in the “graph theory” sense of the word). The application is written in Delphi, and in looking around I didn’t find any native Delphi components for doing that.
I did find GraphViz, and a COM Wrapper for it called WinGraphViz. Wiring the latter up to Delphi turned out to be quite easy. The minimal code to do it, for a demo app, is below. To make this compile you’ll need to import the type library for WinGraphviz.
procedure TExampleForm.DrawGraphForData(Data: string); var Dot: IDot; Image: IBinaryImage; ImageFileName: string; begin ImageFileName := 'c:image.gif'; Dot := CoDOT.Create; Image := Dot.ToGIF(Data); Image.Save(ImageFileName); WebBrowser1.Navigate('file:///C:/image.gif'); end;
Production code would probably use a better way of getting the generated graph on to the screen. GraphViz support imagemaps, making it easy to make the notes clickable. It can draw various arrow types, node shapes, etc., and tries to lay out graphs in a readable way, without crossing lines, etc.
A trivial sample app looks like this:
Update: a correspondent pointed out that the graphic example above is a bit ugly, with non-anti-aliased lines and fonts. To resolve that, I turned to SVG; GraphViz can produce output in SVG format (among others), and the freely downloadable Adobe SVG Viewer can display them.
With slightly different code:
ImageFileName := 'c:image.svg'; Dot := CoDOT.Create; Image := Dot.ToSVGZ(Data); Image.Save(ImageFileName); WebBrowser1.Navigate('file:///C:/image.svg');
We get an application with this appearance:
You can download the Delphi WinGraphViz Sample Application Source code.