home *** CD-ROM | disk | FTP | other *** search
/ Programmer Plus 2007 / Programmer-Plus-2007.iso / Programming / Report Writers / Crystal Repot 9.0 Full CD version / Setup.exe / Tools / Developers / PEDELF32.ZIP / pedelf32 / MAIN.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-04-19  |  18.1 KB  |  591 lines

  1. {Delphi Print Engine Sample Application
  2.  Created by Andre B. Couturier
  3.  
  4.  Modifications:
  5.  September 24, 1998 - Trevor Dubinsky
  6.  
  7.  Recompiled to use the new header file CRDelphi.Pas
  8.  Recompiled 16 bit version in Delphi 2 to make 16&32 bit closer together
  9.  
  10.  September 30, 1998 - Trevor Dubinsky
  11.  
  12.  Added a form Setloc, to demonstrate how to set the location of native tables
  13.  at run-time.  Also demonstrates how to pass a username and password for Paradox
  14.  and Access tables at runtime.
  15.  
  16.  This new form does not yet perform error checking for the calls.  To be added
  17.  later. There is also a invalid pointer operation error with the setformula
  18.  form.  This happens when the form is opened, and is inconsistent.
  19.  
  20.  Look on our website at www.seagatesoftware.com/crystalreports/updates in the
  21.  Delphi section for future updates to this application.
  22.  
  23.  April 19, 2002
  24.  
  25.  Modified the MnuOpenReportClick to no longer limit file names to length of
  26.  60 charectors.
  27.  }
  28. unit Main;
  29.  
  30. interface
  31.  
  32. uses
  33.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  34.   Forms, Dialogs, Menus, Buttons, ExtCtrls, Logon, Display, Prntopt, Printers,
  35.   StdCtrls, Location, Section, Formula, About, CRDelphi, SetLoc;
  36.  
  37. type
  38.   TMainForm = class(TForm)
  39.     OpenReportDialog: TOpenDialog;
  40.     MainMenu: TMainMenu;
  41.     MnuiFile: TMenuItem;
  42.     MnuExit: TMenuItem;
  43.     MnuEngine: TMenuItem;
  44.     MnuOpenEngine: TMenuItem;
  45.     MnuCloseEngine: TMenuItem;
  46.     MnuReport: TMenuItem;
  47.     MnuOpenReport: TMenuItem;
  48.     MnuCloseReport: TMenuItem;
  49.     MnuDestination: TMenuItem;
  50.     MnuToWindow: TMenuItem;
  51.     MnuToPrinter: TMenuItem;
  52.     MnuToFile: TMenuItem;
  53.     MnuPrint: TMenuItem;
  54.     MnuPrintNow: TMenuItem;
  55.     MnuSqlOptions: TMenuItem;
  56.     MnuGetInfo: TMenuItem;
  57.     PnlMain: TPanel;
  58.     MnuShowSQLQuery: TMenuItem;
  59.     MnuFormatting: TMenuItem;
  60.     MnuGetRepTitle: TMenuItem;
  61.     MnuClosePreview: TMenuItem;
  62.     MnuDiscard: TMenuItem;
  63.     MnuGetPrintOptions: TMenuItem;
  64.     MnuGetSelectedPrinter: TMenuItem;
  65.     MnuSelectPrinter: TMenuItem;
  66.     MnuTestConnectivity: TMenuItem;
  67.     SetPrinterDialog: TPrintDialog;
  68.     MnuLocation: TMenuItem;
  69.     MnuGetLocation: TMenuItem;
  70.     MnuGetSectionMin: TMenuItem;
  71.     MnuSetSectionMin: TMenuItem;
  72.     MnuLogOn: TMenuItem;
  73.     MnuLogOff: TMenuItem;
  74.     PnlStatus: TPanel;
  75.     Label1: TLabel;
  76.     Label2: TLabel;
  77.     PnlDestination: TPanel;
  78.     MnuFormulas: TMenuItem;
  79.     MnuSelection: TMenuItem;
  80.     MnuHelp: TMenuItem;
  81.     MnuAbout: TMenuItem;
  82.     MnuGroup: TMenuItem;
  83.     MnuAllFormulas: TMenuItem;
  84.     MnuCallsMade: TMenuItem;
  85.     N1: TMenuItem;
  86.     N2: TMenuItem;
  87.     N3: TMenuItem;
  88.     N4: TMenuItem;
  89.     N5: TMenuItem;
  90.     N6: TMenuItem;
  91.     N7: TMenuItem;
  92.     N8: TMenuItem;
  93.     N9: TMenuItem;
  94.     N10: TMenuItem;
  95.     N11: TMenuItem;
  96.     N12: TMenuItem;
  97.     N13: TMenuItem;
  98.     N14: TMenuItem;
  99.     SetTableLocations1: TMenuItem;
  100.     procedure MnuExitClick(Sender: TObject);
  101.     procedure MnuOpenEngineClick(Sender: TObject);
  102.     procedure MnuCloseEngineClick(Sender: TObject);
  103.     procedure MnuOpenReportClick(Sender: TObject);
  104.     procedure MnuCloseReportClick(Sender: TObject);
  105.     procedure MnuToWindowClick(Sender: TObject);
  106.     procedure MnuPrintNowClick(Sender: TObject);
  107.     procedure MnuToPrinterClick(Sender: TObject);
  108.     procedure MnuGetInfoClick(Sender: TObject);
  109.     procedure MnuShowSQLQueryClick(Sender: TObject);
  110.     procedure MnuGetRepTitleClick(Sender: TObject);
  111.     procedure MnuClosePreviewClick(Sender: TObject);
  112.     procedure MnuDiscardClick(Sender: TObject);
  113.     procedure MnuGetPrintOptionsClick(Sender: TObject);
  114.     procedure MnuGetSelectedPrinterClick(Sender: TObject);
  115.     procedure MnuSelectPrinterClick(Sender: TObject);
  116.     procedure MnuTestConnectivityClick(Sender: TObject);
  117.     procedure MnuGetLocationClick(Sender: TObject);
  118.     procedure MnuGetSectionMinClick(Sender: TObject);
  119.     procedure MnuSetSectionMinClick(Sender: TObject);
  120.     procedure FormResize(Sender: TObject);
  121.     procedure MnuLogOnClick(Sender: TObject);
  122.     procedure MnuLogOffClick(Sender: TObject);
  123.     function  GetError(Const JobIn : smallint) : String;
  124.     procedure MnuSelectionClick(Sender: TObject);
  125.     procedure MnuAboutClick(Sender: TObject);
  126.     procedure MnuGroupClick(Sender: TObject);
  127.     procedure MnuAllFormulasClick(Sender: TObject);
  128.     procedure MnuCallsMadeClick(Sender: TObject);
  129.     procedure SetTableLocations1Click(Sender: TObject);
  130.   private
  131.     { Private declarations }
  132.   public
  133.     { Public declarations }
  134.  
  135.   end;
  136.  
  137. const
  138.   Selection = 1;
  139.   Group = 2;
  140.   Formulas = 3;
  141.  
  142. var
  143.   MainForm: TMainForm;
  144.   LogInInfo : PELogOnInfo;  {Structure for the SQl logon parameters}
  145.   JobNumber : smallint;      {Global Job number for use by CRPE}
  146.   DrvHandle, PrntHandle, PortHandle : hWnd;
  147.   DrvLength, PrntLength, PortLength : smallint;
  148.   DrvText, PrntText, PortText : PChar;
  149.   Mode : PDevMode;
  150.   SenderIsGet : Bool;    {Global Variables for using forms with multiple purposes}
  151.   SenderIsLogOn : Bool;
  152.   FormulaSender : smallint;
  153.   FileNme : PChar;  {Report Name - was temp in openreport but I need global now}
  154.  
  155. implementation
  156.  
  157. {$R *.DFM}
  158.  
  159. function TMainForm.GetError(Const JobIn : smallint) : String;
  160. {This is my print engine error message capture function. It accepts
  161.  the job number as it parameter and then gets the error code and
  162.  message text and then passes this back out as a formatted string}
  163. var
  164.   Code : smallint;
  165.   StrHandle : hWnd;
  166.   Buffer : PChar;
  167.   Length : smallint;
  168.   Ret : Bool;
  169.  
  170. begin
  171.    Code := PEGetErrorCode(JobIn); {Get the Error code from the Crpe}
  172.    Ret := PEGetErrorText(JobIn, StrHandle, Length);  {Get the error message handle}
  173.  
  174.    Buffer := StrAlloc(Length);
  175.    {get the text from the text handle}
  176.    Ret := PEGetHandleString(StrHandle, Buffer, Length);
  177.  
  178.    GetError := IntToStr(Code) + ' - ' + StrPas(Buffer); {output the string}
  179.    StrDispose(Buffer);
  180. end;
  181.  
  182. procedure TMainForm.MnuExitClick(Sender: TObject);
  183. begin
  184.   Application.Terminate;
  185. end;
  186.  
  187. procedure TMainForm.MnuOpenEngineClick(Sender: TObject);
  188. begin
  189.    If PEOpenEngine then    {Open the Crystal Print Engine}
  190.      begin
  191.        { Update the status bar}
  192.        PnlStatus.Caption := 'Print Engine is Open';
  193.  
  194.        {Set the menu options}
  195.        MnuCloseEngine.Enabled := True;
  196.        MnuOpenEngine.Enabled := False;
  197.        MnuExit.Enabled := False;
  198.        MnuOpenReport.Enabled := True;
  199.        MnuReport.Enabled := True;
  200.      end
  201.    else
  202.        ShowMessage('Print Engine Not Opened');
  203. end;
  204.  
  205. procedure TMainForm.MnuCloseEngineClick(Sender: TObject);
  206. begin
  207.     PECloseEngine;  {Close the Crystal Print Engine}
  208.  
  209.     {Update the status bar}
  210.     PnlStatus.Caption := 'Print Engine is Closed';
  211.  
  212.     {Menu management}
  213.     MnuReport.Enabled := False;
  214.     MnuCloseEngine.Enabled := False;
  215.     MnuPrint.Enabled := False;
  216.     PnlDestination.Caption := 'None';
  217.     MnuPrintNow.Enabled := False;
  218.     MnuSqlOptions.Enabled := False;
  219.     MnuDestination.Enabled := False;
  220.     MnuFormatting.Enabled := False;
  221.     MnuOpenEngine.Enabled := True;
  222.     MnuExit.Enabled := True;
  223.     MnuFormulas.Enabled := False;
  224.     MnuLocation.Enabled := False;
  225.     MnuShowSQLQuery.Enabled := False;
  226.     MnuLogOff.Enabled := False;
  227. end;
  228.  
  229. procedure TMainForm.MnuOpenReportClick(Sender: TObject);
  230. var
  231.  
  232.   
  233.   TableType : PETableType;  {Temp variable used in determining the type of report}
  234.   Ret : Bool;      {Temp Variable used to store returned values from the Crpe}
  235.  
  236. begin
  237.    If OpenReportDialog.Execute then   {get the report file name}
  238.       begin
  239.  
  240.          {Open the Report and assign the Job number}
  241.          JobNumber := PEOpenPrintJob(pchar(OpenReportDialog.Filename));
  242.  
  243.          {if the open fails give an error message}
  244.          if JobNumber = 0 then
  245.             ShowMessage(GetError(JobNumber));
  246.  
  247.  
  248.          {update the status bar}
  249.          PnlStatus.Caption := OpenReportDialog.FileName + ' is Open';
  250.  
  251.          {menu management}
  252.          MnuCloseReport.Enabled := True;
  253.          MnuOpenReport.Enabled := False;
  254.          MnuPrint.Enabled := True;
  255.  
  256.          {this block of code checks to see what type of database the report is
  257.           using and enables the SQL menu options if the report is using
  258.           Sql databases. }
  259.          TableType.Structsize := PE_SIZEOF_TABLE_TYPE;
  260.          Ret := PEGetNthTableType(JobNumber, 0, TableType);
  261.          If TableType.DBType = PE_DT_SQL then
  262.             MnuSqlOptions.Enabled := True;
  263.  
  264.          MnuDestination.Enabled := True;
  265.          MnuFormatting.Enabled := True;
  266.          MnuFormulas.Enabled := True;
  267.          MnuLocation.Enabled := True;
  268.  
  269.       end
  270.    else
  271.       ShowMessage(GetError(JobNumber)); {show any error messages}
  272. end;
  273.  
  274. procedure TMainForm.MnuCloseReportClick(Sender: TObject);
  275. begin
  276.     if PEClosePrintJob(JobNumber) then  {Close the Print job (report)}
  277.        begin
  278.           {update the status bar}
  279.           PnlStatus.Caption := 'No Open Reports';
  280.  
  281.           {Menu management}
  282.           MnuOpenReport.Enabled := True;
  283.           MnuCloseReport.Enabled := False;
  284.           MnuCloseEngine.Enabled := True;
  285.           MnuPrint.Enabled := False;
  286.           PnlDestination.Caption := 'None';
  287.           MnuPrintNow.Enabled := False;
  288.           MnuSqlOptions.Enabled := False;
  289.           MnuDestination.Enabled := False;
  290.           MnuFormatting.Enabled := False;
  291.           MnuFormulas.Enabled := False;
  292.           MnuLocation.Enabled := False;
  293.           MnuShowSQLQuery.Enabled := False;
  294.        end
  295.     else
  296.        ShowMessage(GetError(JobNumber));  {show any error messages}
  297. end;
  298.  
  299. procedure TMainForm.MnuToWindowClick(Sender: TObject);
  300.  
  301. begin
  302.    {Set the Destination of the report to Window, and the position size etc}
  303.    if PEOutputToWindow(JobNumber,'Delphi PE Application',30,30,600,400,0,0) then
  304.      begin
  305.        PnlDestination.Caption := 'Window';
  306.        MnuPrint.Enabled := True;
  307.        MnuPrintNow.Enabled := True;
  308.      end
  309.    else
  310.       ShowMessage(GetError(JobNumber));  {show any error messages}
  311.  
  312. end;
  313.  
  314. procedure TMainForm.MnuPrintNowClick(Sender: TObject);
  315.  
  316. begin
  317.    {begin executing the print job, sending it to whatever destination is selected}
  318.    if PEStartPrintJob(JobNumber, True) = False then
  319.       ShowMessage(GetError(JobNumber))  {show any error messages}
  320.    else
  321.       MnuClosePreview.Enabled := True;
  322. end;
  323.  
  324. procedure TMainForm.MnuToPrinterClick(Sender: TObject);
  325.  
  326. begin
  327.    {set the output destination to printer}
  328.    if PEOutputToPrinter(JobNumber,0) then
  329.      begin
  330.        PnlDestination.Caption := 'Printer';  {update the status bar}
  331.  
  332.        {menu management}
  333.        MnuPrintNow.Enabled := True;
  334.        MnuPrint.Enabled := True;
  335.      end
  336.    else
  337.      ShowMessage(GetError(JobNumber));  {show any error messages}
  338.  
  339. end;
  340.  
  341. procedure TMainForm.MnuGetInfoClick(Sender: TObject);
  342.  
  343. begin
  344.    {Look on the OnShow event of LogOnForm for the Calls for this menu option}
  345.    LogOnForm.ShowModal;
  346.    MnuShowSQLQuery.Enabled := True;
  347. end;
  348.  
  349. procedure TMainForm.MnuShowSQLQueryClick(Sender: TObject);
  350. var
  351.    Ret : Bool;
  352.    TxtHandle : Hwnd;
  353.    TxtLength : smallint;
  354.    TxtBuffer : PChar;
  355.  
  356. begin
  357.    {get the Sql Query out of the report}
  358.    if PEGetSqlQuery(JobNumber, TxtHandle, TxtLength) = False then
  359.       ShowMessage(GetError(JobNumber))   {show any error messages}
  360.    else
  361.       begin
  362.          TxtBuffer := StrAlloc(TxtLength);  {allocate memory for the PChar}
  363.  
  364.          {Get the actual text in a usable form}
  365.          if PEGetHandleString(TxtHandle, TxtBuffer, TxtLength) = False then
  366.             ShowMessage(GetError(JobNumber))   {show any error messages}
  367.          else
  368.             begin
  369.                {set up and display the Sql query on a text output form}
  370.                TxtForm.LblDisplay.Caption := StrPas(TxtBuffer);
  371.                TxtForm.Caption := 'SQL Query';
  372.                TxtForm.ShowModal
  373.             end;
  374.          StrDispose(TxtBuffer);
  375.       end;
  376.  
  377. end;
  378.  
  379. procedure TMainForm.MnuGetRepTitleClick(Sender: TObject);
  380. var
  381.    Ret : Bool;
  382.    TxtHandle : Hwnd;
  383.    TxtLength : smallint;
  384.    TxtBuffer : PChar;
  385.  
  386. begin
  387.    {Get the title of the Report from the report}
  388.    if PEGetReportTitle(JobNumber, TxtHandle, TxtLength) then
  389.       begin
  390.          TxtBuffer := StrAlloc(TxtLength);
  391.          {Get the text of the report name}
  392.          if PEGetHandleString(TxtHandle, TxtBuffer, TxtLength) then
  393.             begin
  394.                {set up form and display report title on my text form}
  395.                TxtForm.LblDisplay.Caption := StrPas(TxtBuffer);
  396.                TxtForm.Caption := 'Report Title';
  397.                TxtForm.ShowModal
  398.             end
  399.          else
  400.             ShowMessage(GetError(JobNumber));   {show any error messages}
  401.          StrDispose(TxtBuffer);
  402.       end
  403.    else
  404.       ShowMessage('This report has no Report Title')   {show any error messages}
  405. end;
  406.  
  407. procedure TMainForm.MnuClosePreviewClick(Sender: TObject);
  408.  
  409. begin
  410.    PeCloseWindow(JobNumber); {Close the Preview Window}
  411.    MnuClosePreview.Enabled := False;
  412. end;
  413.  
  414. procedure TMainForm.MnuDiscardClick(Sender: TObject);
  415. Var
  416.    Ret : Bool;  {Temporary Variable}
  417.  
  418. begin
  419.    if PEDiscardSavedData(JobNumber) then
  420.       ShowMessage('Data has been discarded')
  421.    else
  422.       ShowMessage(GetError(JobNumber));  {show any error messages}
  423. end;
  424.  
  425. procedure TMainForm.MnuGetPrintOptionsClick(Sender: TObject);
  426. begin
  427.    {Look in the OnShow event for this form to see the CRPE calls}
  428.    FrmPrintOptions.ShowModal;
  429. end;
  430.  
  431. procedure TMainForm.MnuGetSelectedPrinterClick(Sender: TObject);
  432. var
  433.    Ret : Bool;
  434. begin
  435.    {Get the selected printer from the report, only returns a printer if
  436.     a specific printer was set. Returns null if no specific printer was set}
  437.    if PEGetSelectedPrinter(JobNumber, DrvHandle, DrvLength, PrntHandle, PrntLength, PortHandle, PortLength, Mode) then
  438.       begin
  439.          DrvText := StrAlloc(DrvLength);
  440.          Ret := PEGetHandleString(DrvHandle, DrvText, DrvLength);    {Get the Driver Name}
  441.          PrntText := StrAlloc(PrntLength);
  442.          Ret := PEGetHandleString(PrntHandle, PrntText, PrntLength); {Get the Printer Name}
  443.          PortText := StrAlloc(PortLength);
  444.          Ret := PEGetHandleString(PortHandle, PortText, PortLength); {Get the Port Name}
  445.  
  446.          {Set up and display the text form}
  447.          TxtForm.LblDisplay.Caption := 'Driver : ' + StrPas(DrvText) + Chr(10) + Chr(13);
  448.          TxtForm.LblDisplay.Caption := TxtForm.LblDisplay.Caption + 'Printer : ' + StrPas(PrntText) + Chr(10) + Chr(13);
  449.          TxtForm.LblDisplay.Caption := TxtForm.LblDisplay.Caption + 'Port : ' + StrPas(PortText) + Chr(10) + Chr(13);
  450.          TxtForm.Caption := 'Selected Printer';
  451.  
  452.          StrDispose(DrvText);
  453.          StrDispose(PrntText);
  454.          StrDispose(PortText);
  455.  
  456.          TxtForm.ShowModal;
  457.       end
  458.    else
  459.       ShowMessage(GetError(JobNumber));
  460. end;
  461.  
  462. procedure TMainForm.MnuSelectPrinterClick(Sender: TObject);
  463. var
  464.    Devmode :  THandle;
  465.  
  466.  
  467. begin
  468.    {Prompt the user select a new printer}
  469.   if SetPrinterDialog.Execute then
  470.    begin
  471.    {Grab the selected printer information from the PRINTER object}
  472.    DrvText := StrAlloc(255);
  473.    PrntText := StrAlloc(255);
  474.    PortText := StrAlloc(255);
  475.    Printer.GetPrinter(PrntText, DrvText, PortText, Devmode);
  476.  
  477.    {Tell the CRPE to use the printer selected above}
  478.    if PESelectPrinter(JobNumber, DrvText, PrntText, PortText, PDevMode(Devmode)) then
  479.       begin
  480.          {Set up and display the text form}
  481.          TxtForm.LblDisplay.Caption := (StrPas(DrvText) + ' ' + StrPas(PrntText) + ' ' + StrPas(PortText));
  482.          TxtForm.Caption := 'Selected Printer';
  483.          TxtForm.ShowModal
  484.       end
  485.    else
  486.       ShowMessage(GetError(JobNumber));   {show any error messages}
  487.  
  488.    StrDispose(DrvText);
  489.    StrDispose(PrntText);
  490.    StrDispose(PortText);
  491.   end
  492. end;
  493.  
  494. procedure TMainForm.MnuTestConnectivityClick(Sender: TObject);
  495.  
  496. begin
  497.    {Test if the server for this report is available (logged on)}
  498.    If PETestNthTableConnectivity(JobNumber, 0) then
  499.       Showmessage('Connected')
  500.    else
  501.       ShowMessage(GetError(JobNumber));    {show any error messages}
  502.  
  503.  
  504. end;
  505.  
  506. procedure TMainForm.MnuGetLocationClick(Sender: TObject);
  507. begin
  508.    {Look in the OnShow event for the related PE calls}
  509.    FrmLocation.ShowModal;
  510. end;
  511.  
  512. procedure TMainForm.MnuGetSectionMinClick(Sender: TObject);
  513.  
  514. begin
  515.    {used in the Section form to differentiate between calling menu options}
  516.    SenderIsGet := True;
  517.    {Look in the OnShow Event in this form for the PEGetMinimumSection Height}
  518.    FrmSection.ShowModal;
  519. end;
  520.  
  521. procedure TMainForm.MnuSetSectionMinClick(Sender: TObject);
  522.  
  523. begin
  524. {Look in the OnShow Event in this form for the PEGetMinimumSection Height}
  525. FrmSection.ShowModal;
  526. end;
  527.  
  528.  
  529. procedure TMainForm.FormResize(Sender: TObject);
  530. begin
  531.    {Reposition the Status bar when a change is made to the main form}
  532.    PnlMain.Top :=  (MainForm.ClientHeight - (PnlMain.Height));
  533.    PnlMain.Width := MainForm.Width - 8;  
  534. end;
  535.  
  536. procedure TMainForm.MnuLogOnClick(Sender: TObject);
  537. begin
  538.    {Used to differentiate between call menu options}
  539.    SenderIsLogOn := True;
  540.    {Look in the Onshow event for this form for realted PE calls}
  541.    LogOnForm.ShowModal;
  542.    MnuShowSQLQuery.Enabled := True;
  543.    MnuLogOff.Enabled := True;
  544. end;
  545.  
  546.  
  547. procedure TMainForm.MnuLogOffClick(Sender: TObject);
  548.  
  549. begin
  550.    {Log off the specified ODBC datasource}
  551.    if PELogOffServer('PDSODBC.DLL', LogInInfo) = False then
  552.       ShowMessage(GetError(JobNumber));  {show any error messages}
  553.    MnuLogOff.Enabled := False;
  554. end;
  555.  
  556. procedure TMainForm.MnuSelectionClick(Sender: TObject);
  557. begin
  558.    FormulaSender := Selection;
  559.    FrmFormulas.Showmodal;
  560. end;
  561.  
  562. procedure TMainForm.MnuAboutClick(Sender: TObject);
  563. begin
  564.    AboutBox.ShowModal;
  565. end;
  566.  
  567. procedure TMainForm.MnuGroupClick(Sender: TObject);
  568. begin
  569.    FormulaSender := Group;
  570.    FrmFormulas.Showmodal;
  571. end;
  572.  
  573. procedure TMainForm.MnuAllFormulasClick(Sender: TObject);
  574. begin
  575.    FormulaSender := Formulas;
  576.    FrmFormulas.Showmodal;
  577. end;
  578.  
  579. procedure TMainForm.MnuCallsMadeClick(Sender: TObject);
  580. begin
  581.   Application.HelpFile := 'PROPRTYS.HLP';
  582.   Application.HelpCommand(HELP_CONTENTS, 0);
  583. end;
  584.  
  585. procedure TMainForm.SetTableLocations1Click(Sender: TObject);
  586. begin
  587.    FrmSetLoc.ShowModal;
  588. end;
  589.  
  590. end.
  591.