Display progress in GridToXYZ by putting a progessbar in a new panel of the status bar. Should be used for other time consuming loops as well. Related to bug #793: app freezes when 'copy as csv/xml/html' is selected

This commit is contained in:
Ansgar Becker
2009-01-18 23:07:46 +00:00
parent 1f6e894ba5
commit 7946e8fce9
3 changed files with 38 additions and 3 deletions

View File

@ -774,6 +774,7 @@ begin
Mainform.Showstatus('Exporting row '+FormatNumber(Node.Index+1)+' of '+FormatNumber(RootNodeCount)+
' ('+IntToStr(Trunc((Node.Index+1) / RootNodeCount *100))+'%, '+FormatByteNumber(StreamSize)+')'
);
Mainform.ProgressBarStatus.Position := Node.Index+1;
end;
@ -789,6 +790,8 @@ var
Node: PVirtualNode;
begin
MaxSize := GetRegValue(REGNAME_COPYMAXSIZE, DEFAULT_COPYMAXSIZE) * SIZE_MB;
Mainform.ProgressBarStatus.Visible := True;
Mainform.ProgressBarStatus.Max := Grid.RootNodeCount;
Generator := APPNAME+' '+FullAppVersion;
tmp :=
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ' + CRLF +
@ -886,6 +889,7 @@ begin
'</html>' + CRLF;
StreamWrite(S, tmp);
Grid.Visible := true;
Mainform.ProgressBarStatus.Visible := False;
Mainform.Showstatus(STATUS_MSG_READY);
end;
@ -908,6 +912,8 @@ begin
encloser := esc2ascii(encloser);
terminator := esc2ascii(terminator);
MaxSize := GetRegValue(REGNAME_COPYMAXSIZE, DEFAULT_COPYMAXSIZE) * SIZE_MB;
Mainform.ProgressBarStatus.Visible := True;
Mainform.ProgressBarStatus.Max := Grid.RootNodeCount;
tmp := '';
// Columns
@ -967,6 +973,7 @@ begin
end;
end;
Grid.Visible := true;
Mainform.ProgressBarStatus.Visible := False;
Mainform.showstatus(STATUS_MSG_READY);
end;
@ -984,6 +991,8 @@ var
Node: PVirtualNode;
begin
MaxSize := GetRegValue(REGNAME_COPYMAXSIZE, DEFAULT_COPYMAXSIZE) * SIZE_MB;
Mainform.ProgressBarStatus.Visible := True;
Mainform.ProgressBarStatus.Max := Grid.RootNodeCount;
tmp := '<?xml version="1.0"?>' + CRLF + CRLF +
'<table name="'+root+'">' + CRLF;
StreamWrite(S, tmp);
@ -1037,6 +1046,7 @@ begin
tmp := '</table>' + CRLF;
StreamWrite(S, tmp);
Grid.Visible := true;
Mainform.ProgressBarStatus.Visible := False;
Mainform.showstatus(STATUS_MSG_READY);
end;
@ -1053,6 +1063,8 @@ var
Node: PVirtualNode;
begin
MaxSize := GetRegValue(REGNAME_COPYMAXSIZE, DEFAULT_COPYMAXSIZE) * SIZE_MB;
Mainform.ProgressBarStatus.Visible := True;
Mainform.ProgressBarStatus.Max := Grid.RootNodeCount;
// Avoid reloading discarded data before the end.
Grid.Visible := false;
Node := Grid.GetFirst;
@ -1107,6 +1119,7 @@ begin
tmp := CRLF;
StreamWrite(S, tmp);
Grid.Visible := true;
Mainform.ProgressBarStatus.Visible := False;
Mainform.showstatus(STATUS_MSG_READY);
end;

View File

@ -95,6 +95,9 @@ object MainForm: TMainForm
item
Width = 150
end
item
Width = 80
end
item
Width = 250
end>
@ -1502,6 +1505,14 @@ object MainForm: TMainForm
end
end
end
object ProgressBarStatus: TProgressBar
Left = 545
Top = 445
Width = 81
Height = 17
Step = 1
TabOrder = 4
end
object MainMenu1: TMainMenu
AutoHotkeys = maManual
Images = PngImageListMain

View File

@ -22,7 +22,7 @@ uses
SynCompletionProposal, ZSqlMonitor, SynEditHighlighter, SynHighlighterSQL,
TntStdCtrls, Tabs, SynUnicode, mysqlconn, EditVar, helpers, queryprogress,
mysqlquery, createdatabase, createtable, tbl_properties, SynRegExpr,
WideStrUtils, ZDbcLogging, ExtActns;
WideStrUtils, ZDbcLogging, ExtActns, CommCtrl;
type
TMainForm = class(TForm)
@ -452,6 +452,7 @@ type
actSelectAll: TAction;
actSelectAll1: TMenuItem;
N13: TMenuItem;
ProgressBarStatus: TProgressBar;
procedure refreshMonitorConfig;
procedure loadWindowConfig;
procedure saveWindowConfig;
@ -481,7 +482,7 @@ type
procedure actCopyAsCSVExecute(Sender: TObject);
procedure actPrintListExecute(Sender: TObject);
procedure actCopyTableExecute(Sender: TObject);
procedure showstatus(msg: string=''; panel: Integer=5);
procedure showstatus(msg: string=''; panel: Integer=6);
function mask(str: WideString) : WideString;
procedure actExecuteQueryExecute(Sender: TObject);
procedure actExecuteSelectionExecute(Sender: TObject);
@ -1007,7 +1008,7 @@ begin
ExecuteNonQuery(query);
end;
procedure TMainForm.showstatus(msg: string=''; panel: Integer=5);
procedure TMainForm.showstatus(msg: string=''; panel: Integer=6);
begin
// show Message in statusbar
StatusBar.Panels[panel].Text := msg;
@ -1486,6 +1487,10 @@ begin
menuitem.Checked := coVisible in ListTables.Header.Columns[i].Options;
popupDbGridHeader.Items.Add( menuitem );
end;
// Place progressbar on the statusbar
ProgressBarStatus.Parent := StatusBar;
ProgressBarStatus.Visible := False;
end;
@ -1790,11 +1795,17 @@ end;
procedure TMainForm.FormResize(Sender: TObject);
var
i, room: Integer;
PanelRect: TRect;
begin
room := 0;
for i := 1 to Statusbar.Panels.Count - 1 do
inc(room, Statusbar.Panels[i].Width);
StatusBar.Panels[0].Width := Statusbar.Width - room;
// Retreive the rectancle of the statuspanel (in our case the fifth panel)
SendMessage(StatusBar.Handle, SB_GETRECT, 5, Integer(@PanelRect));
// Position the progressbar over the panel on the statusbar
with PanelRect do
ProgressBarStatus.SetBounds(Left, Top, Right-Left, Bottom-Top);
lblDataTop.Width := pnlDataTop.Width - tlbDataButtons.Width - 10;
end;