|
@@ -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
|