home *** CD-ROM | disk | FTP | other *** search
/ CD Actual Thematic 25: Programming / pc_actual_25.iso / Delphi / TeeChartPro / TeeChart5Delphi5Eval.exe / %MAINDIR% / Examples / Features / Main.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-09-10  |  16.7 KB  |  653 lines

  1. (*
  2. {***************************************}
  3. { TeeChart Pro version 5                }
  4. { Many examples and demos.              }
  5. { Copyright 1995-2000 by David Berneda. }
  6. { All Rights Reserved.                  }
  7. {***************************************}
  8. *)
  9.  
  10. {$I TeeDefs.inc}
  11. unit Main;
  12.  
  13. interface
  14.  
  15. uses
  16.    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  17.    ComCtrls, Chart, {$IFDEF D4}ImgList,{$ENDIF} ExtCtrls, StdCtrls, TeeAbout,
  18.    Menus, Buttons, TeeProcs, TeeDraw3D
  19.    {$IFDEF D5}
  20.    ,SHDocVw
  21.    {$ENDIF}
  22.    ;
  23.  
  24. type
  25.   TTee5Form = class(TForm)
  26.     StatusBar1: TStatusBar;
  27.     Splitter1: TSplitter;
  28.     Panel2: TPanel;
  29.     Panel3: TPanel;
  30.     Button1: TButton;
  31.     Images: TImageList;
  32.     PopupMenu1: TPopupMenu;
  33.     ShowAll1: TMenuItem;
  34.     Button2: TSpeedButton;
  35.     Draw3D1: TDraw3D;
  36.     BPrevious: TSpeedButton;
  37.     BNext: TSpeedButton;
  38.     Label1: TLabel;
  39.     PageControl1: TPageControl;
  40.     TabSheet1: TTabSheet;
  41.     TreeView1: TTreeView;
  42.     TabSheet2: TTabSheet;
  43.     TreeView2: TTreeView;
  44.     Timer1: TTimer;
  45.     Presentation1: TMenuItem;
  46.     Memo2: TMemo;
  47.     Memo1: TMemo;
  48.     Timer2: TTimer;
  49.     PageExample: TPageControl;
  50.     TabExample: TTabSheet;
  51.     TabSource: TTabSheet;
  52.     TabWeb: TTabSheet;
  53.     Generatehtm1: TMenuItem;
  54.     ButtonConfig: TButton;
  55.     procedure FormCreate(Sender: TObject);
  56.     procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
  57.     procedure BNextClick(Sender: TObject);
  58.     procedure BPreviousClick(Sender: TObject);
  59.     procedure Button1Click(Sender: TObject);
  60.     procedure Label1Click(Sender: TObject);
  61.     procedure Button2Click(Sender: TObject);
  62.     procedure ShowAll1Click(Sender: TObject);
  63.     procedure TreeView1GetImageIndex(Sender: TObject; Node: TTreeNode);
  64.     procedure TreeView1GetSelectedIndex(Sender: TObject; Node: TTreeNode);
  65.     procedure Draw3D1AfterDraw(Sender: TObject);
  66.     procedure PageControl1Change(Sender: TObject);
  67.     procedure Presentation1Click(Sender: TObject);
  68.     procedure Timer1Timer(Sender: TObject);
  69.     procedure FormDestroy(Sender: TObject);
  70.     procedure Timer2Timer(Sender: TObject);
  71.     procedure FormShow(Sender: TObject);
  72.     procedure PageExampleChange(Sender: TObject);
  73.     procedure ButtonConfigClick(Sender: TObject);
  74.     procedure Generatehtm1Click(Sender: TObject);
  75.   private
  76.      { Private declarations }
  77.      RichEditCode    : TRichEdit;
  78.      tmpForm         : TForm;
  79.      FiveFontColor   : TColor;
  80.      FiveBorderColor : TColor;
  81.      OldCodeFile     : String;
  82.      {$IFDEF D5}
  83.      WebBrowser1     : TWebBrowser;
  84.      {$ENDIF}
  85.      procedure ShowForm(ATree:TTreeView);
  86.      procedure ShowFormClass(AClass: TFormClass);
  87.      Function TheTree:TTreeView;
  88.      Function CodeFile:String;
  89.   public
  90.      { Public declarations }
  91.   end;
  92.  
  93. var
  94.    Tee5Form: TTee5Form;
  95.  
  96. implementation
  97.  
  98. {$R *.DFM}
  99.  
  100. Uses TeCanvas, MMSystem, Registry, FileCtrl
  101.  
  102.      {$IFDEF D4}
  103.      ,Chart_Actions
  104.      ,Axis_Millisec
  105.      ,Chart_FreeAllSeries
  106.      ,ValueList_Modified
  107.      ,Series_ValueList
  108.      ,Template_Chart
  109.      ,Canvas_RotCenter
  110.      ,Chart_PrintPreview
  111.      ,Map_Series
  112.      {$ENDIF};
  113.  
  114. type PTeeFormInfo=^TTeeFormInfo;
  115.      TTeeFormInfo=packed record
  116.        FormClass : TFormClass;
  117.        UnitName  : String;
  118.      end;
  119.  
  120. procedure TTee5Form.FormCreate(Sender: TObject);
  121.  
  122.   Procedure LoadTree(ATree:TTreeView; AMemo:TMemo);
  123.   var i,
  124.       t        : Integer;
  125.       tmpClass : String;
  126.       tmpUnit  : String;
  127.       tmp      : TStringStream;
  128.       FormInfo : PTeeFormInfo;
  129.  begin
  130.     tmp:=TStringStream.Create(AMemo.Lines.Text);
  131.     try
  132.       ATree.LoadFromStream(tmp);
  133.     finally
  134.       tmp.Free;
  135.     end;
  136.  
  137.     with ATree do
  138.     begin
  139.       for t:=0 to Items.Count-1 do
  140.       with Items[t] do
  141.       begin
  142.         i:=Pos(',', Text);
  143.         if i>0 then
  144.         begin
  145.           tmpClass:=Copy(Text, i+1, Length(Text));
  146.           Text:=Copy(Text, 1, i-1);
  147.  
  148.           tmpUnit:='';
  149.           i:=Pos(',',tmpClass);
  150.           if i>0 then
  151.           begin
  152.             tmpUnit:=Copy(tmpClass,i+1,Length(tmpClass));
  153.             tmpClass:=Copy(tmpClass,1,i-1);
  154.           end;
  155.  
  156.           {$IFNDEF D4}
  157.           if (tmpClass='TRotationCenter') or
  158.              (tmpClass='TChartActionsForm') or
  159.              (tmpClass='TFreeAllSeriesForm') or
  160.              (tmpClass='TValueListModified') or
  161.              (tmpClass='TDynArrays') or
  162.              (tmpClass='TMouseWheelForm') or
  163.              (tmpClass='TTemplateChart') or
  164.              (tmpClass='TChartPrintPreviewForm') or
  165.              (tmpClass='TAxisMillisec') or
  166.              (tmpClass='TMapSeriesForm') then
  167.                 tmpClass:='TDelphi3NotAvail';
  168.           {$ENDIF}
  169.  
  170.           New(FormInfo);
  171.           FormInfo.FormClass:=TFormClass(FindClass(tmpClass));
  172.           FormInfo.UnitName:=tmpUnit;
  173.           Data:=FormInfo;
  174.         end;
  175.       end;
  176.       Items[0].Expand(False);
  177.     end;
  178.  end;
  179.  
  180. begin
  181.   PageControl1.ActivePage:=TabSheet1;
  182.   LoadTree(TreeView1,Memo1);
  183.   LoadTree(TreeView2,Memo2);
  184.   TreeView1.Items[0].Item[0].Expand(False);
  185.   {$IFDEF D4}
  186.   TreeView1.HotTrack:=True;
  187.   TreeView2.HotTrack:=True;
  188.   PageExample.HotTrack:=True;
  189.   {$ENDIF}
  190.   FiveFontColor:=clRed;
  191.   FiveBorderColor:=clWhite;
  192. end;
  193.  
  194. procedure TTee5Form.ShowFormClass(AClass: TFormClass);
  195. begin
  196.   { create and insert a Form, then show it... }
  197.   tmpForm:=AClass.Create(Self);
  198.   with tmpForm do
  199.   begin
  200.     Visible:=False;
  201.     BorderStyle:=bsNone;
  202.     Parent:=TabExample;
  203.     Align:=alClient;
  204.     Show;
  205.   end;
  206. end;
  207.  
  208. { Find the Form corresponding to the Tree item, and create it }
  209. procedure TTee5Form.ShowForm(ATree:TTreeView);
  210. var tmp : Pointer;
  211. begin
  212.   if ATree.Selected<>nil then
  213.   begin
  214.     tmp:=ATree.Selected.Data;
  215.     if Assigned(tmp) then
  216.     begin
  217.       tmpForm.Free;
  218.       tmpForm:=nil;
  219.       ShowFormClass(PTeeFormInfo(tmp).FormClass);
  220.     end;
  221.     StatusBar1.SimpleText:=ATree.Selected.Text;
  222.   end;
  223. end;
  224.  
  225. { Show the corresponding Form, enable / disable the buttons }
  226. procedure TTee5Form.TreeView1Change(Sender: TObject; Node: TTreeNode);
  227. begin
  228.   PageExample.ActivePage:=TabExample;
  229.   ShowForm(Sender as TTreeView);
  230.   with Sender as TTreeView do
  231.   begin
  232.     BPrevious.Enabled := Assigned(Selected) and (Selected.AbsoluteIndex>0);
  233.     BNext.Enabled := Assigned(Selected) and (Selected.AbsoluteIndex<Items.Count-1);
  234.     TabSource.TabVisible:=CodeFile<>'';
  235.   end;
  236. end;
  237.  
  238. Function TTee5Form.TheTree:TTreeView;
  239. begin
  240.   if PageControl1.ActivePage=TabSheet1 then result:=TreeView1
  241.                                        else result:=TreeView2;
  242. end;
  243.  
  244. procedure TTee5Form.BNextClick(Sender: TObject);
  245. begin
  246.   with TheTree do Items[Selected.AbsoluteIndex+1].Selected := true
  247. end;
  248.  
  249. procedure TTee5Form.BPreviousClick(Sender: TObject);
  250. begin
  251.   with TheTree do Items[Selected.AbsoluteIndex-1].Selected := true
  252. end;
  253.  
  254. procedure TTee5Form.Button1Click(Sender: TObject);
  255. begin
  256.   Close;
  257. end;
  258.  
  259. procedure TTee5Form.Label1Click(Sender: TObject);
  260. begin
  261.   GotoURL(Handle, Label1.Caption);
  262. end;
  263.  
  264. procedure TTee5Form.Button2Click(Sender: TObject);
  265. begin
  266.   TeeShowAboutBox;
  267. end;
  268.  
  269. procedure TTee5Form.ShowAll1Click(Sender: TObject);
  270. var t : Integer;
  271. begin
  272.   With TheTree do
  273.   for t:=0 to Items.Count-1 do
  274.   begin
  275.     Selected:=Items[t];
  276.     Application.ProcessMessages;
  277.   end;
  278. end;
  279.  
  280. Function ImageIndex(Node:TTreeNode):Integer;
  281. begin
  282.   if Node.HasChildren then
  283.      if Node.Expanded then result:= 2
  284.                       else result:= 0
  285.   else
  286.      result:= 1;
  287. end;
  288.  
  289. procedure TTee5Form.TreeView1GetImageIndex(Sender: TObject;
  290.   Node: TTreeNode);
  291. begin
  292.   Node.ImageIndex:=ImageIndex(Node);
  293. end;
  294.  
  295. procedure TTee5Form.TreeView1GetSelectedIndex(Sender: TObject;
  296.   Node: TTreeNode);
  297. begin
  298.   Node.SelectedIndex:=ImageIndex(Node);
  299. end;
  300.  
  301. procedure TTee5Form.Draw3D1AfterDraw(Sender: TObject);
  302. var tmp : TTeeFont;
  303. begin
  304.   With Draw3D1.Canvas do
  305.   begin
  306.     tmp:=TTeeFont.Create(nil);
  307.     try
  308.       With tmp do
  309.       begin
  310.         Name:='Arial Black';
  311.         Color:=clNavy;
  312.         Outline.Color:=clWhite;
  313.         Outline.Style:=psSolid;
  314.         OutLine.Visible:=True;
  315.         OutLine.Width:=1;
  316.         Style:=[fsBold,fsItalic];
  317.         Size:=26;
  318.         Shadow.HorizSize:=2;
  319.         Shadow.VertSize:=2;
  320.       end;
  321.       AssignFont(tmp);
  322.       TextOut(72,-6,'TeeChart Pro');
  323.       tmp.OutLine.Color:=FiveBorderColor;
  324.       tmp.Color:=FiveFontColor;
  325.       AssignFont(tmp);
  326.       TextOut(350,-6,'5');
  327.     finally
  328.       tmp.Free;
  329.     end;
  330.   end;
  331. end;
  332.  
  333. procedure TTee5Form.PageControl1Change(Sender: TObject);
  334. begin
  335.   TreeView1Change(TheTree,TheTree.Selected);
  336. end;
  337.  
  338. procedure TTee5Form.Presentation1Click(Sender: TObject);
  339. begin
  340.   Presentation1.Checked:=not Presentation1.Checked;
  341.   Timer1.Enabled:=Presentation1.Checked;
  342.   if Timer1.Enabled then TheTree.Selected:=TheTree.Items[0];
  343. end;
  344.  
  345. procedure TTee5Form.Timer1Timer(Sender: TObject);
  346. begin
  347.   Timer1.Enabled:=False;
  348.   With TheTree do Selected:=Items[Selected.AbsoluteIndex+1];
  349.   Timer1.Enabled:=True;
  350. end;
  351.  
  352. {$R Sound.Res}
  353.  
  354. Procedure PlaySoundResource(Const Sound:String);
  355. var tmp : Integer;
  356. begin
  357.   tmp:=LoadResource(HInstance,FindResource(HInstance,PChar(Sound),RT_RCDATA));
  358.   PlaySound(LockResource(tmp),HInstance,SND_MEMORY or SND_ASYNC or SND_NODEFAULT);
  359. end;
  360.  
  361. procedure TTee5Form.FormDestroy(Sender: TObject);
  362. begin
  363.   PlaySoundResource('THANKYOU');
  364. end;
  365.  
  366. procedure TTee5Form.Timer2Timer(Sender: TObject);
  367. begin
  368.   Case FiveFontColor of
  369.     clRed   : begin FiveFontColor:=clYellow; FiveBorderColor:=clBlack; end;
  370.     clYellow: begin FiveFontColor:=clBlue;   FiveBorderColor:=clYellow; end;
  371.     clBlue  : begin FiveFontColor:=clGreen;  FiveBorderColor:=clRed; end;
  372.   else        begin FiveFontColor:=clRed;    FiveBorderColor:=clWhite; end;
  373.   end;
  374.   Draw3D1.Repaint;
  375. end;
  376.  
  377. procedure TTee5Form.FormShow(Sender: TObject);
  378. var tmp : String;
  379.  
  380.   Function FindItem(ATree:TTreeView):Boolean;
  381.   var t : Integer;
  382.   begin
  383.     result:=False;
  384.     With ATree do
  385.     for t:=0 to Items.Count-1 do
  386.     if Assigned(Items[t].Data) and
  387.        (UpperCase(PTeeFormInfo(Items[t].Data).FormClass.ClassName)=tmp) then
  388.     begin
  389.       Selected:=Items[t];
  390.       result:=True;
  391.       exit;
  392.     end;
  393.   end;
  394.  
  395. begin
  396.   {$IFNDEF D5}
  397.   TabWeb.TabVisible:=False;
  398.   {$ENDIF}
  399.   if ParamCount>0 then { find a Form... }
  400.   begin
  401.     tmp:=UpperCase(ParamStr(1));
  402.     if not FindItem(TreeView1) then
  403.        if FindItem(TreeView2) then
  404.           PageControl1.ActivePage:=TabSheet2;
  405.   end;
  406.   PageExample.ActivePage:=TabExample;
  407. end;
  408.  
  409. Const Tee5RegistryKey='\Software\Steema Software\TeeChart Pro v5 VCL';
  410.       SteemaDotCom='http://www.steema.com/support/teechart/5/examples';  
  411.  
  412. Function CodePath:String;
  413. begin
  414.   result:='';
  415.   With TRegistry.Create do
  416.   try
  417.     if {$IFNDEF D4}OpenKey{$ELSE}OpenKeyReadOnly{$ENDIF}(Tee5RegistryKey
  418.                      {$IFNDEF D4},False{$ENDIF}) then
  419.        result:=ReadString('DemoPath');
  420.   finally
  421.     Free;
  422.   end;
  423.   if result='' then
  424.      if FileExists('Tee5New.dpr') then
  425.         result:=GetCurrentDir;
  426. end;
  427.  
  428. Function TTee5Form.CodeFile:String;
  429. begin
  430.   if Assigned(TheTree.Selected) and
  431.      Assigned(TheTree.Selected.Data) then
  432.      result:=PTeeFormInfo(TheTree.Selected.Data).UnitName
  433.   else
  434.      result:='';
  435. end;
  436.  
  437. Procedure HighLight(RichEdit:TCustomRichEdit);
  438. var p   : Integer;
  439.     tmp : String;
  440.  
  441.   Function IsKeyword(Const S:String):Boolean;
  442.   Const Keywords:Array[0..33] of String=
  443.          ('UNIT','INTERFACE','BEGIN','IMPLEMENTATION','PROCEDURE','INHERITED',
  444.           'INITIALIZATION','END','CLASS','TYPE','VAR','PRIVATE','PUBLIC',
  445.           'IF','ELSE','WHILE','FOR','REPEAT','RECORD','OBJECT','FUNCTION',
  446.           'STRING','CONST','AND','NOT','IN','DO','THEN','WITH','USES',
  447.           'TRY','FINALLY','EXCEPT','PACKED');
  448.  
  449.   var t:Integer;
  450.   begin
  451.     result:=False;
  452.     for t:=0 to High(Keywords) do
  453.     if Keywords[t]=S then
  454.     begin
  455.       result:=True;
  456.       break;
  457.     end;
  458.   end;
  459.  
  460.   Function NextWordIsKeyword:Boolean;
  461.   Const Valid=['A'..'Z','a'..'z','_'];
  462.   var p2  : Integer;
  463.       Key : String;
  464.   begin
  465.     While p<=Length(tmp) do
  466.     begin
  467.       if (tmp[p] in Valid) then
  468.          break
  469.       else
  470.       if tmp[p]='{' then
  471.       begin
  472.         RichEdit.SelStart:=p-1;
  473.         Inc(p);
  474.         While tmp[p]<>'}' do Inc(p);
  475.         With RichEdit do
  476.         begin
  477.           SelLength:=p-SelStart;
  478.           With SelAttributes do
  479.           begin
  480.             Style:=[fsItalic];
  481.             Color:=clNavy;
  482.           end;
  483.           SelStart:=0;
  484.           SelLength:=0;
  485.         end;
  486.       end
  487.       else Inc(p);
  488.     end;
  489.  
  490.     p2:=p;
  491.     While (p<=Length(tmp)) and (tmp[p] in Valid) do Inc(p);
  492.     if p=Length(tmp) then Inc(p);
  493.     if p>p2 then
  494.     begin
  495.       key:=Copy(tmp,p2,p-p2);
  496.       result:=IsKeyword(UpperCase(Key));
  497.       RichEdit.SelStart:=p2-1;
  498.       RichEdit.SelLength:=p-p2;
  499.       Inc(p);
  500.     end
  501.     else result:=False;
  502.   end;
  503.  
  504. begin
  505.   p:=1;
  506.   tmp:=RichEdit.Lines.Text;
  507.   While p<Length(tmp) do
  508.      if NextWordIsKeyword then
  509.         RichEdit.SelAttributes.Style:=[fsBold];
  510.   RichEdit.SelStart:=0;
  511.   RichEdit.SelLength:=0;
  512. end;
  513.  
  514. {$WARNINGS OFF}
  515. procedure TTee5Form.PageExampleChange(Sender: TObject);
  516.  
  517.   {$IFDEF D5}
  518.   Procedure WebWrite(Const S:String);
  519.   begin
  520.     WebBrowser1.Navigate('about:'+S);
  521.   end;
  522.   {$ENDIF}
  523.  
  524. {$IFDEF D5}
  525. var URL       : String;
  526. {$ENDIF}
  527. begin
  528.   if PageExample.ActivePage=TabSource then
  529.   begin
  530.     if not FileExists(CodePath+'\Tee5New.dpr') then
  531.     With TRegistry.Create do
  532.     try
  533.       DeleteKey(Tee5RegistryKey);
  534.     finally
  535.       Free;
  536.     end;
  537.  
  538.     ButtonConfig.Visible:=CodePath='';
  539.     if (CodePath<>'') and (CodeFile<>'') then
  540.     begin
  541.       if OldCodeFile<>CodeFile then
  542.       begin
  543.         RichEditCode.Free;
  544.         RichEditCode:=TRichEdit.Create(Self);
  545.         With RichEditCode do
  546.         begin
  547.           Align:=alClient;
  548.           ReadOnly:=True;
  549.           WordWrap:=False;
  550.           ScrollBars:=ssBoth;
  551.           Font.Name:='Courier New';
  552.           Font.Size:=9;
  553.           Parent:=TabSource;
  554.           Lines.LoadFromFile(CodePath+'\'+CodeFile+'.pas');
  555.         end;
  556.         HighLight(RichEditCode);
  557.         OldCodeFile:=CodeFile;
  558.       end;
  559.     end
  560.     else RichEditCode.Free;
  561.   end
  562.   {$IFDEF D5}
  563.   else
  564.   if PageExample.ActivePage=TabWeb then
  565.   begin
  566.     if not Assigned(WebBrowser1) then
  567.     begin
  568.       WebBrowser1:=TWebBrowser.Create(Self);
  569.       WebBrowser1.Align:=alClient;
  570.       TabWeb.InsertControl(WebBrowser1);
  571.     end;
  572.     if Assigned(TheTree.Selected) and
  573.        Assigned(TheTree.Selected.Data) then
  574.     begin
  575.       WebWrite('Loading page from Steema.com ...');
  576.       URL:=SteemaDotCom+'/'+PTeeFormInfo(TheTree.Selected.Data).FormClass.ClassName+'.htm';
  577.       WebBrowser1.Navigate(URL);
  578.       StatusBar1.SimpleText:=URL;
  579.     end
  580.     else
  581.        WebWrite('All information about TeeChart Pro at <a href="http://www.steema.com">www.Steema.com</a> !');
  582.   end;
  583.   {$ENDIF}
  584. end;
  585. {$WARNINGS ON}
  586.  
  587. procedure TTee5Form.ButtonConfigClick(Sender: TObject);
  588. var tmpDir : String;
  589. begin
  590.   {$IFDEF D4}
  591.   if SelectDirectory('Folder with TeeChart Pro 5 Demo Sources',
  592.                      '',tmpDir) then
  593.   {$ELSE}
  594.   if SelectDirectory(tmpDir,[],0) then
  595.   {$ENDIF}
  596.   begin
  597.     With TRegistry.Create do
  598.     try
  599.       if OpenKey(Tee5RegistryKey,True) then
  600.          WriteString('DemoPath',tmpDir);
  601.     finally
  602.       Free;
  603.     end;
  604.     PageExampleChange(Self);
  605.   end;
  606. end;
  607.  
  608. procedure TTee5Form.Generatehtm1Click(Sender: TObject);
  609.  
  610.   Procedure DoTree(ATree:TTreeView);
  611.  
  612.     Function ItemPath(t:Integer):String;
  613.     var tmp : TTreeNode;
  614.     begin
  615.       tmp:=ATree.Items[t];
  616.       result:=tmp.Text;
  617.       While Assigned(tmp.Parent) do
  618.       begin
  619.         result:=tmp.Parent.Text+' -> '+result;
  620.         tmp:=tmp.Parent;
  621.       end;
  622.     end;
  623.  
  624.   var t:Integer;
  625.       s:TStringList;
  626.   begin
  627.     s:=TStringList.Create;
  628.     With ATree do
  629.     for t:=0 to Items.Count-1 do
  630.     if Assigned(Items[t].Data) then
  631.     begin
  632.       s.Clear;
  633.       s.Add('<html><body>');
  634.       s.Add('<img src="http://www.steema.com/images/tc2.jpg"><br>');
  635.       s.Add('<b>TeeChart Pro 5 Feature:</b> '+ItemPath(t)+'<br>');
  636.       s.Add('<br>');
  637.       s.Add('If you need help assistance or additional info about this feature<br>');
  638.       s.Add('please ask our Support Department at <a href="mailto:support@steema.com?subject=Tee5Web:'+
  639.             ItemPath(t)+'">support@steema.com</a>. Thanks !');
  640.       s.Add('<br>');
  641.       s.Add('<br><a href="http://www.steema.com">Steema</a></body></html>');
  642.       s.SaveToFile('.\tee5newhtml\'+PTeeFormInfo(Items[t].Data).FormClass.ClassName+'.htm');
  643.     end;
  644.     s.Free;
  645.   end;
  646.  
  647. begin
  648.   DoTree(TreeView1);
  649.   DoTree(TreeView2);
  650. end;
  651.  
  652. end.
  653.