Kaynağa Gözat

querywindow: change manual memory management to automatic

Reinier Olislagers 11 yıl önce
ebeveyn
işleme
46bb5e06a0
1 değiştirilmiş dosya ile 13 ekleme ve 68 silme
  1. 13 68
      querywindow.pas

+ 13 - 68
querywindow.pas

@@ -222,12 +222,7 @@ type
       var meResult: TMemo; AdditionalTitle: string = ''): TTabSheet;
       var meResult: TMemo; AdditionalTitle: string = ''): TTabSheet;
     // Runs SQL script; returns result
     // Runs SQL script; returns result
     function ExecuteScript(Script: string): Boolean;
     function ExecuteScript(Script: string): Boolean;
-    // Adds control/object to list of programmatically created items.
-    // Their memory will be freed in code when no longer used
-    procedure AddResultControl(ParentControl: TObject; AControl: TObject);
     procedure NewApplyButton(var Pan: TPanel; var ATab: TTabSheet);
     procedure NewApplyButton(var Pan: TPanel; var ATab: TTabSheet);
-    // Free up memory for controls
-    procedure RemoveControls;
     function FindSqlQuery: TSqlQuery;
     function FindSqlQuery: TSqlQuery;
     // Returns whether query is DDL or DML
     // Returns whether query is DDL or DML
     function GetSQLType(Query: string; var Command: string): string;
     function GetSQLType(Query: string; var Command: string): string;
@@ -261,14 +256,13 @@ procedure TfmQueryWindow.NewCommitButton(const Pan: TPanel; var ATab: TTabSheet)
 var
 var
   Commit: TBitBtn;
   Commit: TBitBtn;
 begin
 begin
-  Commit:= TBitBtn.Create(nil);
+  Commit:= TBitBtn.Create(self);
   Commit.Parent:= Pan;
   Commit.Parent:= Pan;
   Commit.Caption:= 'Commit';
   Commit.Caption:= 'Commit';
   Commit.Left:= 400;
   Commit.Left:= 400;
   Commit.Visible:= False;
   Commit.Visible:= False;
   Commit.OnClick:= @CommitResultClick;
   Commit.OnClick:= @CommitResultClick;
   Commit.Tag:= ATab.TabIndex;
   Commit.Tag:= ATab.TabIndex;
-  AddResultControl(ATab, Commit);
 end;
 end;
 
 
 
 
@@ -788,7 +782,6 @@ var
   ATab: TTabSheet;
   ATab: TTabSheet;
   QT: TQueryThread;
   QT: TQueryThread;
 begin
 begin
-  RemoveControls;
   ATab:= CreateResultTab(qtExecute, SqlQuery, SqlScript, meResult);
   ATab:= CreateResultTab(qtExecute, SqlQuery, SqlScript, meResult);
   QT:= TQueryThread.Create(qaCommit);
   QT:= TQueryThread.Create(qaCommit);
   try
   try
@@ -913,7 +906,6 @@ var
   ATab: TTabSheet;
   ATab: TTabSheet;
   QT: TQueryThread;
   QT: TQueryThread;
 begin
 begin
-  RemoveControls;
   ATab:= CreateResultTab(qtExecute, SqlQuery, SqlScript, meResult);
   ATab:= CreateResultTab(qtExecute, SqlQuery, SqlScript, meResult);
   QT:= TQueryThread.Create(qaRollBack);
   QT:= TQueryThread.Create(qaRollBack);
   try
   try
@@ -1103,42 +1095,37 @@ var
   Nav: TDBNavigator;
   Nav: TDBNavigator;
   Pan: TPanel;
   Pan: TPanel;
 begin
 begin
-  ATab:= TTabSheet.Create(nil);
+  ATab:= TTabSheet.Create(self);
+  BeginUpdateBounds;
   Result:= ATab;
   Result:= ATab;
   ATab.Parent:= PageControl1;
   ATab.Parent:= PageControl1;
   ATab.Caption:= 'Result # ' + GetNewTabNum + ' ' + AdditionalTitle;
   ATab.Caption:= 'Result # ' + GetNewTabNum + ' ' + AdditionalTitle;
   if QueryType = qtSelectable then // Select, need record set result
   if QueryType = qtSelectable then // Select, need record set result
   begin
   begin
     // Query
     // Query
