Всем добрый день.
Порой при выполнении наких либо задач требуется визуализация выполнения процесса.
Например выполняем экспорт большого объема данных в xls, затемняем грид пишем мол "идет экспорт, ждите"
Код:
StartLoadingStatus('Экспорт данных...');
исходя из того что объем данных большой то приходится ждать какое-то время, и непонятно выполняется экспорт или прога "повисла".
Может для визуального восприятия выполнения экспорта данных реализовать какой-нибудь, например,
progressbar с процентовкой экспорта.
Я когда то давно делал что-то подобное (может не очень правильно, но оно работало): те создал динамическую форму поместил туда progressbar и при выполнении экспорта выщитывал процент выполнения операции и соответственно изменял
position прогресбара, далее по выполнении операции грохал форму со всем ее содержимым.
Код:
//Экспорт DataSet в Excel
procedure DatasetToExcel(FDBGrid: TDBGridEh; FileName: string);
var
iCol, iRow, iField: Integer;
fField: TField;
MyBookmark: TBookmark;
FStream: TFileStream;
form: TForm; //
Progress: TProgressBar;
Label_: TLabel;
reccount:Integer;
begin
if FDBGrid.DataSource.DataSet.RecordCount = 0 then exit;
iCol := 0;
iRow := 0;
MyBookMark := FDBGrid.DataSource.DataSet.GetBookmark;
FDBGrid.DataSource.DataSet.DisableControls;
FDBGrid.DataSource.DataSet.First;
reccount:=FDBGrid.DataSource.DataSet.RecordCount;
try
Application.CreateForm (TForm, form);
with form do
begin
Caption := 'information';
Position := poMainFormCenter;
BorderStyle:=bsNone;
Width:=350;
Height:=40;
Show;
Label_:=TLabel.Create(form);
with Label_ do
begin
Parent := form;
Align:=alTop;
Alignment:=taCenter;
Caption:='Выполняется экспорт данных...';
end;
Progress:=TProgressBar.Create(form);
with Progress do
begin
Parent := form;
Align:=alClient;
Max:=100;
end;
end;
try
FStream := TFileStream.Create(FileName, fmCreate);
XlsBeginStream(FStream, 0);
//Заголовки полей
for iField := 0 to FDBGrid.Columns.Count - 1 do
begin
fField := FDBGrid.Columns[iField].Field;
if fField.Visible then
begin
XlsWriteCellLabel(FStream, iCol, iRow, fField.DisplayLabel);
iCol := iCol + 1;
end; //with sh
end;
iRow := iRow + 1;
while not FDBGrid.DataSource.DataSet.Eof do begin
iCol := 0;
for iField := 0 to FDBGrid.Columns.Count - 1 do
begin
fField := FDBGrid.Columns[iField].Field;
if fField.Visible then
begin
case fField.DataType of
ftWideString, ftString, ftMemo :
begin
XlsWriteCellLabel(FStream, iCol, iRow, fField.AsAnsiString);
end;
ftAutoInc, ftInteger, ftSmallint, ftCurrency, ftFloat, ftBCD :
begin
if fField.AsFloat <> 0 then
XlsWriteCellNumber(FStream, iCol, iRow, fField.AsFloat);
end;
ftBoolean :
begin
if fField.AsBoolean = True then
XlsWriteCellLabel(FStream, iCol, iRow, 'Да')
else
XlsWriteCellLabel(FStream, iCol, iRow, 'Нет');
end;
else
begin
XlsWriteCellLabel(FStream, iCol, iRow, fField.AsString);
end;
end; //case
iCol := iCol + 1;
end; //visible
end; //for
Application.ProcessMessages;
Progress.Position:=Trunc(iRow/reccount*100);
iRow := iRow + 1;
FDBGrid.DataSource.DataSet.Next;
end; //while
XlsEndStream(FStream);
FStream.Free;
FDBGrid.DataSource.DataSet.GotoBookmark(MyBookMark);
finally
FDBGrid.DataSource.DataSet.FreeBookmark(MyBookMark);
FDBGrid.DataSource.DataSet.EnableControls;
end;
finally
form.Close;
form.Free;
end;
Мое предложение реализовать
ProgressBar или что-то наподобие
StartLoadingStatus или может какую другую
фитчу!