home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 April / Chip_1997-04_cd.bin / prezent / cb / data.z / CLSSDLPH.PAS < prev    next >
Pascal/Delphi Source File  |  1997-01-16  |  99KB  |  2,503 lines

  1. unit clssdlph;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   DB, DBTables, Grids, DBGrids, ExtCtrls, DBCtrls, Menus, ComCtrls,RichEdit,
  8.   StdCtrls,CodePage, Buttons, BDE,about, BtsClass,Registry;
  9.  
  10. type
  11.   TExtractObjects=class
  12.      public
  13.         procedure ExtractObjectNameAndType(StartPosition:Integer; EndPosition:Integer;
  14.                   LineString:string;Phase:string);
  15.      protected
  16.         ObjectName:string;
  17.         ObjectType:string;
  18.         LastCommaPosition:Integer;
  19.   end;
  20.  
  21.  
  22.   TSearchEngine=class
  23.      public
  24.         procedure SearchForString(Word:string;Occurance:Integer;StartPosition:Integer;Page:string);
  25.      protected
  26.         PositionFound:longint;
  27.         LineNumberFound:longint;
  28.         LineFoundPositionOne:longint;
  29.         NewSearchPosition:longint;
  30.   end;
  31.  
  32.   TMainDlg = class(TForm)
  33.     VCLTable: TTable;
  34.     DataSource1: TDataSource;
  35.     MainMenu1: TMainMenu;
  36.     File1: TMenuItem;
  37.     DisplayTblLabel: TLabel;
  38.     New1: TMenuItem;
  39.     Open1: TMenuItem;
  40.     Save1: TMenuItem;
  41.     SaveAs1: TMenuItem;
  42.     DestTblQuery: TQuery;
  43.     DestTable: TTable;
  44.     Search1: TMenuItem;
  45.     Windows1: TMenuItem;
  46.     Help1: TMenuItem;
  47.     FileOPenDlg: TOpenDialog;
  48.     DisplayTblQuery: TQuery;
  49.     SaveAll1: TMenuItem;
  50.     Project1: TMenuItem;
  51.     Project2: TMenuItem;
  52.     HeaderParser: TTable;
  53.     WIN32Table1: TMenuItem;
  54.     PopupMenu5: TPopupMenu;
  55.     ViewHeader2: TMenuItem;
  56.     EditHeader2: TMenuItem;
  57.     ViewSource1: TMenuItem;
  58.     About1: TMenuItem;
  59.     HeaderParserHeaderName: TStringField;
  60.     HeaderParserParse: TBooleanField;
  61.     BatchMove1: TBatchMove;
  62.     ParseVclTable: TTable;
  63.     Errorlogging: TTable;
  64.     ErrorloggingUser: TStringField;
  65.     ErrorloggingClassName: TStringField;
  66.     ErrorloggingListBoxText: TStringField;
  67.     ErrorloggingMemberName: TStringField;
  68.     ClassListTab: TTable;
  69.     ClassListTabClassName: TStringField;
  70.     Panel4: TPanel;
  71.     DeclarationRichEdit: TRichEdit;
  72.     Panel5: TPanel;
  73.     SourceEntryPage: TRichEdit;
  74.     DBGrid1: TDBGrid;
  75.     Panel6: TPanel;
  76.     Panel7: TPanel;
  77.     PageControl1: TPageControl;
  78.     Panel8: TPanel;
  79.     QuickClassListbox: TListBox;
  80.     Panel1: TPanel;
  81.     Panel2: TPanel;
  82.     DBNavigator1: TDBNavigator;
  83.     Print1: TMenuItem;
  84.     PrintDefinition1: TMenuItem;
  85.     PrintDialog1: TPrintDialog;
  86.     ParseallHeaders1: TMenuItem;
  87.     Timer2: TTimer;
  88.     ClassOrgDB: TDatabase;
  89.     Grid: TMenuItem;
  90.     Declaration: TMenuItem;
  91.     Definition: TMenuItem;
  92.     QuickClassBox: TMenuItem;
  93.     MemberList: TMenuItem;
  94.     ChangeFonts: TMenuItem;
  95.     FontDialog1: TFontDialog;
  96.     ChangeBkGround: TMenuItem;
  97.     HeaderPage1: TMenuItem;
  98.     Declaration1: TMenuItem;
  99.     Definition1: TMenuItem;
  100.     QuickClassBox1: TMenuItem;
  101.     MemberList1: TMenuItem;
  102.     ColorDialog1: TColorDialog;
  103.     Label1: TLabel;
  104.     Label2: TLabel;
  105.     Label3: TLabel;
  106.     Label4: TLabel;
  107.     MainListBox: TListView;
  108.     ImageList1: TImageList;
  109.     DestTableClassName: TStringField;
  110.     DestTableMember: TStringField;
  111.     DestTableMemberName: TStringField;
  112.     DestTableRecNum: TAutoIncField;
  113.     DestTableScope: TStringField;
  114.     DestTableReturnType: TStringField;
  115.     DestTableHeader: TStringField;
  116.     DestTablePs: TSmallintField;
  117.     DestTablePType1: TStringField;
  118.     DestTablePObject1: TStringField;
  119.     DestTablePType2: TStringField;
  120.     DestTablePObject2: TStringField;
  121.     DestTablePType3: TStringField;
  122.     DestTablePObject3: TStringField;
  123.     DestTablePType4: TStringField;
  124.     DestTablePObject4: TStringField;
  125.     DestTablePType5: TStringField;
  126.     DestTablePObject5: TStringField;
  127.     DestTablePType6: TStringField;
  128.     DestTablePObject6: TStringField;
  129.     DestTablePType7: TStringField;
  130.     DestTablePObject7: TStringField;
  131.     DestTablePType8: TStringField;
  132.     DestTablePObject8: TStringField;
  133.     DestTableSecondClass: TStringField;
  134.     DestTableMisc: TStringField;
  135.     VCLTableClassName: TStringField;
  136.     VCLTableMember: TStringField;
  137.     VCLTableMemberName: TStringField;
  138.     VCLTableRecNum: TAutoIncField;
  139.     VCLTableScope: TStringField;
  140.     VCLTableReturnType: TStringField;
  141.     VCLTableHeader: TStringField;
  142.     VCLTablePs: TSmallintField;
  143.     VCLTablePType1: TStringField;
  144.     VCLTablePObject1: TStringField;
  145.     VCLTablePType2: TStringField;
  146.     VCLTablePObject2: TStringField;
  147.     VCLTablePType3: TStringField;
  148.     VCLTablePObject3: TStringField;
  149.     VCLTablePType4: TStringField;
  150.     VCLTablePObject4: TStringField;
  151.     VCLTablePType5: TStringField;
  152.     VCLTablePObject5: TStringField;
  153.     VCLTablePType6: TStringField;
  154.     VCLTablePObject6: TStringField;
  155.     VCLTablePType7: TStringField;
  156.     VCLTablePObject7: TStringField;
  157.     VCLTablePType8: TStringField;
  158.     VCLTablePObject8: TStringField;
  159.     VCLTableSecondClass: TStringField;
  160.     VCLTableMisc: TStringField;
  161.     CloseActivePage1: TMenuItem;
  162.     CloseAllPages2: TMenuItem;
  163.     ShowNextDerivation2: TMenuItem;
  164.     SearchByMemberName1: TMenuItem;
  165.     SearchByClassName1: TMenuItem;
  166.     N1: TMenuItem;
  167.     N3: TMenuItem;
  168.     N4: TMenuItem;
  169.     N5: TMenuItem;
  170.     ClassName1: TMenuItem;
  171.     LoadVCLHeader1: TMenuItem;
  172.     PrintHeaderhpp1: TMenuItem;
  173.     PrintSourcepas1: TMenuItem;
  174.     Grid1: TMenuItem;
  175.     HeaderPage: TMenuItem;
  176.  
  177.     {Events}
  178.     procedure SelectaTab(Sender: TObject);
  179.     procedure MainSetupWindow(Sender: TObject);
  180.     procedure RebuildVCLTable(Sender: TObject);
  181.     procedure MainDlgOnShow(Sender: TObject);
  182.     procedure MoveToClass(Sender: TObject);
  183.     procedure SearchMemberName1Click(Sender: TObject);
  184.     procedure ViewHeader1Click(Sender: TObject);
  185.     procedure ShowRecordClass1Click(Sender: TObject);
  186.     procedure About1Click(Sender: TObject);
  187.     procedure SearchClassName1Click(Sender: TObject);
  188.     procedure ViewSource1Click(Sender: TObject);
  189.     procedure FormResize(Sender: TObject);
  190.     procedure Print1Click(Sender: TObject);
  191.     procedure PrintDefinition1Click(Sender: TObject);
  192.     procedure HeaderSource1Click(Sender: TObject);
  193.     procedure ParseaNewHeader1Click(Sender: TObject);
  194.     procedure ClosePageClick(Sender: TObject);
  195.     procedure CloseAllPages1Click(Sender: TObject);
  196.     procedure FormActivate(Sender: TObject);
  197.     procedure ChangeFontsClick(Sender: TObject);
  198.     procedure ChangeBkGroundClick(Sender: TObject);
  199.     procedure MainListBoxClick(Sender: TObject);
  200.     procedure ShowNextDerivation1Click(Sender: TObject);
  201.     procedure PrintHeaderhpp1Click(Sender: TObject);
  202.     procedure PrintSourcepas1Click(Sender: TObject);
  203.     procedure Project1Click(Sender: TObject);
  204.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  205.  
  206.   private
  207.     CurrentSecondClass:string;
  208.     LocalVclSource:string;
  209.     LocalTablesDir:string;
  210.     LocalVclHeaders:string;
  211.     DefinitionLength:Integer;
  212.     PasSourceFileName:string;
  213.     LocateSuccess:Boolean;
  214.     RawVCLTable:TCloneTable;
  215.     UserName:string;
  216.     CurrentHeaderFileName:string;
  217.     CurrentSourceFileName:string;
  218.     MySearchOptions:TLocateOptions;
  219.     EndLineNum:longint;
  220.     DefinitionEditMode:Boolean;
  221.     DeclarationEditMode:Boolean;
  222.     CurrentSelectedMemberName:string[40];
  223.     FileOpenActive:Boolean;
  224.     ClassFinderSelectedItem:string[40];
  225.     CurrentTabClassName:string[40];
  226.     procedure ProcessSelectedClass;
  227.     procedure LoadSourcePage;
  228.     procedure GetRegistryInfo;
  229.     procedure LoadDefinitionSource;
  230.     procedure LoadDeclarationSource(ListBoxString:string);
  231.     function DetermineImageIndex(Scope:string;Member:string):Integer;
  232.     function IsItABadLine(Line:string;DefinedLineNumber:Integer):Boolean;
  233.     procedure ExtractClassMembers(ClassPosition:Integer;ClassName:string);
  234.     procedure ConvertCppToDestTable;
  235.     procedure QueryDispTbl_LoadQuickList;
  236.     procedure StringToTablePos(SelectedText:string;ClassName:string);
  237.     procedure ConvertTableToTabs;
  238.     procedure TableToListStrings(ClassName:string);
  239.     procedure MemberToTable(MemberDeclaration:string;MyScope:string;CppClassName:string;MemberLineNumber:Integer);
  240.   public
  241.  
  242.   end;
  243.  
  244. var
  245.   MainDlg: TMainDlg = nil;
  246. implementation
  247.  
  248. uses Rebuild, ParsHead;
  249.  
  250.  
  251.  
  252. //uses NewMemDG;
  253.  
  254. {$R *.DFM}
  255.  
  256.  
  257. { Source Code}
  258.  
  259. procedure TMainDlg.ConvertTableToTabs; 
  260.    begin
  261.    MainListBox.Items.Clear;
  262.    DestTblQuery.Close();
  263.    DestTblQuery.SQL.Clear();
  264.    DestTblQuery.SQL.Add('SELECT DISTINCT ClassName FROM');
  265.    DestTblQuery.SQL.Add('"main2.db"');
  266.    DestTblQuery.SQL.Add('ORDER BY ClassName');
  267.    DestTblQuery.Open();
  268.  
  269.    { Clear all tabs}
  270.    if PageControl1.PageCount > 0 then
  271.       with PageControl1 do
  272.          begin
  273.          ActivePage := Pages[0];
  274.          while (ActivePage <> nil) do
  275.             begin
  276.             ActivePage.Free;
  277.             SelectNextPage(TRUE);
  278.             end;
  279.          end; 
  280.       
  281.    {Create tabs from query}
  282.    while not DestTblQuery.EOF do
  283.       begin
  284.       with TTabSheet.Create(Self) do
  285.          begin
  286.          Caption := DestTblQuery.FieldByName('ClassName').AsString;
  287.          PageControl := PageControl1;
  288.          end;
  289.       DestTblQuery.Next();
  290.       end;
  291.    end;
  292.  
  293. procedure TMainDlg.SelectaTab(Sender: TObject);
  294.    begin
  295.    Screen.Cursor:=crHourGlass;
  296.    CurrentTabClassName:=PageControl1.ActivePage.Caption;
  297.    RawVCLTable.DisableControls();
  298.    RawVCLTable.Filtered:=false;
  299.    RawVCLTable.SetRange([CurrentTabClassName], [CurrentTabClassName]);
  300.    CurrentHeaderFileName:=RawVCLTable.FieldByName('Header').AsString;
  301.    CurrentSourceFileName:=RawVCLTable.FieldByName('Misc').AsString;
  302.    DeclarationRichEdit.Clear;
  303.    SourceEntryPage.Clear;
  304.    CodePageForm.CodePage.Clear();
  305.    try
  306.       CodePageForm.CodePage.Lines.LoadFromFile(LocalVclHeaders + CurrentHeaderFileName);
  307.          except on EFOpenError do
  308.             begin
  309.             MessageDlg('Header File Not Found!' ,mtError, [mbOk], 0);
  310.             Screen.Cursor:=crDefault;
  311.             Exit;
  312.             end;
  313.       end;
  314.    CodePageForm.SourceRichEdit1.Clear();
  315.    try
  316.       CodePageForm.SourceRichEdit1.Lines.LoadFromFile(LocalVclSource+'vcl\' + CurrentSourceFileName);
  317.          except on EFOpenError do
  318.             begin
  319.             CodePageForm.SourceRichEdit1.Lines[0]:='Source Not Available for this Class!';
  320.             end;
  321.       end;
  322.    TableToListStrings(CurrentTabClassName);
  323.    RawVCLTable.EnableControls();
  324.    Screen.Cursor:=crDefault;
  325. end;
  326.  
  327. procedure TMainDlg.TableToListStrings(ClassName:string); 
  328.    var
  329.    ParamNum:Longint;
  330.    FinalString:string[255];
  331.    RecordClassName:string[40];
  332.    MemberName:string[40];
  333.    MemberType:string[40];
  334.    ReturnType:string[40];
  335.    ScopeColor:string[40];
  336.    PType1:string[40];
  337.    PType2:string[40];
  338.    PType3:string[40];
  339.    PType4:string[40];
  340.    PType5:string[40];
  341.    PType6:string[40];
  342.    PType7:string[40];
  343.    PType8:string[40];
  344.    PObject1:string[40];
  345.    PObject2:string[40];
  346.    PObject3:string[40];
  347.    PObject4:string[40];
  348.    PObject5:string[40];
  349.    PObject6:string[40];
  350.    PObject7:string[40];
  351.    PObject8:string[40];
  352.    Break:Boolean;
  353.    NewItem:TListItem;
  354.    DataProperty:Boolean;
  355.    begin
  356.    if FileOpenActive=true then
  357.       begin
  358.       VCLTable.Close();
  359.       VCLTable.TableName:=DestTable.TableName;
  360.       VCLTable.Open();
  361.       end;
  362.    DataProperty:=false;
  363.    Break:=false;
  364.    MainListBox.Items.Clear();
  365.    while (Break<>true) and (not RawVCLTable.EOF) do
  366.       begin
  367.       FinalString:='';
  368.       RecordClassName:=RawVCLTable.FieldByName('ClassName').AsString;
  369.       if ClassName=RecordClassName then
  370.          begin
  371.          ReturnType:=RawVCLTable.FieldByName('ReturnType').AsString;
  372.          MemberName:=RawVCLTable.FieldByName('MemberName').AsString;
  373.          MemberType:=RawVCLTable.FieldByName('Member').AsString;
  374.          ParamNum:=RawVCLTable.FieldByName('Ps').AsInteger;
  375.          ScopeColor:=RawVCLTable.FieldByName('Scope').AsString;
  376.          {Is it a data property}
  377.          if ((MemberType='property')and(ParamNum=0)) then
  378.             begin
  379.             DataProperty:=true;
  380.             end;
  381.  
  382.          {Start building string}
  383.          FinalString:='';
  384.             if (MemberType='data') or (DataProperty=true) then { if data member }
  385.                begin
  386.                FinalString:=concat(FinalString,MemberName);
  387.                NewItem := MainListBox.Items.Add;
  388.                NewItem.Caption := FinalString;
  389.                NewItem.ImageIndex:=DetermineImageIndex(ScopeColor,MemberType);
  390.                end else
  391.                   begin
  392.                   if ParamNum=0 then   { Ps=0 }
  393.                      begin
  394.                      FinalString:=concat(FinalString,MemberName);
  395.                      if MemberType='property' then FinalString:=concat(FinalString,' ={')
  396.                         else FinalString:=concat(FinalString,' (');
  397.                      end;
  398.                   if ParamNum>0 then   { Ps=1 }
  399.                      begin
  400.                      PType1:=RawVCLTable.FieldByName('PType1').AsString;
  401.                      PObject1:=RawVCLTable.FieldByName('PObject1').AsString;
  402.                      FinalString:=concat(FinalString,MemberName);
  403.                      if MemberType='property' then FinalString:=concat(FinalString,' ={')
  404.                         else FinalString:=concat(FinalString,' (');
  405.                      FinalString:=concat(FinalString,PType1);
  406.                      FinalString:=concat(FinalString,' ');
  407.                      FinalString:=concat(FinalString,PObject1);
  408.                      end;
  409.                   if ParamNum>1 then   { Ps=2 }
  410.                      begin
  411.                      PType2:=RawVCLTable.FieldByName('PType2').AsString;
  412.                      PObject2:=RawVCLTable.FieldByName('PObject2').AsString;
  413.                      FinalString:=concat(FinalString,',');
  414.                      FinalString:=concat(FinalString,PType2);
  415.                      FinalString:=concat(FinalString,' ');
  416.                      FinalString:=concat(FinalString,PObject2);
  417.                      end;
  418.                   if ParamNum>2 then   { Ps=3 }
  419.                      begin
  420.                      PType3:=RawVCLTable.FieldByName('PType3').AsString;
  421.                      PObject3:=RawVCLTable.FieldByName('PObject3').AsString;
  422.                      FinalString:=concat(FinalString,',');
  423.                      FinalString:=concat(FinalString,PType3);
  424.                      FinalString:=concat(FinalString,' ');
  425.                      FinalString:=concat(FinalString,PObject3);
  426.                      end;
  427.                   if ParamNum>3 then   { Ps=4 }
  428.                      begin
  429.                      PType4:=RawVCLTable.FieldByName('PType4').AsString;
  430.                      PObject4:=RawVCLTable.FieldByName('PObject4').AsString;
  431.                      FinalString:=concat(FinalString,',');
  432.                      FinalString:=concat(FinalString,PType4);
  433.                      FinalString:=concat(FinalString,' ');
  434.                      FinalString:=concat(FinalString,PObject4);
  435.                      end;
  436.                   if ParamNum>4 then   { Ps=5 }
  437.                      begin
  438.                      PType5:=RawVCLTable.FieldByName('PType5').AsString;
  439.                      PObject5:=RawVCLTable.FieldByName('PObject5').AsString;
  440.                      FinalString:=concat(FinalString,',');
  441.                      FinalString:=concat(FinalString,PType5);
  442.                      FinalString:=concat(FinalString,' ');
  443.                      FinalString:=concat(FinalString,PObject5);
  444.                      end;
  445.                   if ParamNum>5 then   { Ps=6 }
  446.                      begin
  447.                      PType6:=RawVCLTable.FieldByName('PType6').AsString;
  448.                      PObject6:=RawVCLTable.FieldByName('PObject6').AsString;
  449.                      FinalString:=concat(FinalString,',');
  450.                      FinalString:=concat(FinalString,PType6);
  451.                      FinalString:=concat(FinalString,' ');
  452.                      FinalString:=concat(FinalString,PObject6);
  453.                      end;
  454.                   if ParamNum>6 then   { Ps=7 }
  455.                      begin
  456.                      PType7:=RawVCLTable.FieldByName('PType7').AsString;
  457.                      PObject7:=RawVCLTable.FieldByName('PObject7').AsString;
  458.                      FinalString:=concat(FinalString,',');
  459.                      FinalString:=concat(FinalString,PType7);
  460.                      FinalString:=concat(FinalString,' ');
  461.                      FinalString:=concat(FinalString,PObject7);
  462.                      end;
  463.                   if ParamNum>7 then   { Ps=8 }
  464.                      begin
  465.                      PType8:=RawVCLTable.FieldByName('PType8').AsString;
  466.                      PObject8:=RawVCLTable.FieldByName('PObject8').AsString;
  467.                      FinalString:=concat(FinalString,',');
  468.                      FinalString:=concat(FinalString,PType8);
  469.                      FinalString:=concat(FinalString,' ');
  470.                      FinalString:=concat(FinalString,PObject8);
  471.                      end;
  472.                if MemberType='property' then FinalString:=concat(FinalString,' }')
  473.                   else
  474.                      begin
  475.                      FinalString:=concat(FinalString,' )');
  476.                      end;               
  477.                NewItem := MainListBox.Items.Add;
  478.                NewItem.Caption := FinalString;
  479.                NewItem.ImageIndex:=DetermineImageIndex(ScopeColor,MemberType);
  480.                end;
  481.                RawVCLTable.Next();
  482.          end
  483.            else Break:=true;
  484.       end;
  485.    end;
  486.  
  487. procedure TMainDlg.MainListBoxClick(Sender: TObject);
  488.    var
  489.    MemberType:string;
  490.    CurrentSelectedReturnType:string;
  491.    begin
  492.    CurrentSelectedReturnType:='';
  493.    if (FileOpenActive=true) or (MainListBox.ItemFocused=nil) or
  494.       (MainListBox.ItemFocused.Caption='Class Member List') then Exit;
  495.    MemberType:='';
  496.    CurrentTabClassName:=PageControl1.ActivePage.Caption;
  497.    RawVCLTable.DisableControls;
  498.    RawVCLTable.First;
  499.    StringToTablePos(MainListBox.ItemFocused.Caption,CurrentTabClassName);
  500.    CurrentSelectedMemberName:=RawVCLTable.FieldByName('MemberName').AsString;
  501.    CurrentSelectedReturnType:=RawVCLTable.FieldByName('ReturnType').AsString;
  502.    AppendStr(CurrentSelectedReturnType,CurrentSelectedMemberName);
  503.    LoadDeclarationSource(CurrentSelectedReturnType);
  504.    MemberType:=RawVCLTable.FieldByName('Member').AsString;
  505.    LoadDefinitionSource;
  506.    Screen.Cursor:=crDefault;
  507.    RawVCLTable.EnableControls;
  508.    MainListBox.SetFocus();
  509.    end;
  510.  
  511. procedure TMainDlg.MainSetupWindow(Sender: TObject);
  512.    begin
  513.    {Initialize Database}
  514.    GetRegistryInfo;
  515.    ClassOrgDB.Params.Values['Path'] := LocalTablesDir;
  516.    //ClassOrgDB.Connected:=true;
  517.    {Open Tables}
  518.    VCLTable.Open;
  519.    DestTable.Open;
  520.    ClassListTab.Open;
  521.    HeaderParser.Open;
  522.    ErrorLogging.Open;
  523.    ParseVclTable.Open;
  524.    RawVCLTable := TCloneTable.CreateFromTable(VCLTable, True);
  525.    RawVCLTable.Open;
  526.                     
  527.    {Initialize Variables}
  528.    FileOpenActive:=false;
  529.    DefinitionEditMode:=false;
  530.    end;
  531.  
  532. procedure TMainDlg.RebuildVCLTable(Sender: TObject);
  533.    var
  534.    SelectOK:Boolean;
  535.    Password:string;
  536.    HeaderName:string;
  537.    ParseIt:Boolean;
  538.    PasFileSearch:TSearchEngine;
  539.    OneCharacter:string;
  540.    GotPasName:Boolean;
  541.    CharCount:Integer;
  542.    Line:string;
  543.    ValidHeader:Boolean;
  544.    begin
  545.    TabRebuildStats:=TTabRebuildStats.Create(nil);
  546.    if VCLTable.RecordCount<>0 then
  547.       begin
  548.       Password:='Rebuild';
  549.       SelectOK:=InputQuery('Enter Password','Warning you are about to rebuild your VCL table!!',Password);
  550.       if not SelectOK then Exit;
  551.       if SelectOK then
  552.          begin
  553.          if Password <>'Rebuild' then Exit
  554.          end;
  555.       end;
  556.    TabRebuildStats.Left:=Trunc((ClientWidth/2)-(TabRebuildStats.Width/2));
  557.    TabRebuildStats.Top:=Trunc((ClientHeight/2)-(TabRebuildStats.Height/2));
  558.    TabRebuildStats.Show;
  559.    TabRebuildStats.RebuildBar.Position:=1;
  560.    Application.ProcessMessages;
  561.    VCLTable.Close;
  562.    VCLTable.EmptyTable;
  563.    VCLTable.Open;
  564.    FileOpenActive:=true;
  565.    Screen.Cursor:=crHourglass;
  566.    HeaderParser.First;
  567.    DestTable.DisableControls;
  568.    PasFileSearch:=TSearchEngine.Create;
  569.    while not HeaderParser.EOF do
  570.       begin
  571.       HeaderName:=HeaderParserHeaderName.AsString;
  572.       ParseIt:=HeaderParserParse.AsBoolean;
  573.       if ParseIt=true then
  574.          begin
  575.          TabRebuildStats.HeaderNameLabel.Caption:=HeaderName;
  576.          {Take care of status bar}
  577.          if HeaderName='dataform.hpp' then TabRebuildStats.RebuildBar.Position:=1;
  578.          if HeaderName='dbinpreq.hpp' then TabRebuildStats.RebuildBar.Position:=2;
  579.          if HeaderName='dialogs.hpp' then TabRebuildStats.RebuildBar.Position:=3;
  580.          if HeaderName='dsgnwnds.hpp' then TabRebuildStats.RebuildBar.Position:=4;
  581.          if HeaderName='frmexprt.hpp' then TabRebuildStats.RebuildBar.Position:=5;
  582.          if HeaderName='inifiles.hpp' then TabRebuildStats.RebuildBar.Position:=6;
  583.          if HeaderName='masktext.hpp' then TabRebuildStats.RebuildBar.Position:=7;
  584.          if HeaderName='nodeedit.hpp' then TabRebuildStats.RebuildBar.Position:=8;
  585.          if HeaderName='pageedit.hpp' then TabRebuildStats.RebuildBar.Position:=9;
  586.          if HeaderName='sbaredit.hpp' then TabRebuildStats.RebuildBar.Position:=10;
  587.          if HeaderName='updsqled.hpp' then TabRebuildStats.RebuildBar.Position:=11;
  588.          if HeaderName='zvcl.hpp' then TabRebuildStats.RebuildBar.Position:=12;
  589.          Application.ProcessMessages;
  590.  
  591.          CharCount:=0;
  592.          GotPasName:=false;
  593.          PasSourceFileName:='';
  594.          OneCharacter:='';
  595.          Screen.Cursor:=crHourglass;
  596.          CurrentHeaderFileName:=HeaderName;
  597.          CodePageForm.CodePage.Clear();
  598.          ValidHeader:=true;
  599.          try
  600.             CodePageForm.CodePage.Lines.LoadFromFile(LocalVclHeaders + CurrentHeaderFileName);
  601.             except on EFOpenError do
  602.                begin
  603.                ValidHeader:=false
  604.                end;
  605.             end;
  606.  
  607.          if ValidHeader=true then
  608.             begin
  609.             CodePageForm.SourceRichEdit1.Clear();
  610.             PasFileSearch.SearchForString('.pas',1,0,'Include');
  611.             if PasFileSearch.PositionFound=-1 then MessageDlg('Could not find .pas for '+HeaderName ,mtError, [mbOk], 0);
  612.             Line:=CodePageForm.CodePage.Lines[PasFileSearch.LineNumberFound];
  613.  
  614.             while not GotPasName do
  615.                begin
  616.                OneCharacter:=Copy(Line,(PasFileSearch.PositionFound-PasFileSearch.LineFoundPositionOne)-CharCount,1);
  617.                if (OneCharacter=' ') or (OneCharacter='/')then GotPasName:=true;
  618.                if GotPasName=false then
  619.                   begin
  620.                   AppendStr(OneCharacter,PasSourceFileName);
  621.                   PasSourceFileName:=OneCharacter;
  622.                   Inc(CharCount);
  623.                   end;
  624.                end;
  625.             AppendStr(PasSourceFileName,'.pas');
  626.             DestTable.Close();
  627.             DestTable.TableName:='main2.db';
  628.             DestTable.Open();
  629.             DestTable.Close();
  630.             DestTable.EmptyTable;
  631.             DestTable.Open();
  632.             ConvertCppToDestTable;
  633.             Screen.Cursor:=crDefault;
  634.             BatchMove1.Execute;
  635.             end;
  636.          end;
  637.          HeaderParser.Next;
  638.       end;
  639.    DestTable.Close;
  640.    HeaderParser.Close;
  641.    DestTable.EnableControls;
  642.    Screen.Cursor:=crDefault;
  643.    TabRebuildStats.Close;
  644.    TabRebuildStats.Free;
  645.    VCLTable.Close;
  646.    VCLTable.TableName:='vcltable.db';
  647.    VCLTable.Open;
  648.    VCLTable.Refresh;
  649.    RawVCLTable.Refresh;
  650.    DBGrid1.Refresh;
  651.    RawVCLTable.First;
  652.    MessageDlg('Successful Build',mtConfirmation, [mbOk], 0);
  653.    FileOpenActive:=false;
  654.    end;
  655.  
  656. procedure TMainDlg.StringToTablePos(SelectedText:string;ClassName:string); 
  657.    var
  658.    Match:Boolean;
  659.    ParamNum:Longint;
  660.    FinalString:string[255];
  661.    RecordClassName:string[40];
  662.    MemberName:string[40];
  663.    MemberType:string[40];
  664.    ReturnType:string[40];
  665.    PType1:string[40];
  666.    PType2:string[40];
  667.    PType3:string[40];
  668.    PType4:string[40];
  669.    PType5:string[40];
  670.    PType6:string[40];
  671.    PType7:string[40];
  672.    PType8:string[40];
  673.    PObject1:string[40];
  674.    PObject2:string[40];
  675.    PObject3:string[40];
  676.    PObject4:string[40];
  677.    PObject5:string[40];
  678.    PObject6:string[40];
  679.    PObject7:string[40];
  680.    PObject8:string[40];
  681.    DataProperty:Boolean;
  682.    begin
  683.    Match:=false;
  684.    DataProperty:=false;
  685.    while (not RawVCLTable.EOF) and (not Match) do
  686.       begin
  687.       FinalString:='';
  688.       ReturnType:=RawVCLTable.FieldByName('ReturnType').AsString;
  689.       MemberName:=RawVCLTable.FieldByName('MemberName').AsString;
  690.       MemberType:=RawVCLTable.FieldByName('Member').AsString;
  691.       RecordClassName:=RawVCLTable.FieldByName('ClassName').AsString;
  692.       ParamNum:=RawVCLTable.FieldByName('Ps').AsInteger;
  693.       {Is it a data property}
  694.          if ((MemberType='property')and(ParamNum=0)) then
  695.             begin
  696.             DataProperty:=true;
  697.             end;
  698.       if ClassName=RecordClassName then
  699.          begin
  700.          FinalString:='';
  701.          if (MemberType='data') or (DataProperty=true) then  { if data member }
  702.             begin
  703.             FinalString:=concat(FinalString,MemberName);
  704.             end else  { all other member types }
  705.             begin
  706.             if ParamNum=0 then   { Ps=0 }
  707.                begin
  708.                FinalString:=concat(FinalString,MemberName);
  709.                if MemberType='property' then FinalString:=concat(FinalString,' ={')
  710.                   else FinalString:=concat(FinalString,' (');
  711.                end;
  712.             if ParamNum>0 then   { Ps=1 }
  713.                begin
  714.                PType1:=RawVCLTable.FieldByName('PType1').AsString;
  715.                PObject1:=RawVCLTable.FieldByName('PObject1').AsString;
  716.                FinalString:=concat(FinalString,MemberName);
  717.                if MemberType='property' then FinalString:=concat(FinalString,' ={')
  718.                   else
  719.                      FinalString:=concat(FinalString,' (');
  720.                      FinalString:=concat(FinalString,PType1);
  721.                      FinalString:=concat(FinalString,' ');
  722.                      FinalString:=concat(FinalString,PObject1);
  723.                end;
  724.             if ParamNum>1 then   { Ps=2 }
  725.                begin
  726.                PType2:=RawVCLTable.FieldByName('PType2').AsString;
  727.                PObject2:=RawVCLTable.FieldByName('PObject2').AsString;
  728.                FinalString:=concat(FinalString,',');
  729.                FinalString:=concat(FinalString,PType2);
  730.                FinalString:=concat(FinalString,' ');
  731.                FinalString:=concat(FinalString,PObject2);
  732.                end;
  733.             if ParamNum>2 then   { Ps=3 }
  734.                begin
  735.                PType3:=RawVCLTable.FieldByName('PType3').AsString;
  736.                PObject3:=RawVCLTable.FieldByName('PObject3').AsString;
  737.                FinalString:=concat(FinalString,',');
  738.                FinalString:=concat(FinalString,PType3);
  739.                FinalString:=concat(FinalString,' ');
  740.                FinalString:=concat(FinalString,PObject3);
  741.                end;
  742.             if ParamNum>3 then   { Ps=4 }
  743.                begin
  744.                PType4:=RawVCLTable.FieldByName('PType4').AsString;
  745.                PObject4:=RawVCLTable.FieldByName('PObject4').AsString;
  746.                FinalString:=concat(FinalString,',');
  747.                FinalString:=concat(FinalString,PType4);
  748.                FinalString:=concat(FinalString,' ');
  749.                FinalString:=concat(FinalString,PObject4);
  750.                end;
  751.             if ParamNum>4 then   { Ps=5 }
  752.                begin
  753.                PType5:=RawVCLTable.FieldByName('PType5').AsString;
  754.                PObject5:=RawVCLTable.FieldByName('PObject5').AsString;
  755.                FinalString:=concat(FinalString,',');
  756.                FinalString:=concat(FinalString,PType5);
  757.                FinalString:=concat(FinalString,' ');
  758.                FinalString:=concat(FinalString,PObject5);
  759.                end;
  760.             if ParamNum>5 then   { Ps=6 }
  761.                begin
  762.                PType6:=RawVCLTable.FieldByName('PType6').AsString;
  763.                PObject6:=RawVCLTable.FieldByName('PObject6').AsString;
  764.                FinalString:=concat(FinalString,',');
  765.                FinalString:=concat(FinalString,PType6);
  766.                FinalString:=concat(FinalString,' ');
  767.                FinalString:=concat(FinalString,PObject6);
  768.                end;
  769.             if ParamNum>6 then   { Ps=7 }
  770.                begin
  771.                PType7:=RawVCLTable.FieldByName('PType7').AsString;
  772.                PObject7:=RawVCLTable.FieldByName('PObject7').AsString;
  773.                FinalString:=concat(FinalString,',');
  774.                FinalString:=concat(FinalString,PType7);
  775.                FinalString:=concat(FinalString,' ');
  776.                FinalString:=concat(FinalString,PObject7);
  777.                end;
  778.             if ParamNum>7 then   { Ps=8 }
  779.                begin
  780.                PType8:=RawVCLTable.FieldByName('PType8').AsString;
  781.                PObject8:=RawVCLTable.FieldByName('PObject8').AsString;
  782.                FinalString:=concat(FinalString,',');
  783.                FinalString:=concat(FinalString,PType8);
  784.                FinalString:=concat(FinalString,' ');
  785.                FinalString:=concat(FinalString,PObject8);
  786.                end;
  787.             if MemberType='property' then FinalString:=concat(FinalString,' }')
  788.                else
  789.                   begin
  790.                   FinalString:=concat(FinalString,' )');
  791.                   end;
  792.             if Selectedtext=FinalString then Match:=true;
  793.             end;
  794.          end;
  795.       if Selectedtext=FinalString then Match:=true;
  796.       if Match<>true then RawVCLTable.Next();
  797.       end;
  798.       RawVCLTable.EnableControls;
  799.    end;
  800.  
  801.  
  802.  
  803. procedure TMainDlg.MainDlgOnShow(Sender: TObject);
  804.    begin
  805.    {Set Resizing}
  806.    DeclarationRichEdit.Height:=Trunc(ClientHeight * 0.18);
  807.    Panel4.Width:=ClientWidth div 2;
  808.    PageControl1.Height:=Trunc(ClientHeight * 0.6);
  809.    QuickClassListbox.Height:=Trunc(ClientHeight* 0.4)-30;
  810.    SourceEntryPage.Height:=(PageControl1.Height-15)-(DeclarationRichEdit.Height);
  811.    MainListBox.Height:=PageControl1.Height -40;
  812.    MainListBox.Width:=PageControl1.Width -5;
  813.    Label1.Left:=Trunc(Panel2.Width * 0.174);
  814.    Label2.Left:=Trunc(Panel2.Width * 0.329);
  815.    Label3.Left:=Trunc(Panel2.Width * 0.532);
  816.    Label4.Left:=Trunc(Panel2.Width * 0.687);
  817.    CodePageForm:=TCodePageForm.Create(Self);
  818.  
  819.    with TRegistry.Create do
  820.       begin
  821.       {Load background colors from registry}
  822.       RootKey := HKEY_LOCAL_MACHINE;
  823.       OpenKey('\software\borland\VCL Class Organizer\colors', false);
  824.       DeclarationRichEdit.Color:=TColor(StrToInt(ReadString('Declaration')));
  825.       SourceEntryPage.Color:=TColor(StrToInt(ReadString('Definition')));
  826.       QuickClassListbox.Color:=TColor(StrToInt(ReadString('QuickClass')));
  827.       MainListBox.Color:=TColor(StrToInt(ReadString('MemberList')));
  828.       DBGrid1.Color:=TColor(StrToInt(ReadString('Grid')));
  829.       CodePageForm.CodePage.Color:=TColor(StrToInt(ReadString('HeaderPage')));
  830.       CodePageForm.SourceRichEdit1.Color:=TColor(StrToInt(ReadString('DefinitionPage')));
  831.  
  832.       {Load fonts from registry}
  833.       RootKey := HKEY_LOCAL_MACHINE;
  834.       OpenKey('\software\borland\VCL Class Organizer\fonts', false);
  835.       DeclarationRichEdit.Font.Color:=TColor(StrToInt(ReadString('Declaration')));
  836.       SourceEntryPage.Font.Color:=TColor(StrToInt(ReadString('Definition')));
  837.       QuickClassListbox.Font.Color:=TColor(StrToInt(ReadString('QuickClass')));
  838.       MainListBox.Font.Color:=TColor(StrToInt(ReadString('MemberList')));
  839.       DBGrid1.Columns[1].Font.Color:=TColor(StrToInt(ReadString('Grid')));
  840.       DBGrid1.Columns[2].Font.Color:=TColor(StrToInt(ReadString('Grid')));
  841.       DBGrid1.Columns[3].Font.Color:=TColor(StrToInt(ReadString('Grid')));
  842.       DBGrid1.Columns[4].Font.Color:=TColor(StrToInt(ReadString('Grid')));
  843.       CodePageForm.CodePage.Font.Color:=TColor(StrToInt(ReadString('HeaderPage')));
  844.       CodePageForm.SourceRichEdit1.Font.Color:=TColor(StrToInt(ReadString('DefinitionPage')));
  845.       Free;
  846.       end;
  847.    QueryDispTbl_LoadQuickList;
  848.    end;
  849.  
  850.  
  851. procedure TMainDlg.QueryDispTbl_LoadQuickList; 
  852.    begin
  853.    QuickClassListbox.Clear;
  854.    ClassListTab.Open;
  855.    ClassListTab.First;
  856.    while not ClassListTab.EOF do
  857.       begin
  858.       QuickClassListbox.Items.Add(ClassListTabClassName.AsString);
  859.       ClassListTab.Next;
  860.       end;
  861.    SendMessage(QuickClassListbox.Handle,LB_SETSEL,WPARAM(TRUE),LPARAM(280));
  862.    SendMessage(QuickClassListbox.Handle,LB_SETSEL,WPARAM(TRUE),LPARAM(181));
  863.    SendMessage(QuickClassListbox.Handle,LB_SETSEL,WPARAM(FALSE),LPARAM(280));
  864.    end;
  865.    
  866. procedure TMainDlg.ConvertCppToDestTable; 
  867.    var
  868.    OneLinerClass:Boolean;
  869.    ThisIsDerivedClass:Boolean;
  870.    ClassCommentLine:Boolean;
  871.    Break:Boolean;
  872.    x:Integer;
  873.    p:Integer;
  874.    StrLength:Integer;
  875.    CopyLength:Integer;
  876.    CompensateFirstSearch:Integer;
  877.    EndOfSearch:Integer;
  878.    CommentPagePosToLinePos:longint;
  879.    OneLineOfCode:string[200];
  880.    ExtractedClassName:string[40];
  881.    OneChar:string;
  882.    ClassSearch:TSearchEngine;
  883.    CommentSearch:TSearchEngine;
  884.    Sender:TObject;
  885.    TempString:string;
  886.    Done:Boolean;
  887.    begin
  888.    CurrentSecondClass:='';
  889.    EndOfSearch:=0;  
  890.    CompensateFirstSearch:=0;
  891.    ClassSearch:=TSearchEngine.Create;
  892.    CommentSearch:=TSearchEngine.Create;
  893.    ClassSearch.LineNumberFound:=0;
  894.    CommentSearch.LineNumberFound:=0;
  895.    ClassSearch.PositionFound:=0;
  896.    CommentSearch.PositionFound:=0;
  897.  
  898.    {Clear all tabs}
  899.    if FileOpenActive<>true then
  900.       begin
  901.       if PageControl1.PageCount > 0 then
  902.          with PageControl1 do
  903.             begin
  904.             ActivePage := Pages[0];
  905.             while (ActivePage <> nil) do
  906.                begin
  907.                ActivePage.Free;
  908.                SelectNextPage(TRUE);
  909.                end;
  910.             end;
  911.       end;
  912.  
  913.    {start page search for 'class' and start extracting Class names}
  914.    while EndOfSearch<>-1 do
  915.       begin
  916.       OneLinerClass:=false;
  917.       ThisIsDerivedClass:=false;
  918.       Break:=false;
  919.       ClassCommentLine:=false;
  920.       ExtractedClassName:='';
  921.       ClassSearch.SearchForString('class ',1,CompensateFirstSearch,'Include'); { Find 'class' from pos 0 }
  922.       CommentSearch.SearchForString('//',1,ClassSearch.LineFoundPositionOne,'Include');{ is class line a comment line }
  923.       if ClassSearch.LineNumberFound=CommentSearch.LineNumberFound then ClassCommentLine:=true;
  924.       if CommentSearch.PositionFound=-1 then CommentSearch.PositionFound:= 999999;
  925.       if ((ClassCommentLine=true) and (ClassSearch.PositionFound<CommentSearch.PositionFound)
  926.            and (ClassSearch.PositionFound<>-1))
  927.            or ((ClassCommentLine=false) and (ClassSearch.PositionFound<>-1)) then
  928.  
  929.          begin
  930.          OneLineOfCode:=CodePageForm.CodePage.Lines[ClassSearch.LineNumberFound];
  931.          StrLength:=Length(OneLineOfCode);
  932.          while StrLength=0 do {skip blank lines}
  933.             begin
  934.             OneLineOfCode:=CodePageForm.CodePage.Lines[ClassSearch.LineNumberFound+1];
  935.             StrLength:=Length(OneLineOfCode);
  936.             end;
  937.         {found valid class line}
  938.  
  939.          if ClassCommentLine=true then {strip off comments}
  940.             begin
  941.             CommentPagePosToLinePos:=CommentSearch.PositionFound-CommentSearch.LineFoundPositionOne;
  942.             OneLineOfCode:=CodePageForm.CodePage.Lines[ClassSearch.LineNumberFound];
  943.             OneLineOfCode:=Copy(OneLineOfCode,0,CommentPagePosToLinePos);
  944.             StrLength:=Length(OneLineOfCode);
  945.             end;
  946.          for p:=1 to (StrLength+1) do  {check for forward declaration}
  947.                   begin
  948.                   OneChar:=Copy(OneLineOfCode,p,1);
  949.                   if OneChar=';' then Break:=true;
  950.                   if OneChar=':' then ThisIsDerivedClass:=true;
  951.                   if OneChar='{' then OneLinerClass:=true;
  952.                   end;
  953.          {extract derived class}
  954.          if ThisIsDerivedClass=true then
  955.             begin
  956.  
  957.             { Get the 2nd derivation class name}
  958.             CopyLength:=StrLength;
  959.             TempString:='';
  960.             Done:=false;
  961.             CurrentSecondClass:='';
  962.             while Done=false do
  963.                begin
  964.                TempString:=Copy(OneLineOfCode,CopyLength,1);
  965.                if (TempString=':') or (TempString=' ') then Done:=true;
  966.  
  967.                if (TempString<>'{') and (Done=false) then
  968.                   begin
  969.                   AppendStr(TempString,CurrentSecondClass);
  970.                   CurrentSecondClass:=TempString;
  971.                   end;
  972.                Dec(CopyLength);
  973.                end;
  974.  
  975.             {Get Class Name}
  976.             x:=1;
  977.             while (x<>StrLength+1) and (Break<>true) do {read 1 char at a time of string}
  978.                begin
  979.                OneChar:=''; {clear it}
  980.                OneChar:=Copy(OneLineOfCode,x,1);
  981.                if OneChar=':' then  { Search for derived classes, find scope operator}
  982.                   begin
  983.                   OneChar:=' '; {clear it}
  984.                   x:=x-1; {move off of : }
  985.                   OneChar:=Copy(OneLineOfCode,x,1);
  986.                   while OneChar=' ' do  {backup until found last class letter}
  987.                      begin
  988.                      Dec(x);
  989.                      OneChar:=Copy(OneLineOfCode,x,1);
  990.                      end;
  991.                   while OneChar<>' ' do  {backup until found first class letter}
  992.                      begin
  993.                      OneChar:=Copy(OneLineOfCode,x,1);
  994.                      Dec(x);
  995.                      end;
  996.                   x:=x+2;
  997.                   OneChar:=Copy(OneLineOfCode,x,1);
  998.                   while (OneChar<>' ') and (OneChar<>':') do
  999.                      begin
  1000.                      ExtractedClassName:=ExtractedClassName+OneChar;
  1001.                      Inc(x);
  1002.                      OneChar:=Copy(OneLineOfCode,x,1);
  1003.                      end;
  1004.                   Break:=true; {stop loading chars- one at a time}
  1005.                   ExtractClassMembers(ClassSearch.PositionFound,ExtractedClassName);  {derived class}
  1006.                   end;
  1007.                Inc(x);
  1008.                end;            
  1009.             CurrentSecondClass:='';
  1010.             end;{end of extract derived class}
  1011.  
  1012.         {extract base classes}
  1013.         if (ThisIsDerivedClass=false) and (OneLinerClass=true) then
  1014.            begin
  1015.            x:=1;
  1016.            while (x<>StrLength+1) and (Break<>true) do {read 1 char at a time of string}
  1017.                begin
  1018.                OneChar:=''; {clear it}
  1019.                OneChar:=Copy(OneLineOfCode,x,1);
  1020.                if OneChar='{' then
  1021.                   begin
  1022.                   x:=x-1; { move off of : }
  1023.                   OneChar:=Copy(OneLineOfCode,x,1);
  1024.                   while OneChar=' ' do  {backup until found last class letter}
  1025.                      begin
  1026.                      Dec(x);
  1027.                      OneChar:=Copy(OneLineOfCode,x,1);
  1028.                      end;
  1029.                   while OneChar<>' ' do  {backup until found first class letter}
  1030.                      begin
  1031.                      OneChar:=Copy(OneLineOfCode,x,1);
  1032.                      Dec(x);
  1033.                      end;
  1034.                   x:=x+2;
  1035.                   OneChar:=Copy(OneLineOfCode,x,1);
  1036.                   while (OneChar<>' ') and (OneChar<>'{') do
  1037.                      begin
  1038.                      ExtractedClassName:=ExtractedClassName+OneChar;
  1039.                      Inc(x);
  1040.                      OneChar:=Copy(OneLineOfCode,x,1);
  1041.                      end;
  1042.                   Break:=true; {stop loading chars- one at a time}
  1043.                   ExtractClassMembers(ClassSearch.PositionFound,ExtractedClassName);  {Base class}
  1044.                   end;
  1045.                Inc(x);
  1046.                end;
  1047.            end;{end of base class extraction}
  1048.  
  1049.  
  1050.         {start of two line class declaration}
  1051.         if (OneLinerClass=false) and (ThisIsDerivedClass=false) and (Break<>true) then
  1052.            begin
  1053.            x:=StrLength;
  1054.            OneChar:=Copy(OneLineOfCode,x,1);
  1055.            while OneChar=' ' do  {backup until found last class letter}
  1056.               begin
  1057.               Dec(x);
  1058.               OneChar:=Copy(OneLineOfCode,x,1);
  1059.               end;
  1060.            while OneChar<>' ' do  {backup until found first class letter}
  1061.               begin
  1062.               OneChar:=Copy(OneLineOfCode,x,1);
  1063.               Dec(x);
  1064.               end;
  1065.            x:=x+2;
  1066.            OneChar:=Copy(OneLineOfCode,x,1);
  1067.            while x<>StrLength+1 do
  1068.               begin
  1069.               ExtractedClassName:=ExtractedClassName+OneChar;
  1070.               Inc(x);
  1071.               OneChar:=Copy(OneLineOfCode,x,1);
  1072.               end; {stop loading chars- one at a time}
  1073.            ExtractClassMembers(ClassSearch.PositionFound,ExtractedClassName);  { 2 line class }
  1074.            end;
  1075.          end;
  1076.          {end of two line class declaration}
  1077.       EndOfSearch:=ClassSearch.PositionFound;
  1078.       CompensateFirstSearch:=ClassSearch.NewSearchPosition;
  1079.       end;
  1080.  
  1081.    {Dont do tabs if table rebuild}
  1082.    if FileOpenActive<>true then
  1083.       begin
  1084.       ConvertTableToTabs;
  1085.       SelectaTab(Sender);
  1086.       end;
  1087.    end;
  1088.  
  1089.  
  1090. procedure TMainDlg.ExtractClassMembers(ClassPosition:Integer;ClassName:string); 
  1091.    var
  1092.    PublishedMember:string;
  1093.    HasPublishedMembers:Boolean;
  1094.    PublishedMembers:TSearchEngine;
  1095.    PublishedMemberLineNumber:Integer;
  1096.    AllMembersDone:Boolean;
  1097.    PublicMembersDone:Boolean;
  1098.    ProtectedMembersDone:Boolean;
  1099.    PrivateMembersDone:Boolean;
  1100.    PublishedMembersDone:Boolean;
  1101.    PublicMember:string;
  1102.    PrivateMember:string;
  1103.    ProtectedMember:string;
  1104.    HasPublicMembers:Boolean;
  1105.    HasProtectedMembers:Boolean;
  1106.    HasPrivateMembers:Boolean;
  1107.    BeginClassBracket:TSearchEngine;
  1108.    PublicMembers:TSearchEngine;
  1109.    PrivateMembers:TSearchEngine;
  1110.    ProtectedMembers:TSearchEngine;
  1111.    MemberCommentSearch:TSearchEngine;
  1112.    n:Integer;
  1113.    StrLength:Integer;
  1114.    j:Integer;
  1115.    ClassMember:string;
  1116.    PublicMemberLineNumber:Integer;
  1117.    ProtectedMemberLineNumber:Integer;
  1118.    PrivateMemberLineNumber:Integer;
  1119.    FoundEnd:Boolean;
  1120.    LineLength:Integer;
  1121.    CompleteMemberLinesCount:Integer;
  1122.    r:Integer;
  1123.    OneChar:string;
  1124.    b:Integer;
  1125.    Break:Boolean;
  1126.    x:Integer;
  1127.    FoundAnOpenBracket:Boolean;
  1128.    MyCount:Integer;
  1129.    MemberFoundPositionOne:uint;
  1130.    EndBracket:uint;
  1131.    FoundEqual:Boolean;
  1132.    MorePublisheds:Integer;
  1133.    MorePublics:Integer;
  1134.    MoreProtecteds:Integer;
  1135.    MorePrivates:Integer;
  1136.    begin
  1137.    HasPublishedMembers:=false;
  1138.    PublishedMember:='';
  1139.    PublishedMembers:=TSearchEngine.Create;
  1140.    PublishedMembers.SearchForString('__published:',1,ClassPosition,'Include');
  1141.    Break:=false;
  1142.    MyCount:=0;
  1143.    FoundAnOpenBracket:=false;
  1144.    AllMembersDone:=false;
  1145.    HasPublicMembers:=false;
  1146.    HasProtectedMembers:=false;
  1147.    HasPrivateMembers:=false;
  1148.    PublicMember:='';
  1149.    PrivateMember:='';
  1150.    ProtectedMember:='';
  1151.    MemberCommentSearch:=TSearchEngine.Create;
  1152.    BeginClassBracket:=TSearchEngine.Create;
  1153.    PublicMembers:=TSearchEngine.Create;
  1154.    ProtectedMembers:=TSearchEngine.Create;
  1155.    PrivateMembers:=TSearchEngine.Create;
  1156.    BeginClassBracket.SearchForString('{',1,ClassPosition,'Include');
  1157.    PublicMembers.SearchForString('public:',1,ClassPosition,'Include');
  1158.    ProtectedMembers.SearchForString('protected:',1,ClassPosition,'Include');
  1159.    PrivateMembers.SearchForString('private:',1,ClassPosition,'Include');
  1160.    b:= BeginClassBracket.LineNumberFound;
  1161.    MorePublisheds:=2;
  1162.    MorePublics:=2;
  1163.    MoreProtecteds:=2;
  1164.    MorePrivates:=2;
  1165.    DestTable.Close();
  1166.    DestTable.TableName:='main2.db';
  1167.    DestTable.Open();
  1168.  
  1169.    while Break<>true do
  1170.       begin
  1171.       x:=1;
  1172.       StrLength:=Length(CodePageForm.CodePage.Lines[b]);  {actual void Calls() line}
  1173.       while (x<>StrLength+1) and (Break<>True) do
  1174.          begin
  1175.          OneChar:=Copy(CodePageForm.CodePage.Lines[b],x,1);
  1176.          if OneChar='{' then
  1177.             begin
  1178.             FoundAnOpenBracket:=true;
  1179.             MyCount:=MyCount+1;
  1180.             end;
  1181.          if OneChar='}' then MyCount:=MyCount-1;
  1182.          Inc(x);
  1183.          if (MyCount=0) and (FoundAnOpenBracket=true) then Break:=true;
  1184.          end;
  1185.       Inc(b);
  1186.       end;
  1187.       b:=b-1;
  1188.    { line position that last ; is on }
  1189.    MemberFoundPositionOne:=SendMessage(CodePageForm.CodePage.Handle,EM_LINEINDEX,b,0);
  1190.    EndBracket:=MemberFoundPositionOne+(x-1);
  1191.  
  1192.    if (PublishedMembers.PositionFound<EndBracket) and (PublishedMembers.PositionFound<>-1) then HasPublishedMembers:=true;
  1193.    if (PublicMembers.PositionFound<EndBracket) and (PublicMembers.PositionFound<>-1) then HasPublicMembers:=true;
  1194.    if (ProtectedMembers.PositionFound<EndBracket) and (ProtectedMembers.PositionFound<>-1) then HasProtectedMembers:=true;
  1195.    if (PrivateMembers.PositionFound<EndBracket) and (PrivateMembers.PositionFound<>-1) then HasPrivateMembers:=true;
  1196.  
  1197.  
  1198.    while HasPublishedMembers do {begin Published members}
  1199.       begin
  1200.       n:=1;
  1201.       PublishedMembersDone:=false;
  1202.       while PublishedMembersDone<>true do
  1203.          begin
  1204.          if ((PublishedMembers.LineNumberFound+n)=(PublicMembers.LineNumberFound)) or
  1205.             ((PublishedMembers.LineNumberFound+n)=(ProtectedMembers.LineNumberFound)) or
  1206.             ((PublishedMembers.LineNumberFound+n)=(PrivateMembers.LineNumberFound)) or
  1207.             ((PublishedMembers.LineNumberFound+n)=(b))  then PublishedMembersDone:=true;
  1208.  
  1209.          ClassMember:='';
  1210.          ClassMember:=CodePageForm.CodePage.Lines[PublishedMembers.LineNumberFound+n];  {line where Published is}
  1211.          if (Pos('public:',ClassMember)<>0) then PublishedMembersDone:=true;
  1212.          if (Pos('private:',ClassMember)<>0) then PublishedMembersDone:=true;
  1213.          if (Pos('__published:',ClassMember)<>0) then PublishedMembersDone:=true;
  1214.          if (Pos('protected:',ClassMember)<>0) then PublishedMembersDone:=true;
  1215.          PublishedMemberLineNumber:=PublishedMembers.LineNumberFound+n;
  1216.  
  1217.  
  1218.          while IsItABadLine(ClassMember,PublishedMemberLineNumber)=true do {check for bad line}
  1219.             begin
  1220.             ClassMember:=CodePageForm.CodePage.Lines[PublishedMembers.LineNumberFound+n+1];
  1221.             if (Pos('public:',ClassMember)<>0) then PublishedMembersDone:=true;
  1222.             if (Pos('private:',ClassMember)<>0) then PublishedMembersDone:=true;
  1223.             if (Pos('__published:',ClassMember)<>0) then PublishedMembersDone:=true;
  1224.             if (Pos('protected:',ClassMember)<>0) then PublishedMembersDone:=true;
  1225.             if ((PublishedMembers.LineNumberFound+n+1)=(PublicMembers.LineNumberFound)) or
  1226.                ((PublishedMembers.LineNumberFound+n+1)=(ProtectedMembers.LineNumberFound)) or
  1227.                ((PublishedMembers.LineNumberFound+n+1)=(PrivateMembers.LineNumberFound)) or
  1228.                ((PublishedMembers.LineNumberFound+n+1)=(b))  then PublishedMembersDone:=true;
  1229.                PublishedMemberLineNumber:=PublishedMembers.LineNumberFound+n+1;
  1230.                Inc(n);
  1231.             end;{end of bad line adjustment}
  1232.  
  1233.          if PublishedMembersDone=false then
  1234.             begin
  1235.             FoundEqual:=false;
  1236.             FoundEnd:=false;
  1237.             CompleteMemberLinesCount:=1;
  1238.             while FoundEnd<>true do   {Append multiple line functions}
  1239.                begin
  1240.                   LineLength:=Length(ClassMember);
  1241.                   for r:=1 to LineLength+1 do {check first line}
  1242.                      begin
  1243.                      OneChar:=Copy(ClassMember,r,1);
  1244.                      if OneChar='=' then FoundEqual:=true;
  1245.                      if OneChar=';' then FoundEnd:=true;
  1246.                      if (OneChar='}') and (FoundEqual=false) then FoundEnd:=true;
  1247.                      end;
  1248.                 if FoundEnd=false then
  1249.                      ClassMember:=ClassMember+CodePageForm.CodePage.Lines[PublishedMembers.LineNumberFound+n+CompleteMemberLinesCount];
  1250.                 Inc(CompleteMemberLinesCount);
  1251.                 end;
  1252.             MemberToTable(ClassMember,'__published',ClassName,PublishedMemberLineNumber);
  1253.             end;
  1254.  
  1255.          n:=n+CompleteMemberLinesCount-2;
  1256.          Inc(n);
  1257.          end;
  1258.       HasPublishedMembers:=false;
  1259.       PublishedMembers.SearchForString('__published:',MorePublisheds,ClassPosition,'Include');
  1260.       if (PublishedMembers.PositionFound<EndBracket) and (PublishedMembers.PositionFound<>-1) then
  1261.          begin
  1262.          HasPublishedMembers:=true;
  1263.          Inc(MorePublisheds);
  1264.          end;
  1265.       end;
  1266.  
  1267.    while HasPublicMembers do {begin public members}
  1268.       begin
  1269.       n:=1;
  1270.       PublicMembersDone:=false;
  1271.       while PublicMembersDone<>true do
  1272.          begin
  1273.          if ((PublicMembers.LineNumberFound+n)=(PublishedMembers.LineNumberFound)) or
  1274.             ((PublicMembers.LineNumberFound+n)=(ProtectedMembers.LineNumberFound)) or
  1275.             ((PublicMembers.LineNumberFound+n)=(PrivateMembers.LineNumberFound)) or
  1276.             ((PublicMembers.LineNumberFound+n)=(b))  then PublicMembersDone:=true;
  1277.          ClassMember:='';
  1278.          ClassMember:=CodePageForm.CodePage.Lines[PublicMembers.LineNumberFound+n];  { line where public is }
  1279.          if (Pos('public:',ClassMember)<>0) then PublicMembersDone:=true;
  1280.          if (Pos('private:',ClassMember)<>0) then PublicMembersDone:=true;
  1281.          if (Pos('__published:',ClassMember)<>0) then PublicMembersDone:=true;
  1282.          if (Pos('protected:',ClassMember)<>0) then PublicMembersDone:=true;
  1283.          PublicMemberLineNumber:=PublicMembers.LineNumberFound+n;
  1284.  
  1285.  
  1286.          while IsItABadLine(ClassMember,PublicMemberLineNumber)=true do { check for bad line }
  1287.             begin
  1288.             ClassMember:=CodePageForm.CodePage.Lines[PublicMembers.LineNumberFound+n+1];
  1289.             if (Pos('public:',ClassMember)<>0) then PublicMembersDone:=true;
  1290.             if (Pos('private:',ClassMember)<>0) then PublicMembersDone:=true;
  1291.             if (Pos('__published:',ClassMember)<>0) then PublicMembersDone:=true;
  1292.             if (Pos('protected:',ClassMember)<>0) then PublicMembersDone:=true;
  1293.             if ((PublicMembers.LineNumberFound+n+1)=(PublishedMembers.LineNumberFound)) or
  1294.                ((PublicMembers.LineNumberFound+n+1)=(ProtectedMembers.LineNumberFound)) or
  1295.                ((PublicMembers.LineNumberFound+n+1)=(PrivateMembers.LineNumberFound)) or
  1296.                ((PublicMembers.LineNumberFound+n+1)=(b))  then PublicMembersDone:=true;
  1297.                PublicMemberLineNumber:=PublicMembers.LineNumberFound+n+1;
  1298.                Inc(n);
  1299.             end;{ end of bad line adjustment }
  1300.  
  1301.          if PublicMembersDone=false then
  1302.             begin
  1303.             FoundEqual:=false;
  1304.             FoundEnd:=false;
  1305.             CompleteMemberLinesCount:=1;
  1306.             while FoundEnd<>true do   {Append multiple line functions }
  1307.                begin
  1308.                   LineLength:=Length(ClassMember);
  1309.                   for r:=1 to LineLength+1 do { check first line }
  1310.                      begin
  1311.                      OneChar:=Copy(ClassMember,r,1);
  1312.                      if OneChar='=' then FoundEqual:=true;
  1313.                      if OneChar=';' then FoundEnd:=true;
  1314.                      if (OneChar='}') and (FoundEqual=false) then FoundEnd:=true;
  1315.                      end;
  1316.                 if FoundEnd=false then
  1317.                      ClassMember:=ClassMember+CodePageForm.CodePage.Lines[PublicMembers.LineNumberFound+n+CompleteMemberLinesCount];
  1318.                 Inc(CompleteMemberLinesCount);
  1319.                 end;
  1320.             MemberToTable(ClassMember,'public',ClassName,PublicMemberLineNumber);
  1321.             end;
  1322.  
  1323.          n:=n+CompleteMemberLinesCount-2;
  1324.          Inc(n);
  1325.          end;
  1326.       HasPublicMembers:=false;
  1327.       PublicMembers.SearchForString('public:',MorePublics,ClassPosition,'Include');
  1328.       if (PublicMembers.PositionFound<EndBracket) and (PublicMembers.PositionFound<>-1) then
  1329.          begin
  1330.          HasPublicMembers:=true;
  1331.          Inc(MorePublics);
  1332.          end;
  1333.       end;
  1334.  
  1335.  
  1336.    while HasProtectedMembers do {  begin protected members  }
  1337.       begin
  1338.       n:=1;
  1339.       ProtectedMembersDone:=false;
  1340.       while ProtectedMembersDone<>true do
  1341.          begin
  1342.          if ((ProtectedMembers.LineNumberFound+n)=(PublishedMembers.LineNumberFound)) or
  1343.             ((ProtectedMembers.LineNumberFound+n)=(PublicMembers.LineNumberFound)) or
  1344.             ((ProtectedMembers.LineNumberFound+n)=(PrivateMembers.LineNumberFound)) or
  1345.             ((ProtectedMembers.LineNumberFound+n)=(b))  then ProtectedMembersDone:=true;
  1346.          
  1347.          ClassMember:='';
  1348.           {skip blank lines and load a new line }
  1349.          ClassMember:=CodePageForm.CodePage.Lines[ProtectedMembers.LineNumberFound+n];  { line where protected is }
  1350.          if (Pos('public:',ClassMember)<>0) then ProtectedMembersDone:=true;
  1351.          if (Pos('private:',ClassMember)<>0) then ProtectedMembersDone:=true;
  1352.          if (Pos('__published:',ClassMember)<>0) then ProtectedMembersDone:=true;
  1353.          if (Pos('protected:',ClassMember)<>0) then ProtectedMembersDone:=true;
  1354.  
  1355.  
  1356.          ProtectedMemberLineNumber:=ProtectedMembers.LineNumberFound+n;
  1357.           while IsItABadLine(ClassMember,ProtectedMemberLineNumber)=true do
  1358.             begin
  1359.             ClassMember:=CodePageForm.CodePage.Lines[ProtectedMembers.LineNumberFound+n+1];
  1360.             if (Pos('public:',ClassMember)<>0) then ProtectedMembersDone:=true;
  1361.             if (Pos('private:',ClassMember)<>0) then ProtectedMembersDone:=true;
  1362.             if (Pos('__published:',ClassMember)<>0) then ProtectedMembersDone:=true;
  1363.             if (Pos('protected:',ClassMember)<>0) then ProtectedMembersDone:=true;
  1364.             if ((ProtectedMembers.LineNumberFound+n+1)=(PublishedMembers.LineNumberFound)) or
  1365.                ((ProtectedMembers.LineNumberFound+n+1)=(PublicMembers.LineNumberFound)) or
  1366.                ((ProtectedMembers.LineNumberFound+n+1)=(PrivateMembers.LineNumberFound)) or
  1367.                ((ProtectedMembers.LineNumberFound+n+1)=(b)) then ProtectedMembersDone:=true;
  1368.             ProtectedMemberLineNumber:=ProtectedMembers.LineNumberFound+n+1;
  1369.             Inc(n)
  1370.             end;{ end of blank line adjustment }
  1371.  
  1372.          if ProtectedMembersDone=false then
  1373.            begin
  1374.            FoundEqual:=false;
  1375.            FoundEnd:=false;
  1376.            CompleteMemberLinesCount:=1;
  1377.            while FoundEnd<>true do   {Append multiple line functions }
  1378.               begin
  1379.                  LineLength:=Length(ClassMember);
  1380.                  for r:=1 to LineLength+1 do { check first line }
  1381.                     begin
  1382.                     OneChar:=Copy(ClassMember,r,1);
  1383.                     if OneChar='=' then FoundEqual:=true;
  1384.                     if OneChar=';' then FoundEnd:=true;
  1385.                     if (OneChar='}') and (FoundEqual=false) then FoundEnd:=true;
  1386.                     end;
  1387.                if FoundEnd=false then
  1388.                     ClassMember:=ClassMember+CodePageForm.CodePage.Lines[ProtectedMembers.LineNumberFound+n+CompleteMemberLinesCount];
  1389.                Inc(CompleteMemberLinesCount);
  1390.                end;
  1391.             MemberToTable(ClassMember,'protected',ClassName,ProtectedMemberLineNumber);
  1392.             end;
  1393.          n:=n+CompleteMemberLinesCount-2;
  1394.  
  1395.          Inc(n);
  1396.          end;
  1397.       HasProtectedMembers:=false;
  1398.       ProtectedMembers.SearchForString('protected:',MoreProtecteds,ClassPosition,'Include');
  1399.       if (ProtectedMembers.PositionFound<EndBracket) and (ProtectedMembers.PositionFound<>-1) then
  1400.          begin
  1401.          HasProtectedMembers:=true;
  1402.          Inc(MoreProtecteds);
  1403.          end;
  1404.       end;
  1405.  
  1406.    while HasPrivateMembers do {  begin public members  }
  1407.       begin
  1408.       n:=1;
  1409.       PrivateMembersDone:=false;
  1410.       while PrivateMembersDone<>true do
  1411.          begin
  1412.          if ((PrivateMembers.LineNumberFound+n)=(PublishedMembers.LineNumberFound)) or
  1413.             ((PrivateMembers.LineNumberFound+n)=(ProtectedMembers.LineNumberFound)) or
  1414.             ((PrivateMembers.LineNumberFound+n)=(PublicMembers.LineNumberFound)) or
  1415.             ((PrivateMembers.LineNumberFound+n)=(b))  then PrivateMembersDone:=true;
  1416.          
  1417.          ClassMember:='';
  1418.           {skip blank lines and load a new line }
  1419.          ClassMember:=CodePageForm.CodePage.Lines[PrivateMembers.LineNumberFound+n];  { line where public is }
  1420.          if (Pos('public:',ClassMember)<>0) then PrivateMembersDone:=true;
  1421.          if (Pos('private:',ClassMember)<>0) then PrivateMembersDone:=true;
  1422.          if (Pos('__published:',ClassMember)<>0) then PrivateMembersDone:=true;
  1423.          if (Pos('protected:',ClassMember)<>0) then PrivateMembersDone:=true;
  1424.          PrivateMemberLineNumber:=PrivateMembers.LineNumberFound+n;
  1425.  
  1426.           while IsItABadLine(ClassMember,PrivateMemberLineNumber)=true do
  1427.             begin
  1428.             ClassMember:=CodePageForm.CodePage.Lines[PrivateMembers.LineNumberFound+n+1];
  1429.             if (Pos('public:',ClassMember)<>0) then PrivateMembersDone:=true;
  1430.             if (Pos('private:',ClassMember)<>0) then PrivateMembersDone:=true;
  1431.             if (Pos('__published:',ClassMember)<>0) then PrivateMembersDone:=true;
  1432.             if (Pos('protected:',ClassMember)<>0) then PrivateMembersDone:=true;
  1433.             if ((PrivateMembers.LineNumberFound+n+1)=(PublishedMembers.LineNumberFound)) or
  1434.                ((PrivateMembers.LineNumberFound+n+1)=(ProtectedMembers.LineNumberFound)) or
  1435.                ((PrivateMembers.LineNumberFound+n+1)=(PublicMembers.LineNumberFound)) or
  1436.                ((PrivateMembers.LineNumberFound+n+1)=(b)) then PrivateMembersDone:=true;
  1437.             PrivateMemberLineNumber:=PrivateMembers.LineNumberFound+n+1;
  1438.             Inc(n)
  1439.             end;{ end of blank line adjustment }
  1440.  
  1441.          if PrivateMembersDone=false then
  1442.             begin
  1443.             FoundEqual:=false;
  1444.             FoundEnd:=false;
  1445.             CompleteMemberLinesCount:=1;
  1446.             while FoundEnd<>true do   {Append multiple line functions }
  1447.                begin
  1448.                   LineLength:=Length(ClassMember);
  1449.                   for r:=1 to LineLength+1 do { check first line }
  1450.                      begin
  1451.                      OneChar:=Copy(ClassMember,r,1);
  1452.                      if OneChar='=' then FoundEqual:=true;
  1453.                      if OneChar=';' then FoundEnd:=true;
  1454.                      if (OneChar='}') and (FoundEqual=false) then FoundEnd:=true;
  1455.                      end;
  1456.                 if FoundEnd=false then
  1457.                      ClassMember:=ClassMember+CodePageForm.CodePage.Lines[PrivateMembers.LineNumberFound+n+CompleteMemberLinesCount];
  1458.                 Inc(CompleteMemberLinesCount);
  1459.                 end;
  1460.             MemberToTable(ClassMember,'private',ClassName,PrivateMemberLineNumber);
  1461.             end;
  1462.          n:=n+CompleteMemberLinesCount-2;
  1463.          Inc(n);
  1464.          end;
  1465.       HasPrivateMembers:=false;
  1466.       PrivateMembers.SearchForString('private:',MorePrivates,ClassPosition,'Include');
  1467.       if (PrivateMembers.PositionFound<EndBracket) and (PrivateMembers.PositionFound<>-1) then
  1468.          begin
  1469.          HasPrivateMembers:=true;
  1470.          Inc(MorePrivates);
  1471.          end;
  1472.       end;
  1473.    end;
  1474.  
  1475.  
  1476. procedure TMainDlg.MemberToTable(MemberDeclaration:string;MyScope:string;CppClassName:string;MemberLineNumber:Integer);
  1477.    var
  1478.    k:Integer;
  1479.    v:Integer;
  1480.    EndOfParams:Boolean;
  1481.    ExtractObjects:TExtractObjects;
  1482.    IsItAFunction:Boolean;
  1483.    Break:Boolean;
  1484.    StrLength:Integer;
  1485.    y:Integer;
  1486.    OneChar:string;
  1487.    ArrayObjectNames:array[0..8] of string;
  1488.    ArrayObjectTypes:array[0..8]of string;
  1489.    MemberCommentSearch:TSearchEngine;
  1490.    MemberFoundPositionOne:uint;
  1491.    IsItAProperty:Integer;
  1492.    Len:Integer;
  1493.    ClassMemberName:string;
  1494.    begin
  1495.    DestTable.Append();
  1496.    MemberCommentSearch:=TSearchEngine.Create;
  1497.    IsItAFunction:=false;
  1498.    ExtractObjects:=TExtractObjects.Create;
  1499.    Break:=false;
  1500.    StrLength:=Length(MemberDeclaration);
  1501.    y:=1;
  1502.    IsItAProperty:=Pos('__property',MemberDeclaration);
  1503.  
  1504.    while (y<>StrLength+1) and (Break<>true) do { read line }
  1505.       begin
  1506.       OneChar:=''; { clear it} 
  1507.       OneChar:=Copy(MemberDeclaration,y,1);   { look for ( bracket }
  1508.       if (OneChar='(') or (y=StrLength) or (OneChar='=')or (OneChar='[')then {for data and function members }
  1509.          begin
  1510.          if OneChar='(' then IsItAFunction:=true;
  1511.          if OneChar='=' then IsItAFunction:=true;
  1512.          {skip over member comments and extract member type and name }
  1513.          MemberFoundPositionOne:=SendMessage(CodePageForm.CodePage.Handle,EM_LINEINDEX,MemberLineNumber,0);
  1514.          MemberCommentSearch.SearchForString('*/',1,MemberFoundPositionOne,'Include');
  1515.          if (MemberCommentSearch.PositionFound=-1) or (MemberCommentSearch.PositionFound>MemberFoundPositionOne+y) then
  1516.              ExtractObjects.ExtractObjectNameAndType(1,y,MemberDeclaration,'MemberName')
  1517.              else
  1518.                 begin
  1519.                 ExtractObjects.ExtractObjectNameAndType((MemberCommentSearch.PositionFound-MemberFoundPositionOne)+3,
  1520.                                                         y,MemberDeclaration,'MemberName');{ get name and type }
  1521.                 end;
  1522.          OneChar:=Copy(ExtractObjects.ObjectName,0,1);
  1523.          if OneChar='*' then
  1524.             begin  { make sure pointers are on type side }
  1525.             Len:=Length(ExtractObjects.ObjectName);
  1526.             ExtractObjects.ObjectName:=Copy(ExtractObjects.ObjectName,2,Len);
  1527.             AppendStr(ExtractObjects.ObjectType,'*');
  1528.             end;
  1529.          if OneChar='&' then
  1530.             begin  { make sure references are on type side }
  1531.             Len:=Length(ExtractObjects.ObjectName);
  1532.             ExtractObjects.ObjectName:=Copy(ExtractObjects.ObjectName,2,Len);
  1533.             AppendStr(ExtractObjects.ObjectType,'&');
  1534.             end;
  1535.          ClassMemberName:=ExtractObjects.ObjectName;
  1536.          DestTableMemberName.AsString:=ClassMemberName;
  1537.          DestTableReturnType.AsString:=ExtractObjects.ObjectType;
  1538.          Break:=true;
  1539.          EndOfParams:=false;
  1540.          v:=0;
  1541.          {extract parameters}
  1542.          while (EndOfParams<>true) and (v<>StrLength+1) and (IsItAFunction=true )do
  1543.             begin
  1544.             k:=1;
  1545.             v:=y+1;
  1546.             OneChar:=Copy(MemberDeclaration,v,1);
  1547.             if OneChar=')' then EndOfParams:=true;
  1548.             if OneChar='}' then EndOfParams:=true;
  1549.             ExtractObjects.LastCommaPosition:=y;
  1550.             while EndOfParams<>true do
  1551.                begin
  1552.                OneChar:=Copy(MemberDeclaration,v,1);
  1553.                if OneChar=')' then EndOfParams:=true;
  1554.                if OneChar='}' then EndOfParams:=true;
  1555.                if (OneChar=',') or (OneChar=')') or (OneChar='}')then
  1556.                   begin
  1557.                   ExtractObjects.ObjectName:='';
  1558.                   ExtractObjects.ObjectType:='';
  1559.                   ExtractObjects.ExtractObjectNameAndType(ExtractObjects.LastCommaPosition+1,v,MemberDeclaration,
  1560.                   'Parameter');
  1561.                   OneChar:=Copy(ExtractObjects.ObjectName,0,1);
  1562.                   if OneChar='*' then
  1563.                      begin  {make sure pointers are on type side }
  1564.                      Len:=Length(ExtractObjects.ObjectName);
  1565.                      ExtractObjects.ObjectName:=Copy(ExtractObjects.ObjectName,2,Len);
  1566.                      AppendStr(ExtractObjects.ObjectType,'*');
  1567.                      end;
  1568.                   if OneChar='&' then
  1569.                      begin  { make sure references are on type side }
  1570.                      Len:=Length(ExtractObjects.ObjectName);
  1571.                      ExtractObjects.ObjectName:=Copy(ExtractObjects.ObjectName,2,Len);
  1572.                      AppendStr(ExtractObjects.ObjectType,'&');
  1573.                      end;
  1574.                   ArrayObjectNames[k]:=ExtractObjects.ObjectName;
  1575.                   ArrayObjectTypes[k]:=ExtractObjects.ObjectType;
  1576.                   Inc(k);
  1577.                   if k=9 then EndOfParams:=true;
  1578.                   end;
  1579.                Inc(v);
  1580.                end;
  1581.             end;
  1582.             DestTablePType1.AsString:=ArrayObjectTypes[1];
  1583.             DestTablePType2.AsString:=ArrayObjectTypes[2];
  1584.             DestTablePType3.AsString:=ArrayObjectTypes[3];
  1585.             DestTablePType4.AsString:=ArrayObjectTypes[4];
  1586.             DestTablePType5.AsString:=ArrayObjectTypes[5];
  1587.             DestTablePType6.AsString:=ArrayObjectTypes[6];
  1588.             DestTablePType7.AsString:=ArrayObjectTypes[7];
  1589.             DestTablePType8.AsString:=ArrayObjectTypes[8];
  1590.             DestTablePObject1.AsString:=ArrayObjectNames[1];
  1591.             DestTablePObject2.AsString:=ArrayObjectNames[2];
  1592.             DestTablePObject3.AsString:=ArrayObjectNames[3];
  1593.             DestTablePObject4.AsString:=ArrayObjectNames[4];
  1594.             DestTablePObject5.AsString:=ArrayObjectNames[5];
  1595.             DestTablePObject6.AsString:=ArrayObjectNames[6];
  1596.             DestTablePObject7.AsString:=ArrayObjectNames[7];
  1597.             DestTablePObject8.AsString:=ArrayObjectNames[8];
  1598.             ArrayObjectTypes[1]:='';
  1599.             ArrayObjectNames[1]:='';
  1600.             ArrayObjectTypes[2]:='';
  1601.             ArrayObjectNames[2]:='';
  1602.             ArrayObjectTypes[3]:='';
  1603.             ArrayObjectNames[3]:='';
  1604.             ArrayObjectTypes[4]:='';
  1605.             ArrayObjectNames[4]:='';
  1606.             ArrayObjectTypes[5]:='';
  1607.             ArrayObjectNames[5]:='';
  1608.             ArrayObjectTypes[6]:='';
  1609.             ArrayObjectNames[6]:='';
  1610.             ArrayObjectTypes[7]:='';
  1611.             ArrayObjectNames[7]:='';
  1612.             ArrayObjectTypes[8]:='';
  1613.             ArrayObjectNames[8]:='';
  1614.             if IsItAFunction=false then DestTablePs.AsInteger:=0;
  1615.             if IsItAFunction=true then  DestTablePs.AsInteger:=k-1;
  1616.             DestTableSecondClass.AsString:=CurrentSecondClass;
  1617.             DestTableHeader.AsString:=CurrentHeaderFileName;
  1618.             DestTableScope.AsString:=MyScope;
  1619.             DestTableClassName.AsString:=CppClassName;
  1620.             DestTableMisc.AsString:=PasSourceFileName;
  1621.             if IsItAFunction=true then
  1622.                begin
  1623.                if CppClassName=ClassMemberName then DestTableMember.AsString:='constructor'
  1624.                   else DestTableMember.AsString:='function';
  1625.                end;
  1626.             if IsItAFunction=false then DestTableMember.AsString:='data';
  1627.             if IsItAProperty<>0 then DestTableMember.AsString:='property';
  1628.             DestTable.Post();
  1629.          end;
  1630.       Inc(y);
  1631.       end;
  1632.    end;
  1633.  
  1634. procedure TExtractObjects.ExtractObjectNameAndType(StartPosition:Integer;
  1635.              EndPosition:Integer; LineString:string;Phase:string);
  1636.    var
  1637.    IsItAProperty:Integer;
  1638.    FindStartofReturnType:Integer;
  1639.    MemberNameFirstCharPos:Integer;
  1640.    x:Integer;
  1641.    j:Integer;
  1642.    OneChar:string;
  1643.    NoReturnType:Boolean;
  1644.    begin
  1645.    NoReturnType:=false;
  1646.    x:=EndPosition;
  1647.    ObjectName:='';
  1648.    ObjectType:='';
  1649.    LastCommaPosition:=EndPosition;
  1650.    x:=x-1;
  1651.    OneChar:=Copy(LineString,x,1);
  1652.    while (OneChar=' ') or (OneChar=#9) do  {backup until found last letter of Object Name}
  1653.       begin
  1654.       Dec(x);
  1655.       OneChar:=Copy(LineString,x,1);
  1656.       end;  {backup until found first letter of member name or (OneChar<>'(')}
  1657.    while (OneChar<>' ') and (OneChar<>'(') and (OneChar<>#9) and (OneChar<>',') and (OneChar<>'{')and (OneChar<>'*')do
  1658.       begin
  1659.       OneChar:=Copy(LineString,x,1);
  1660.       if OneChar='{' then NoReturnType:=true;
  1661.       Dec(x);
  1662.       end;
  1663.    x:=x+2;
  1664.    MemberNameFirstCharPos:=x;
  1665.    OneChar:=Copy(LineString,x,1);
  1666.    IsItAProperty:=Pos('__property',LineString);
  1667.  
  1668.    {Handle extracting property names differently stop only at = and curl bracket}
  1669.    if (IsItAProperty<>0) and (Phase='MemberName') then
  1670.       begin
  1671.       while (OneChar<>'=') and (OneChar<>'}') and (OneChar<>';')do
  1672.          begin
  1673.          ObjectName:=ObjectName+OneChar;
  1674.          Inc(x);
  1675.          OneChar:=Copy(LineString,x,1);
  1676.          end;
  1677.       end
  1678.          else {extract object name}
  1679.          begin
  1680.          while (OneChar<>' ') and (OneChar<>#9)  and (OneChar<>';') and (OneChar<>',')
  1681.                and (OneChar<>'(') and (OneChar<>')')
  1682.                and (OneChar<>'{') and (OneChar<>'}') do
  1683.             begin
  1684.             ObjectName:=ObjectName+OneChar;
  1685.             Inc(x);
  1686.             OneChar:=Copy(LineString,x,1);
  1687.             end;
  1688.          end; 
  1689.  
  1690.    {extract return type}
  1691.    if MemberNameFirstCharPos=1 then NoReturnType:=true;  { is it constructor or destructor}
  1692.    MemberNameFirstCharPos:=MemberNameFirstCharPos-1; { move off of : }
  1693.    OneChar:=Copy(LineString,MemberNameFirstCharPos,1);
  1694.    while (OneChar=' ') and (NoReturnType<>true) do  {backup until found last letter of Return Type}
  1695.       begin
  1696.       if MemberNameFirstCharPos=1 then NoReturnType:=true;
  1697.       Dec(MemberNameFirstCharPos);
  1698.       OneChar:=Copy(LineString,MemberNameFirstCharPos,1);
  1699.       end;
  1700.    if NoReturnType=false then
  1701.       begin
  1702.       FindStartofReturnType:=StartPosition;
  1703.       OneChar:=Copy(LineString,FindStartofReturnType,1);
  1704.       while OneChar=' ' do  {find start pos of ReturnType}
  1705.          begin
  1706.          FindStartofReturnType:=FindStartofReturnType+1;
  1707.          OneChar:=Copy(LineString,FindStartofReturnType,1);
  1708.          end;
  1709.       for j:=FindStartofReturnType to MemberNameFirstCharPos do
  1710.          begin
  1711.          OneChar:=Copy(LineString,j,1);
  1712.          if OneChar<>#9 then ObjectType:=ObjectType+OneChar;
  1713.          end;
  1714.       end;
  1715.    end;
  1716.  
  1717. function TMainDlg.IsItABadLine(Line:string;DefinedLineNumber:Integer):Boolean; { or # line }
  1718.       var
  1719.       StringLength:Integer;
  1720.       x:Integer;
  1721.       FoundSemicolon:Boolean;
  1722.       FoundOpenBracket:Boolean;
  1723.       OneCharacter:string;
  1724.       BadLine:Boolean;
  1725.       DefineLineSearch:TSearchEngine;
  1726.       MemberFoundPositionOne:uint;
  1727.       FoundPound:Boolean;
  1728.       begin
  1729.       DefineLineSearch:=TSearchEngine.Create;
  1730.       FoundSemicolon:=false;
  1731.       FoundOpenBracket:=false;
  1732.       BadLine:=true;
  1733.       FoundPound:=false;
  1734.       StringLength:=Length(Line);
  1735.       for x:=1 to StringLength+1 do
  1736.          begin
  1737.          OneCharacter:=Copy(Line,x,1);
  1738.          if  OneCharacter=';' then FoundSemicolon:=true;
  1739.          if OneCharacter='#' then FoundPound:=true;
  1740.          if  (OneCharacter='(') or (OneCharacter='{') then
  1741.             begin
  1742.             FoundOpenBracket:=true;
  1743.             MemberFoundPositionOne:=SendMessage(CodePageForm.CodePage.Handle,EM_LINEINDEX,DefinedLineNumber,0);
  1744.             DefineLineSearch.SearchForString('define',1,MemberFoundPositionOne,'Include');
  1745.             if (DefineLineSearch.PositionFound<MemberFoundPositionOne+x) and (DefineLineSearch.PositionFound <>-1)
  1746.                 and (FoundPound=true) then
  1747.                 FoundOpenBracket:=false;
  1748.             end
  1749.          end;
  1750.       if FoundSemicolon=true then BadLine:=false;
  1751.       if FoundOpenBracket=true then BadLine:=false;
  1752.       Result:=BadLine;
  1753.       end;
  1754.  
  1755. procedure TMainDlg.LoadDeclarationSource(ListBoxString:string);
  1756.    var
  1757.    FoundAnEqual:Boolean;
  1758.    LineCount:Integer;
  1759.    FoundAnEnd:Boolean;
  1760.    MemberDeclareSearch:TSearchEngine;
  1761.    ClassDeclareSearch:TSearchEngine;
  1762.    ActualCodeLine:string;
  1763.    StrLength:Integer;
  1764.    OneChar:string;
  1765.    d:Integer;
  1766.    FoundFirstChar:Boolean;
  1767.    OccuranceNum:Integer;
  1768.    ListStringLen:Integer;
  1769.    x:Integer;
  1770.    CondensedString:string;
  1771.    HeaderMemberCondensed:string;
  1772.    MatchFound:Boolean;
  1773.    DeclareStringList:TStringList;
  1774.    begin
  1775.    DeclareStringList:=TStringList.Create;
  1776.    DeclareStringList.Clear;
  1777.    DeclarationRichEdit.Lines.Clear;
  1778.    MatchFound:=false;
  1779.    OccuranceNum:=1;
  1780.    FoundFirstChar:=false;
  1781.    ClassDeclareSearch:=TSearchEngine.Create;
  1782.    ClassDeclareSearch.SearchForString(CurrentTabClassName,1,0,'Include');{Search for Class}
  1783.    MemberDeclareSearch:=TSearchEngine.Create;
  1784.    if CurrentTabClassName=CurrentSelectedMemberName then
  1785.       begin
  1786.       OccuranceNum:=2;
  1787.       end;
  1788.    {strip spaces from listbox string}
  1789.    CondensedString:='';
  1790.    ListStringLen:=Length(ListBoxString);
  1791.    for x:=1 to ListStringLen do
  1792.       begin
  1793.       OneChar:=Copy(ListBoxString,x,1);
  1794.       if (OneChar<>' ') and (OneChar<>#9) then CondensedString:=CondensedString+OneChar;
  1795.       end;
  1796.    {Search for MemberName only}
  1797.    while MatchFound<>true do
  1798.       begin                               {this is the member name only}
  1799.       MemberDeclareSearch.SearchForString(CurrentSelectedMemberName,OccuranceNum,ClassDeclareSearch.PositionFound,'Include');
  1800.       if MemberDeclareSearch.PositionFound=-1 then
  1801.          begin
  1802.          Errorlogging.Open;
  1803.          ErrorLogging.Append;
  1804.          ErrorLoggingUser.AsString:=UserName;
  1805.          ErrorLoggingClassName.AsString:=CurrentTabClassName;
  1806.          ErrorLoggingListBoxText.AsString:=ListBoxString;
  1807.          ErrorLoggingMemberName.AsString:=CurrentSelectedMemberName;
  1808.          ErrorLogging.Post;
  1809.          Errorlogging.Close;
  1810.          MessageDlg('Table/ListBox error !! '+ListBoxString+
  1811.           ' record does not match header!',mtError, [mbOk], 0);
  1812.          Exit;
  1813.          end;
  1814.       FoundAnEqual:=false;
  1815.       FoundAnEnd:=false;
  1816.       LineCount:=0;
  1817.       HeaderMemberCondensed:='';
  1818.       while FoundAnEnd<>true do {Append multiple line functions}
  1819.          begin
  1820.          d:=1;
  1821.          ActualCodeLine:='';
  1822.          StrLength:=Length(CodePageForm.CodePage.Lines[MemberDeclareSearch.LineNumberFound + LineCount]);
  1823.          while (d<>StrLength+1) and (FoundAnEnd<>true) do
  1824.             begin
  1825.             OneChar:=Copy(CodePageForm.CodePage.Lines[MemberDeclareSearch.LineNumberFound + LineCount],d,1);
  1826.             if OneChar='=' then FoundAnEqual:=true;
  1827.             if OneChar=';' then FoundAnEnd:=true;
  1828.             if (OneChar='}') and (FoundAnEqual=false) then FoundAnEnd:=true;
  1829.             if (OneChar<>' ') and (OneChar<>#9) then
  1830.                begin
  1831.                FoundFirstChar:=true; { Once we found a source match we want to condense it}
  1832.                HeaderMemberCondensed:=HeaderMemberCondensed+OneChar;
  1833.                end;
  1834.             if FoundFirstChar=true then ActualCodeLine:=ActualCodeLine + OneChar;
  1835.             Inc(d);
  1836.             end;
  1837.          DeclareStringList.Add(ActualCodeLine);
  1838.          Inc(LineCount);
  1839.          end; { Use Pos to see if listbox string is in source string}
  1840.       if (Pos(CondensedString,HeaderMemberCondensed)<>0) then MatchFound:=true;
  1841.       if (Pos(CondensedString,HeaderMemberCondensed)=0) then
  1842.             begin
  1843.             Inc(OccuranceNum);
  1844.             DeclareStringList.Clear;
  1845.             end;
  1846.       end;
  1847.    DeclarationRichEdit.Lines.AddStrings(DeclareStringList);
  1848.    DeclarationRichEdit.SetFocus;
  1849.    SendMessage(DeclarationRichEdit.Handle,EM_SETSEL,0,0);
  1850.    DeclarationEditMode:=true;
  1851. end;
  1852.  
  1853. procedure TSearchEngine.SearchForString(Word:string;Occurance:Integer;StartPosition:Integer;Page:string);
  1854.    var
  1855.    MyTFindText:TFindText;
  1856.    OccuranceCount:Integer;
  1857.    SearchValue:string;
  1858.    begin
  1859.    OccuranceCount:=0;
  1860.    SearchValue:=Word;
  1861.    NewSearchPosition:=0;
  1862.    LineNumberFound:=0;
  1863.    LineFoundPositionOne:=0;
  1864.    PositionFound:=0;
  1865.  
  1866.    with MyTFindText.chrg do  { setup Find Text Struct }
  1867.       begin
  1868.       cpMin:=StartPosition;
  1869.       cpMax:=-1;
  1870.       MyTFindText.lpstrText:=PChar(Word);
  1871.       end;
  1872.           {if none found stop at defined Occurance }
  1873.    while (PositionFound<>-1)and(OccuranceCount<>Occurance) do
  1874.       begin
  1875.       if Page='Include' then PositionFound:=SendMessage(CodePageForm.CodePage.Handle,EM_FINDTEXT,FT_MATCHCASE,LongInt(@MyTFindText));
  1876.       if Page='Source' then PositionFound:=SendMessage(CodePageForm.SourceRichEdit1.Handle,EM_FINDTEXT,FT_MATCHCASE,LongInt(@MyTFindText));
  1877.       if (PositionFound<>-1) and (OccuranceCount<>Occurance) then { move cursor }
  1878.          begin
  1879.          if Page='Include' then
  1880.             begin
  1881.             SendMessage(CodePageForm.CodePage.Handle,EM_SETSEL,PositionFound,PositionFound);
  1882.             LineNumberFound := SendMessage(CodePageForm.CodePage.Handle, EM_LINEFROMCHAR,CodePageForm.CodePage.SelStart,0);
  1883.             LineFoundPositionOne := SendMessage(CodePageForm.CodePage.Handle, EM_LINEINDEX, LineNumberFound, 0);
  1884.             end;
  1885.          if Page='Source' then
  1886.             begin
  1887.             SendMessage(CodePageForm.SourceRichEdit1.Handle,EM_SETSEL,PositionFound,PositionFound);
  1888.             LineNumberFound := SendMessage(CodePageForm.SourceRichEdit1.Handle, EM_LINEFROMCHAR,CodePageForm.SourceRichEdit1.SelStart,0);
  1889.             LineFoundPositionOne := SendMessage(CodePageForm.SourceRichEdit1.Handle, EM_LINEINDEX, LineNumberFound, 0);
  1890.             end;
  1891.          MyTFindText.chrg.cpMin:=PositionFound+1;{ should be +sizeof searchvalue }
  1892.          NewSearchPosition:=PositionFound+1;
  1893.          Inc(OccuranceCount);
  1894.          end;
  1895.       if PositionFound=-1 then LineNumberFound:=999999;
  1896.       end;
  1897.   end;
  1898.  
  1899. procedure TMainDlg.MoveToClass(Sender: TObject);
  1900.    begin
  1901.    if FileOpenActive =true then Exit;
  1902.    ClassFinderSelectedItem:=QuickClassListbox.Items[QuickClassListbox.ItemIndex];
  1903.    ProcessSelectedClass;
  1904.    end;
  1905.  
  1906. procedure TMainDlg.SearchMemberName1Click(Sender: TObject);
  1907.    var
  1908.    SelectOK:Boolean;
  1909.    SearchMember:string;
  1910.    begin
  1911.    {We have to use VCL Table for secondary indexes then refresh RawVCLTable}
  1912.    Screen.Cursor := crHourglass;
  1913.    if PageControl1.PageCount > 0 then
  1914.       with PageControl1 do
  1915.          begin
  1916.          ActivePage := Pages[0];
  1917.          while (ActivePage <> nil) do
  1918.             begin
  1919.             ActivePage.Free;
  1920.             SelectNextPage(TRUE);
  1921.             end;
  1922.          end;
  1923.    MainListBox.Items.Clear();
  1924.    SelectOK:=InputQuery('SEARCH ENGINE','Enter Member Name',SearchMember);
  1925.    if SelectOK then
  1926.       begin
  1927.       VCLTable.IndexName:='MemberNameIndex';
  1928.       VCLTable.SetRange([SearchMember], [SearchMember]);
  1929.       DataSource1.DataSet:=VCLTable;
  1930.       end;
  1931.    Screen.Cursor := crDefault;
  1932.    end;
  1933.  
  1934. procedure TMainDlg.ViewHeader1Click(Sender: TObject);
  1935.    begin
  1936.    CodePageForm.Show;
  1937.    CodePageForm.SourceRichEdit1.Hide;
  1938.    CodePageForm.CodePage.Show;
  1939.    SendMessage(CodePageForm.CodePage.Handle,EM_SETSEL,CodePageForm.CodePage.SelStart,
  1940.                CodePageForm.CodePage.SelStart+Length(CurrentSelectedMemberName));
  1941.    CodePageForm.CodePage.SetFocus;
  1942.    end;
  1943.  
  1944. procedure TMainDlg.ShowRecordClass1Click(Sender: TObject); 
  1945.    begin
  1946.    if FileOpenActive =true then Exit;
  1947.    {For some reason I'm Stuck using VCLTable. Maybe its the indexing}
  1948.    ClassFinderSelectedItem:=VCLTable.FieldByName('ClassName').AsString;
  1949.    ProcessSelectedClass;
  1950.    end;
  1951.  
  1952. procedure TMainDlg.About1Click(Sender: TObject);
  1953. begin
  1954.   AboutBox:=TAboutBox.Create(nil);
  1955.   AboutBox.ShowModal;
  1956.   AboutBox.Free;
  1957. end;
  1958.  
  1959. procedure TMainDlg.SearchClassName1Click(Sender: TObject);
  1960.    var
  1961.    SearchClass:string;
  1962.    SelectOK:Boolean;
  1963.    begin
  1964.    if FileOpenActive =true then Exit;
  1965.       SelectOK:=InputQuery('SEARCH ENGINE','Enter Class Name',SearchClass);
  1966.       if Not SelectOK then Exit;
  1967.       if SelectOK then
  1968.          begin
  1969.          LocateSuccess:=ClassListTab.Locate('ClassName',SearchClass,[loCaseInsensitive]);
  1970.          if LocateSuccess=false then
  1971.             begin
  1972.             MessageDlg('Class Not Found!' ,mtError, [mbOk], 0);
  1973.             Exit;
  1974.             end;
  1975.          ClassFinderSelectedItem:=SearchClass;
  1976.          ProcessSelectedClass;
  1977.          end;
  1978.    end;
  1979.  
  1980. procedure TMainDlg.ViewSource1Click(Sender: TObject);
  1981.    begin
  1982.    CodePageForm.CodePage.Hide;
  1983.    CodePageForm.Show;
  1984.    CodePageForm.SourceRichEdit1.Show;
  1985.    SendMessage(CodePageForm.SourceRichEdit1.Handle,EM_SETSEL,CodePageForm.SourceRichEdit1.SelStart,
  1986.                CodePageForm.SourceRichEdit1.SelStart+DefinitionLength);
  1987.    CodePageForm.SourceRichEdit1.SetFocus;
  1988.    end;
  1989.  
  1990. procedure TMainDlg.LoadDefinitionSource;
  1991.    var
  1992.    n:Integer;
  1993.    k:Integer;
  1994.    SearchForDefinitions:TSearchEngine;
  1995.    FoundFirstBegin:Boolean;
  1996.    ExtractionDone:Boolean;
  1997.    CheckLine:string;
  1998.    CheckLineLength:Integer;
  1999.    EndPosition:Integer;
  2000.    BeginPosition:Integer;
  2001.    TryPosition:Integer;
  2002.    SourceStringList:TStringList;
  2003.    begin
  2004.    SourceStringList:=TStringList.Create;
  2005.    n:=1;
  2006.    k:=1;
  2007.    FoundFirstBegin:=false;
  2008.    ExtractionDone:=false;
  2009.    SearchForDefinitions:=TSearchEngine.Create;
  2010.    DefinitionLength:=Length(CurrentTabClassName+'.'+CurrentSelectedMemberName);
  2011.    SearchForDefinitions.SearchForString(CurrentTabClassName+'.'+CurrentSelectedMemberName,1,0,'Source');
  2012.    if SearchForDefinitions.PositionFound=-1 then
  2013.       begin
  2014.       SourceEntryPage.Lines.Clear;
  2015.       SourceStringList.Clear;
  2016.       SourceEntryPage.Lines[0]:='No function or procedure exist!';
  2017.       end;
  2018.    if SearchForDefinitions.PositionFound<>-1 then
  2019.       begin
  2020.       SourceEntryPage.Lines.Clear;
  2021.       SourceStringList.Add(CodePageForm.SourceRichEdit1.Lines[SearchForDefinitions.LineNumberFound]);
  2022.       while ExtractionDone=false do
  2023.          begin
  2024.          CheckLine:=CodePageForm.SourceRichEdit1.Lines[SearchForDefinitions.LineNumberFound+n];
  2025.          CheckLineLength:=Length(CheckLine);
  2026.          BeginPosition:=Pos('begin',CheckLine);{'begin' by itself no indent}
  2027.          if (BeginPosition=1) and (BeginPosition=CheckLineLength-4) then
  2028.             begin
  2029.             if FoundFirstBegin<>true then
  2030.                begin
  2031.                k:=0;
  2032.                end;
  2033.             FoundFirstBegin:=true;
  2034.             k:=k+1;
  2035.             end;
  2036.          BeginPosition:=Pos(' begin',CheckLine);{'begin' by itself no indent}
  2037.          if (BeginPosition<>0) and (BeginPosition=CheckLineLength-5) then
  2038.             begin
  2039.             if FoundFirstBegin<>true then
  2040.                begin
  2041.                k:=0;
  2042.                end;
  2043.             FoundFirstBegin:=true;
  2044.             k:=k+1;
  2045.             end;
  2046.  
  2047.          TryPosition:=Pos('try',CheckLine);{'begin' by itself no indent}
  2048.          if (TryPosition=1) and ((TryPosition=CheckLineLength-4) or(TryPosition=CheckLineLength-3)) then
  2049.             begin
  2050.             k:=k+1;
  2051.             end;
  2052.          TryPosition:=Pos(' try',CheckLine);{'begin' by itself no indent}
  2053.          if (TryPosition<>0) and ((TryPosition=CheckLineLength-4) or(TryPosition=CheckLineLength-3)) then
  2054.             begin
  2055.             k:=k+1;
  2056.             end;
  2057.  
  2058.          EndPosition:=Pos('end else',CheckLine);{'end' by itself no indent}
  2059.          if (EndPosition=1) and ((EndPosition=CheckLineLength-9)or(EndPosition=CheckLineLength-8)) then
  2060.             begin
  2061.             k:=k-1;
  2062.             end else
  2063.                 EndPosition:=Pos('end',CheckLine);{'end' by itself no indent}
  2064.                 if (EndPosition=1) and ((EndPosition=CheckLineLength-4)or(EndPosition=CheckLineLength-3)) then
  2065.                    begin
  2066.                    k:=k-1;
  2067.                    end;
  2068.  
  2069.          EndPosition:=Pos(' end else',CheckLine);{' end' by itself yes indent}
  2070.          if (EndPosition<>0) and ((EndPosition=CheckLineLength-9)or(EndPosition=CheckLineLength-8)) then
  2071.             begin
  2072.             k:=k-1;
  2073.             end else
  2074.                 EndPosition:=Pos(' end',CheckLine);{' end' by itself yes indent}
  2075.                 if (EndPosition<>0) and ((EndPosition=CheckLineLength-4)or(EndPosition=CheckLineLength-3)) then
  2076.                    begin
  2077.                    k:=k-1;
  2078.                    end;
  2079.  
  2080.                    
  2081.          if ExtractionDone<>true then SourceStringList.Add(CheckLine);
  2082.          if k=0 then ExtractionDone:=true;
  2083.          Inc(n);
  2084.          end;
  2085.       SourceEntryPage.Lines.AddStrings(SourceStringList);
  2086.       end;
  2087.    end;
  2088.  
  2089. procedure TMainDlg.FormResize(Sender: TObject);
  2090.    begin
  2091.    DeclarationRichEdit.Height:=Trunc(ClientHeight * 0.18);
  2092.    Panel4.Width:=ClientWidth div 2;
  2093.  
  2094.    PageControl1.Height:=Trunc(ClientHeight * 0.6);
  2095.    QuickClassListbox.Height:=Trunc(ClientHeight* 0.4)-30;
  2096.  
  2097.    SourceEntryPage.Height:=(PageControl1.Height-15)-(DeclarationRichEdit.Height);
  2098.    MainListBox.Height:=PageControl1.Height -40;
  2099.    MainListBox.Width:=PageControl1.Width -5;
  2100.    Label1.Left:=Trunc(Panel2.Width * 0.174);
  2101.    Label2.Left:=Trunc(Panel2.Width * 0.329);
  2102.    Label3.Left:=Trunc(Panel2.Width * 0.532);
  2103.    Label4.Left:=Trunc(Panel2.Width * 0.687);
  2104.  
  2105.    end;
  2106.  
  2107. procedure TMainDlg.Print1Click(Sender: TObject);
  2108.    begin
  2109.    PrintDialog1.Execute;
  2110.    DeclarationRichEdit.Print(CurrentSelectedMemberName+' Declaration');
  2111.    end;
  2112.  
  2113. procedure TMainDlg.PrintDefinition1Click(Sender: TObject);
  2114.    begin
  2115.    PrintDialog1.Execute;
  2116.    SourceEntryPage.Print(CurrentSelectedMemberName+' Definition');
  2117.    end;
  2118.  
  2119. procedure TMainDlg.HeaderSource1Click(Sender: TObject);
  2120.    begin
  2121.    FileOPenDlg.InitialDir:=LocalVclHeaders;
  2122.    FileOPenDlg.Options := [ofHideReadOnly];
  2123.    FileOPenDlg.Filter := '*.cpp,*.hpp,*.h|*.cpp;*.hpp;*.h';
  2124.    if FileOPenDlg.Execute then
  2125.    try
  2126.       CodePageForm.CodePage.Lines.LoadFromFile(FileOPenDlg.FileName);
  2127.       except on EFOpenError do
  2128.          begin
  2129.          MessageDlg('Header File Not Found!' ,mtError, [mbOk], 0);
  2130.          Exit;
  2131.          end;
  2132.        end;
  2133.    end;
  2134.  
  2135. procedure TMainDlg.ParseaNewHeader1Click(Sender: TObject);
  2136.    var
  2137.    PasFileSearch:TSearchEngine;
  2138.    OneCharacter:string;
  2139.    GotPasName:Boolean;
  2140.    CharCount:Integer;
  2141.    Line:string;
  2142.    begin
  2143.    {Initialize stuff}
  2144.    FileOpenActive:=true;
  2145.    DestTable.Open;
  2146.    PasFileSearch:=TSearchEngine.Create;
  2147.    CharCount:=0;
  2148.    GotPasName:=false;
  2149.    PasSourceFileName:='';
  2150.    OneCharacter:='';
  2151.  
  2152.    {Get File Name}
  2153.    FileOPenDlg.InitialDir:=LocalVclHeaders;
  2154.    FileOPenDlg.Options := [ofHideReadOnly];
  2155.    FileOPenDlg.Filter := '*.hpp,*.h|*.hpp;*.h';
  2156.    if FileOPenDlg.Execute then
  2157.       begin
  2158.       Screen.Cursor:=crHourglass;
  2159.       CurrentHeaderFileName:=ExtractFileName(FileOPenDlg.FileName);
  2160.       CodePageForm.CodePage.Clear();
  2161.       try
  2162.          CodePageForm.CodePage.Lines.LoadFromFile(FileOPenDlg.FileName);
  2163.          except on EFOpenError do
  2164.             begin
  2165.             MessageDlg('Header File Not Found!' ,mtError, [mbOk], 0);
  2166.             Screen.Cursor:=crDefault;
  2167.             Exit;
  2168.             end;
  2169.       end;
  2170.  
  2171.       {Search header for .pas filename}
  2172.       CodePageForm.SourceRichEdit1.Clear();
  2173.       PasFileSearch.SearchForString('.pas',1,0,'Include');
  2174.       if PasFileSearch.PositionFound<>-1 then
  2175.          begin
  2176.          Line:=CodePageForm.CodePage.Lines[PasFileSearch.LineNumberFound];
  2177.          while not GotPasName do
  2178.             begin
  2179.             OneCharacter:=Copy(Line,(PasFileSearch.PositionFound-PasFileSearch.LineFoundPositionOne)-CharCount,1);
  2180.             if (OneCharacter=' ') or (OneCharacter='/')then GotPasName:=true;
  2181.             if GotPasName=false then
  2182.                begin
  2183.                AppendStr(OneCharacter,PasSourceFileName);
  2184.                PasSourceFileName:=OneCharacter;
  2185.                Inc(CharCount);
  2186.                end;
  2187.             end;
  2188.          AppendStr(PasSourceFileName,'.pas');
  2189.          end else
  2190.             begin
  2191.             MessageDlg('Could not find .pas for '+CurrentHeaderFileName ,mtError, [mbOk], 0);
  2192.             end;
  2193.  
  2194.       {Empty table to hold 1 header parsing and load it up}
  2195.       DestTable.Close();
  2196.       DestTable.TableName:='main2.db';
  2197.       DestTable.Open();
  2198.       DestTable.Close();
  2199.       DestTable.EmptyTable;
  2200.       DestTable.Open();
  2201.       
  2202.       {Parse and load}
  2203.       ConvertCppToDestTable;
  2204.       ConvertTableToTabs;
  2205.       RawVCLTable.Free;
  2206.       RawVCLTable := TCloneTable.CreateFromTable(DestTable, True);
  2207.       RawVCLTable.Open;
  2208.       DataSource1.Dataset:=RawVCLTable;
  2209.       DBGrid1.Refresh;
  2210.       RawVCLTable.First;
  2211.       SelectaTab(Sender);
  2212.  
  2213.       {Clean up}
  2214.       Screen.Cursor:=crDefault;
  2215.       MessageDlg('Success',mtConfirmation, [mbOk], 0);
  2216.       end;
  2217.  
  2218.    {Append Main2.db to VCL table}
  2219.    if MessageDlg('Append to VCLTable',mtConfirmation, [mbYes, mbNo], 0)=mrYes then
  2220.       begin
  2221.       MessageDlg('Your about to do a batchmove!!!',mtConfirmation, [mbOk], 0);
  2222.       ParseVclTable.Open;
  2223.       BatchMove1.Execute;
  2224.       ParseVclTable.Close;
  2225.       end else Exit;
  2226.    end;
  2227.  
  2228. procedure TMainDlg.ClosePageClick(Sender: TObject);
  2229.    begin
  2230.    if PageControl1.PageCount > 1 then
  2231.       begin
  2232.       PageControl1.ActivePage.Free;
  2233.       MainListBox.Items.Clear;
  2234.       PageControl1.ActivePage := PageControl1.Pages[0];
  2235.       SelectATab(Sender);
  2236.       end;
  2237.    end;
  2238.  
  2239. procedure TMainDlg.CloseAllPages1Click(Sender: TObject);
  2240.    begin
  2241.    if PageControl1.PageCount > 0 then
  2242.       with PageControl1 do
  2243.       begin
  2244.       ActivePage := Pages[0];
  2245.       while (ActivePage <> nil) do
  2246.          begin
  2247.          ActivePage.Free;
  2248.          SelectNextPage(TRUE);
  2249.          end;
  2250.       end;
  2251.    MainListBox.Items.Clear;
  2252.    end;
  2253.  
  2254. procedure TMainDlg.GetRegistryInfo;
  2255.    var
  2256.    MyString:string;
  2257.    Status:Boolean;
  2258.    begin
  2259.    with TRegistry.Create do
  2260.       begin
  2261.       RootKey := HKEY_LOCAL_MACHINE;
  2262.       Status:=OpenKey('\software\borland\C++Builder\1.0', false);
  2263.       if Status then MyString := ReadString('RootDir');
  2264.       LocalVclSource:=MyString+'\source\';
  2265.       LocalVclHeaders:=MyString+'\include\vcl\';
  2266.  
  2267.       RootKey := HKEY_LOCAL_MACHINE;
  2268.       Status:=OpenKey('\software\Microsoft\Windows\CurrentVersion\App Paths\Classbrw.exe', false);
  2269.       if Status then MyString := ReadString('Path');
  2270.       LocalTablesDir:=ExtractFileDir(MyString);
  2271.       
  2272.       Free;
  2273.       end;
  2274.    end;
  2275.  
  2276. procedure TMainDlg.LoadSourcePage;
  2277.    begin
  2278.    CodePageForm.SourceRichEdit1.Clear();
  2279.       try
  2280.          CodePageForm.SourceRichEdit1.Lines.LoadFromFile(LocalVclSource+'vcl\' + CurrentSourceFileName);
  2281.          except on EFOpenError do
  2282.          begin
  2283.          try
  2284.             CodePageForm.SourceRichEdit1.Lines.LoadFromFile(LocalVclSource+'toolsapi\' + CurrentSourceFileName);
  2285.             except on EFOpenError do
  2286.             begin
  2287.             try
  2288.                CodePageForm.SourceRichEdit1.Lines.LoadFromFile(LocalVclSource+'samples\' + CurrentSourceFileName);
  2289.                except on EFOpenError do
  2290.                begin
  2291.                CodePageForm.SourceRichEdit1.Lines[0]:='Source Not Available for this Class!';
  2292.                end;
  2293.             end;
  2294.             end;
  2295.          end;
  2296.          end;
  2297.       end;
  2298.    end;
  2299.  
  2300. procedure TMainDlg.FormActivate(Sender: TObject);
  2301.    begin
  2302.    if VCLTable.RecordCount=0 then RebuildVCLTable(Sender);
  2303.    end;
  2304.  
  2305. procedure TMainDlg.ChangeFontsClick(Sender: TObject);
  2306.    var
  2307.    MyFontInteger:Integer;
  2308.    begin
  2309.    if FontDialog1.Execute then
  2310.       begin
  2311.       if Sender=ChangeFonts then CodePageForm.SourceRichEdit1.Font:=FontDialog1.Font;
  2312.       if Sender=HeaderPage then CodePageForm.CodePage.Font:=FontDialog1.Font;
  2313.       if Sender=Declaration then DeclarationRichEdit.Font:=FontDialog1.Font;
  2314.       if Sender=Definition then SourceEntryPage.Font:=FontDialog1.Font;
  2315.       if Sender=QuickClassBox then QuickClassListbox.Font:=FontDialog1.Font;
  2316.       if Sender=MemberList then MainListBox.Font:=FontDialog1.Font;
  2317.       if Sender=Grid then
  2318.          begin
  2319.          DBGrid1.Columns[1].Font:=FontDialog1.Font;
  2320.          DBGrid1.Columns[2].Font:=FontDialog1.Font;
  2321.          DBGrid1.Columns[3].Font:=FontDialog1.Font;
  2322.          DBGrid1.Columns[4].Font:=FontDialog1.Font;
  2323.          end;
  2324.  
  2325.       MyFontInteger:=FontDialog1.Font.Color;
  2326.  
  2327.       with TRegistry.Create do
  2328.          begin
  2329.          RootKey := HKEY_LOCAL_MACHINE;
  2330.          OpenKey('\software\borland\VCL Class Organizer\fonts', false);
  2331.          if Sender=ChangeFonts then WriteString('DefinitionPage',IntToStr(MyFontInteger));
  2332.          if Sender=HeaderPage then WriteString('HeaderPage',IntToStr(MyFontInteger));
  2333.          if Sender=Declaration then WriteString('Declaration',IntToStr(MyFontInteger));
  2334.          if Sender=Definition then WriteString('Definition',IntToStr(MyFontInteger));
  2335.          if Sender=QuickClassBox then WriteString('QuickClass',IntToStr(MyFontInteger));
  2336.          if Sender=MemberList then WriteString('MemberList',IntToStr(MyFontInteger));
  2337.          if Sender=Grid then WriteString('Grid',IntToStr(MyFontInteger));
  2338.          Free;
  2339.          end;
  2340.       end;
  2341.    end;
  2342.  
  2343. procedure TMainDlg.ChangeBkGroundClick(Sender: TObject);
  2344.    begin
  2345.    if ColorDialog1.Execute then
  2346.       begin
  2347.       if Sender=ChangeBkGround then CodePageForm.SourceRichEdit1.Color:=ColorDialog1.Color;
  2348.       if Sender=HeaderPage1 then CodePageForm.CodePage.Color:=ColorDialog1.Color;
  2349.       if Sender=Declaration1 then DeclarationRichEdit.Color:=ColorDialog1.Color;
  2350.       if Sender=Definition1 then SourceEntryPage.Color:=ColorDialog1.Color;
  2351.       if Sender=QuickClassBox1 then QuickClassListbox.Color:=ColorDialog1.Color;
  2352.       if Sender=MemberList1 then MainListBox.Color:=ColorDialog1.Color;
  2353.       if Sender=Grid1 then DBGrid1.Color:=ColorDialog1.Color;
  2354.  
  2355.       {Store in background colors registry}
  2356.       with TRegistry.Create do
  2357.          begin
  2358.          RootKey := HKEY_LOCAL_MACHINE;
  2359.          OpenKey('\software\borland\VCL Class Organizer\colors', false);
  2360.          if Sender=ChangeBkGround then WriteString('DefinitionPage',IntToStr(ColorDialog1.Color));
  2361.          if Sender=HeaderPage1 then WriteString('HeaderPage',IntToStr(ColorDialog1.Color));
  2362.          if Sender=Declaration1 then WriteString('Declaration',IntToStr(ColorDialog1.Color));
  2363.          if Sender=Definition1 then WriteString('Definition',IntToStr(ColorDialog1.Color));
  2364.          if Sender=QuickClassBox1 then WriteString('QuickClass',IntToStr(ColorDialog1.Color));
  2365.          if Sender=MemberList1 then WriteString('MemberList',IntToStr(ColorDialog1.Color));
  2366.          if Sender=Grid1 then WriteString('Grid',IntToStr(ColorDialog1.Color));
  2367.          Free;
  2368.          end;
  2369.  
  2370.       
  2371.       end;
  2372.    end;
  2373.  
  2374. function TMainDlg.DetermineImageIndex(Scope:string;Member:string):Integer;
  2375.    begin
  2376.    if (Scope='protected') and (Member='function') then Result:=0;
  2377.    if (Scope='protected') and (Member='data') then Result:=1;
  2378.    if (Scope='protected') and (Member='constructor') then Result:=2;
  2379.    if (Scope='protected') and (Member='property') then Result:=3;
  2380.  
  2381.    if (Scope='__published') and (Member='function') then Result:=4;
  2382.    if (Scope='__published') and (Member='data') then Result:=5;
  2383.    if (Scope='__published') and (Member='constructor') then Result:=6;
  2384.    if (Scope='__published') and (Member='property') then Result:=7;
  2385.  
  2386.    if (Scope='private') and (Member='function') then Result:=8;
  2387.    if (Scope='private') and (Member='data') then Result:=9;
  2388.    if (Scope='private') and (Member='constructor') then Result:=10;
  2389.    if (Scope='private') and (Member='property') then Result:=11;
  2390.  
  2391.    if (Scope='public') and (Member='function') then Result:=12;
  2392.    if (Scope='public') and (Member='data') then Result:=13;
  2393.    if (Scope='public') and (Member='constructor') then Result:=14;
  2394.    if (Scope='public') and (Member='property') then Result:=15;
  2395.    end;
  2396.  
  2397. procedure TMainDlg.ShowNextDerivation1Click(Sender: TObject);
  2398.    begin
  2399.    if FileOpenActive =true then Exit;
  2400.    ClassFinderSelectedItem:=RawVCLTable.FieldByName('SecondClass').AsString;
  2401.    if (ClassFinderSelectedItem<> '') and (ClassFinderSelectedItem <> 'TObject')then
  2402.       begin
  2403.       DBGrid1.DataSource:=DataSource1;
  2404.       RawVClTable.Refresh;
  2405.       Screen.Cursor:=crHourGlass;
  2406.       RawVCLTable.DisableControls;
  2407.       RawVCLTable.Filtered:=false;
  2408.       RawVCLTable.SetRange([ClassFinderSelectedItem], [ClassFinderSelectedItem]);
  2409.       CurrentHeaderFileName:=RawVCLTable.FieldByName('Header').AsString;
  2410.       CurrentSourceFileName:=RawVCLTable.FieldByName('Misc').AsString;
  2411.       with TTabSheet.Create(Self) do
  2412.         begin
  2413.         Caption := ClassFinderSelectedItem;
  2414.         PageControl := PageControl1;
  2415.         end;
  2416.       PageControl1.ActivePage:=PageControl1.Pages[PageControl1.PageCount-1];
  2417.       TableToListStrings(ClassFinderSelectedItem);
  2418.       CodePageForm.CodePage.Clear();
  2419.       try
  2420.          CodePageForm.CodePage.Lines.LoadFromFile(LocalVclHeaders+ CurrentHeaderFileName);
  2421.             except on EFOpenError do
  2422.                begin
  2423.                MessageDlg('Header File Not Found!' ,mtError, [mbOk], 0);
  2424.                Screen.Cursor:=crDefault;
  2425.                Exit;
  2426.                end;
  2427.          end;
  2428.       LoadSourcePage;
  2429.       RawVCLTable.First;
  2430.       RawVCLTable.EnableControls;
  2431.       Screen.Cursor:=crDefault;
  2432.       end else
  2433.           MessageDlg('No class derivation exist or TObject class not available!' ,mtError, [mbOk], 0);
  2434.    end;
  2435.  
  2436. procedure TMainDlg.PrintHeaderhpp1Click(Sender: TObject);
  2437.    begin
  2438.    PrintDialog1.Execute;
  2439.    CodePageForm.CodePage.Print(CurrentHeaderFileName);
  2440.    end;
  2441.  
  2442. procedure TMainDlg.PrintSourcepas1Click(Sender: TObject);
  2443.    begin
  2444.    PrintDialog1.Execute;
  2445.    CodePageForm.SourceRichEdit1.Print(CurrentSourceFileName);
  2446.    end;
  2447.  
  2448. procedure TMainDlg.Project1Click(Sender: TObject);
  2449.    begin
  2450.    ParseHeaders:=TParseHeaders.Create(nil);
  2451.    with ParseHeaders do
  2452.       begin
  2453.       Position:=poScreenCenter;
  2454.       HeadersToParseTab.Open;
  2455.       ShowModal;
  2456.       end;
  2457.    end;
  2458.  
  2459. procedure TMainDlg.FormClose(Sender: TObject; var Action: TCloseAction);
  2460.    begin
  2461.    CodePageForm.Free;
  2462.    Action :=caFree;
  2463.    MainDlg := nil;
  2464.    end;
  2465.  
  2466. procedure TMainDlg.ProcessSelectedClass;
  2467.    begin
  2468.    VCLTable.IndexName:='';
  2469.       DataSource1.Dataset:=RawVCLTable;
  2470.       Screen.Cursor:=crHourGlass;
  2471.       RawVCLTable.DisableControls();
  2472.       RawVCLTable.Filtered:=false;
  2473.       RawVCLTable.SetRange([ClassFinderSelectedItem], [ClassFinderSelectedItem]);
  2474.       RawVCLTable.First;
  2475.       CurrentHeaderFileName:=RawVCLTable.FieldByName('Header').AsString;
  2476.       CurrentSourceFileName:=RawVCLTable.FieldByName('Misc').AsString;
  2477.       with TTabSheet.Create(Self) do
  2478.         begin
  2479.         Caption := ClassFinderSelectedItem;
  2480.         PageControl := PageControl1;
  2481.         end;
  2482.       PageControl1.ActivePage:=PageControl1.Pages[PageControl1.PageCount-1];
  2483.       TableToListStrings(ClassFinderSelectedItem);
  2484.       RawVCLTable.First;
  2485.       CodePageForm.SourceRichEdit1.Clear();
  2486.       LoadSourcePage;
  2487.       try
  2488.          CodePageForm.CodePage.Lines.LoadFromFile(LocalVclHeaders + CurrentHeaderFileName);
  2489.             except on EFOpenError do
  2490.                begin
  2491.                MessageDlg('Header File Not Found!' ,mtError, [mbOk], 0);
  2492.                Screen.Cursor:=crDefault;
  2493.                Exit;
  2494.                end;
  2495.          end;
  2496.       RawVCLTable.EnableControls();
  2497.       Screen.Cursor:=crDefault;
  2498.    end;
  2499. end.
  2500.  
  2501.  
  2502.  
  2503.