-    aSqlQuery:= TSQLQuery.Create(nil);
+    aSqlQuery:= TSQLQuery.Create(self);
     aSqlQuery.DataBase:= ibConnection;
     aSqlQuery.DataBase:= ibConnection;
     aSqlQuery.Transaction:= fSqlTrans;
     aSqlQuery.Transaction:= fSqlTrans;
     aSqlQuery.AfterScroll:= @QueryAfterScroll;
     aSqlQuery.AfterScroll:= @QueryAfterScroll;
-    // Here and in other cases, the object is added to the list of
-    // programmatically maintained objects and freed programmatically
-    AddResultControl(ATab, aSqlQuery);
     aSqlQuery.AfterPost:= @FinishCellEditing;
     aSqlQuery.AfterPost:= @FinishCellEditing;
     aSqlQuery.Tag:= ATab.TabIndex;
     aSqlQuery.Tag:= ATab.TabIndex;
 
 
     // Status Bar
     // Status Bar
-    StatusBar:= TStatusBar.Create(nil);
+    StatusBar:= TStatusBar.Create(self);
     StatusBar.Parent:= ATab;
     StatusBar.Parent:= ATab;
-    AddResultControl(ATab, StatusBar);
 
 
     // Datasource
     // Datasource
-    DataSource:= TDataSource.Create(nil);
+    DataSource:= TDataSource.Create(self);
     DataSource.DataSet:= aSqlQuery;
     DataSource.DataSet:= aSqlQuery;
-    AddResultControl(ATab, DataSource);
 
 
     // Panel
     // Panel
-    pan:= TPanel.Create(nil);
+    pan:= TPanel.Create(self);
     pan.Parent:= ATab;
     pan.Parent:= ATab;
     Pan.Height:= 30;
     Pan.Height:= 30;
     Pan.Align:= alTop;
     Pan.Align:= alTop;
-    AddResultControl(ATab, Pan);
 
 
     // Query result Grid
     // Query result Grid
-    DBGrid:= TDBGrid.Create(nil);
+    DBGrid:= TDBGrid.Create(self);
     DBGrid.Parent:= ATab;
     DBGrid.Parent:= ATab;
     DBGrid.DataSource:= DataSource;
     DBGrid.DataSource:= DataSource;
     DBGrid.Align:= alClient;
     DBGrid.Align:= alClient;
@@ -1153,14 +1140,12 @@ begin
     DBGrid.Options:= DBGrid.Options + [dgAutoSizeColumns, dgHeaderHotTracking, dgHeaderPushedLook, dgAnyButtonCanSelect];
     DBGrid.Options:= DBGrid.Options + [dgAutoSizeColumns, dgHeaderHotTracking, dgHeaderPushedLook, dgAnyButtonCanSelect];
 
 
     DBGrid.OnTitleClick:= @DBGridTitleClick;
     DBGrid.OnTitleClick:= @DBGridTitleClick;
-    AddResultControl(ATab, DBGrid);
 
 
     // Navigator
     // Navigator
-    Nav:= TDBNavigator.Create(nil);
+    Nav:= TDBNavigator.Create(self);
     Nav.Parent:= Pan;
     Nav.Parent:= Pan;
     Nav.VisibleButtons:= [nbFirst, nbNext, nbPrior, nbLast];
     Nav.VisibleButtons:= [nbFirst, nbNext, nbPrior, nbLast];
     Nav.DataSource:= DataSource;
     Nav.DataSource:= DataSource;
-    AddResultControl(ATab, Nav);
 
 
     // Apply button
     // Apply button
     NewApplyButton(Pan, ATab);
     NewApplyButton(Pan, ATab);
@@ -1171,32 +1156,28 @@ begin
   else
   else
   if QueryType in [qtExecute, qtScript] then
   if QueryType in [qtExecute, qtScript] then
   begin
   begin
-    meResult:= TMemo.Create(nil);
+    meResult:= TMemo.Create(self);
     meResult.Parent:= ATab;
     meResult.Parent:= ATab;
     meResult.ReadOnly:= True;
     meResult.ReadOnly:= True;
     meResult.Align:= alClient;
     meResult.Align:= alClient;
-    AddResultControl(ATab, meResult);
     case QueryType of
     case QueryType of
       qtExecute:
       qtExecute:
       begin
       begin
-        aSqlQuery:= TSQLQuery.Create(nil);
+        aSqlQuery:= TSQLQuery.Create(self);
         aSqlQuery.DataBase:= ibConnection;
         aSqlQuery.DataBase:= ibConnection;
         aSqlQuery.Transaction:= fSqlTrans;
         aSqlQuery.Transaction:= fSqlTrans;
-        AddResultControl(ATab, aSqlQuery);
       end;
       end;
       qtScript: // Script
       qtScript: // Script
       begin
       begin
-        aSQLScript:= TModSQLScript.Create(nil);
+        aSQLScript:= TModSQLScript.Create(self);
         aSQLScript.DataBase:= ibConnection;
         aSQLScript.DataBase:= ibConnection;
         aSQLScript.Transaction:= fSqlTrans;
         aSQLScript.Transaction:= fSqlTrans;
         aSQLScript.CommentsInSQL:= true; //pass on comments. They cannot hurt
         aSQLScript.CommentsInSQL:= true; //pass on comments. They cannot hurt
         // and may be useful when tracing errors at the database end.
         // and may be useful when tracing errors at the database end.
         aSQLScript.UseSetTerm:= true; //needed if set term is used, e.g. for SPs
         aSQLScript.UseSetTerm:= true; //needed if set term is used, e.g. for SPs
-        AddResultControl(ATab, aSQLScript);
       end;
       end;
     end;
     end;
   end;
   end;
-  AddResultControl(nil, ATab);
 end;
 end;
 
 
 (***************  Execute Query   ******************)
 (***************  Execute Query   ******************)
@@ -1501,15 +1482,6 @@ begin
   end;
   end;
 end;
 end;
 
 
-{ AddResultControl: add object to array of program-managed memory }
-
-procedure TfmQueryWindow.AddResultControl(ParentControl: TObject; AControl: TObject);
-begin
-  SetLength(fResultControls, Length(fResultControls) + 1);
-  SetLength(fParentResultControls, Length(fParentResultControls) + 1);
-  fResultControls[High(fParentResultControls)]:= AControl;
-  fParentResultControls[High(fParentResultControls)]:= ParentControl;
-end;
 
 
 
 
 { Display new Save/Apply button for current query result been edited }
 { Display new Save/Apply button for current query result been edited }
@@ -1518,37 +1490,13 @@ procedure TfmQueryWindow.NewApplyButton(var Pan: TPanel; var ATab: TTabSheet);
 var
 var
   Apply: TBitBtn;
   Apply: TBitBtn;
 begin
 begin
-  Apply:= TBitBtn.Create(nil);
+  Apply:= TBitBtn.Create(self);
   Apply.Parent:= Pan;
   Apply.Parent:= Pan;
   Apply.Caption:= 'Apply';
   Apply.Caption:= 'Apply';
   Apply.Left:= 300;
   Apply.Left:= 300;
   Apply.Visible:= False;
   Apply.Visible:= False;
   Apply.OnClick:= @ApplyClick;
   Apply.OnClick:= @ApplyClick;
   Apply.Tag:= ATab.TabIndex;
   Apply.Tag:= ATab.TabIndex;
-  AddResultControl(ATab, Apply);
-end;
-
-{ Remove all run-time controls from current Query window }
-
-procedure TfmQueryWindow.RemoveControls;
-var
-  i: Integer;
-begin
-  for i:= High(fResultControls) downto Low(fResultControls) do
-  begin
-    if Assigned(fResultControls[i]) then
-    begin
-      if fResultControls[i] is TSQLQuery then
-      begin
-        (fResultControls[i] as TSQLQuery).AfterScroll:= nil;
-        (fResultControls[i] as TSQLQuery).Close;
-        (fResultControls[i] as TSQLQuery).DataSource:= nil;
-      end;
-      FreeAndNil(fResultControls[i]);
-    end;
-  end;
-  SetLength(fResultControls, 0);
-  SetLength(fParentResultControls, 0);
 end;
 end;
 
 
 
 
@@ -1733,8 +1681,6 @@ end;
 procedure TfmQueryWindow.FormClose(Sender: TObject;
 procedure TfmQueryWindow.FormClose(Sender: TObject;
   var CloseAction: TCloseAction);
   var CloseAction: TCloseAction);
 begin
 begin
-  RemoveControls;
-
   // Check if the transaction is active; then commit it
   // Check if the transaction is active; then commit it
   if fSqlTrans.Active then
   if fSqlTrans.Active then
   begin
   begin
@@ -2155,7 +2101,6 @@ begin
   tbRollbackRetaining.Enabled:= False;
   tbRollbackRetaining.Enabled:= False;
 
 
   fModifyCount:= 0;
   fModifyCount:= 0;
-  RemoveControls;
 
 
   // Get initial query type; this can be changed later in the next parts
   // Get initial query type; this can be changed later in the next parts
   if aQueryType = qtUnknown then // Auto
   if aQueryType = qtUnknown then // Auto