![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Останавливается информация о ходе выполнения процесса [D7, XP]
kyn66 © (2009-11-06 13:11:00)Добрый день, мастера. Во время загрузки данных в таблицу(процесс занимает определенное время) информирую пользователя о ходе выполнения процесса через ProgressBar и цифровую информацию в процентах http://yurec66.narod.ru/Vopros/proc.jpg. Если не совершать никаких действий, все идет нормально. Вот код обработки:
SL := TStringList.Create;
SL.LoadFromFile(ImportPath + FName);
PB1.Max := SL.Count;
PB1.Position := 0;
Nzap := 0;
NzapV := 0;
NzapC := Trunc(SL.Count/100);
for i := 0 to SL.Count - 1 do
begin
SS := SL[i];
...
// ряд некоторых операций
...
PB1.Position := PB1.Position + 1;
Inc(Nzap);
if Nzap >= NzapC then
begin
Inc(NzapV);
ProcLab.Caption := IntToStr(NzapV) + ' %';
ProcLab.Update;
Nzap := 0;
end;
// еще одна операция некоторая
end;
SL.Destroy;
PB1.Position := 0;
Стоит только перключиться на другое окно или это в фоне сделает любая юругая программа(т.е. окно с прогрессом теряет фокус) - прогресс сразу же замирает, цифры процентов не меняются. СОздается впечатление, что прога зависла, хотя процесс обработки данных выполняется. Как это выличить? ЧТобы и при потере фокуса прогресс с процентами не переставали информировать юзера?
Сергей М. (2009-11-07 19:45:00) [61]И при этом ты утверждаешь, что запуск RepRupsItemClick в том виде, в котором он у тебя реализован, останавливает анимацию, а если в теле метода будет всего одна строчка while True do, то анимация не останавливается,
так ?
kyn66 (2009-11-06 20:27:00) [62]
> Это же две разных формы)
А что в этом удивительного? Так там еще и третья присутствует PeriodFrm. Из одной формы вызывается другая и третья. Каждая отработав оставляет свои данные. А MesFrm(инфо-форма) конкретно, отвечает за содержание в себе анимационной картинки.
Anatoly Podgoretsky (2009-11-06 19:42:00) [63]> Leonid Troyanovsky (06.11.2009 19:01:55) [55]
Но тольоко четыре секунды.
Anatoly Podgoretsky (2009-11-06 19:41:00) [64]> kyn66 (06.11.2009 16:59:50) [50]
Ладно, я же пошутил, код всегда не плох, если в меру приведен.
Сергей М. (2009-11-06 19:16:00) [65]
> Как видно MesFrmотдельная форма. Внутри этой формы я создал
> запись
>
> procedure T MesFrm.FormShow(Sender: TObject);
> begin
> Animate1.Active := True;
> end;
Так а какого же хрена в [46] фигурирует
> procedure T MainFrm.RepRupsItemClick(Sender: TObject);
Это же две разных формы)
Leonid Troyanovsky (2009-11-06 19:01:00) [66]
> kyn66 © (06.11.09 18:10) [54]
> Но зато в примере убралась за счет этого 4-секундная пауза
Ну все, можем отдохнуть.
--
Regards, LVT.
kyn66 (2009-11-06 18:10:00) [67]
> Думал это как то исправит ситуацию, после проверенного твоего
> примера. Однако обломс...
Но зато в примере убралась за счет этого 4-секундная пауза
kyn66 (2009-11-06 18:08:00) [68]Точнее твой вопрос нужно разбить на 2 части:
> Т.е. ты утверждаешь, что если в OnShow формы активировать
> компонент Animate, то анимация начинается немедленно сразу
> при визуализации формы,
Это - да
>а после клика на RepRupsItem визуализированной
> формы анимация прекращается вплоть до завершения соотв.обработчика
> либо или до первого вызова Application.ProcessMessages где-
> либо в теле этого обработчика, так ?
Здесь нет, не совсем так. 1-я часть твоего вопроса подходит под ответ, когда был использован пример while true do;. Я если выполнить мой код, представленный выше, то анимация вааще не стартует. Как видно MesFrmотдельная форма. Внутри этой формы я создал запись
procedure TMesFrm.FormShow(Sender: TObject);
begin
Animate1.Active := True;
end;
Думал это как то исправит ситуацию, после проверенного твоего примера. Однако обломс...
kyn66 (2009-11-06 17:51:00) [69]
> Сергей М. © (06.11.09 17:06) [51]
> Т.е. ты утверждаешь, что если в OnShow формы активировать
> компонент Animate, то анимация начинается немедленно сразу
> при визуализации формы, а после клика на RepRupsItem визуализированной
> формы анимация прекращается вплоть до завершения соотв.обработчика
> либо или до первого вызова Application.ProcessMessages где-
> либо в теле этого обработчика, так ?
Совершенно верно понято!
Сергей М. (2009-11-06 17:06:00) [70]Т.е. ты утверждаешь, что если в OnShow формы активировать компонент Animate, то анимация начинается немедленно сразу при визуализации формы, а после клика на RepRupsItem визуализированной формы анимация прекращается вплоть до завершения соотв.обработчика либо или до первого вызова Application.ProcessMessages где-либо в теле этого обработчика,
так ?
kyn66 (2009-11-06 16:59:00) [71]
Anatoly Podgoretsky © (06.11.09 16:57) [48]
> Ты что хочешь обсуждение не на одну сотню сообщений?
Ну ты же чай не хочешь ехать пить, так вот и показываю код, чтобы не выглядеть идиотом в глазах мастеров и Триждыорденоносцев.
kyn66 (2009-11-06 16:58:00) [72]Продолжение
Вывод на печать
Case (Sender As TMenuItem).Tag of
1 : // Вывод отчета на печать
if SborTbl.RecordCount <> 0 then
begin
SborTbl.MasterSource := RegionDataSource;
SborTbl.MasterFields := 'Kod';
EkRTF1.InFile := ShablonPath + 'Rep2.rtf';
EkRTF1.OutFile := GetTempDir + 'Остатки по гофроящикам.doc';
RepName1 := EkRTF1.OutFile;
EkRTF1.ClearVars;
EkRTF1.CreateVar('per_in', PeriodStr(MesP, GodP));
EkRTF1.CreateVar('per_rep', AnsiLowerCase(mes_A[MesP]));
EkRTF1.CreateVar('per_out', NextPeriodStr(MesP, GodP));
EkRTF1.CreateVar('god_rep', IntToStr(GodP));
EkRTF1.CreateVar('Rups', 'по филиалу ');
Screen.Cursor := crDefault;
EkRTF1.ExecuteOpen([RegionTbl, SborTbl], SW_SHOW);
end
else
WarnMsg('Данные отсутствуют !');
2 : begin
// Дополнительный отбор данных для Области
for i := 1 to 8 do
ParZ_A[i] := 0;
SborTbl.Close;
OblTbl.Open;
GBoxTbl.Open;
GBoxTbl.First;
with TADSQuery.Create(nil) do
try
ADSConnection := DM1.AdsConnection1;
ParamCheck := True;
for i := 0 to Pred(GBoxTbl.RecordCount) do
// while not GBoxTbl.EOF do
begin
SQL.Clear;
SQL.Add('SELECT ');
SQL.Add('SUM(Kol1) As SKol1, SUM(Sum1) As SSum1,');
SQL.Add('SUM(Kol2) As SKol2, SUM(Sum2) As SSum2,');
SQL.Add('SUM(Kol3) As SKol3, SUM(Sum3) As SSum3,');
SQL.Add('SUM(Kol4) As SKol4, SUM(Sum4) As SSum4');
SQL.Add(' FROM Sbor');
SQL.Add(' WHERE TovKod = :p0');
Params[0].Value := GboxTblKod.Value;
Open;
for j := 1 to 7 do
if Fields[j-1].Value <> Null then
ParZ_A[j] := ParZ_A[j] + Fields[j-1].Value;
OblTbl.AppendRecord([GboxTblKod.Value,
Fields[0].Value, Fields[1].Value,
Fields[2].Value, Fields[3].Value,
Fields[4].Value, Fields[5].Value,
Fields[6].Value, Fields[7].Value]);
GBoxTbl.Next;
end;
finally
Free;
end;
// Вывод отчета на печать
if (ParZ_A[1] <> 0) OR (ParZ_A[2] <> 0) OR (ParZ_A[3] <> 0) OR
(ParZ_A[4] <> 0) OR (ParZ_A[5] <> 0) OR (ParZ_A[6] <> 0) OR
(ParZ_A[7] <> 0) OR (ParZ_A[8] <> 0) then
begin
EkRTF1.InFile := ShablonPath + 'Rep3.rtf';
EkRTF1.OutFile := GetTempDir + 'Остатки по гофроящикам.doc';
RepName1 := EkRTF1.OutFile;
EkRTF1.ClearVars;
EkRTF1.CreateVar('per_in', PeriodStr(MesP, GodP));
EkRTF1.CreateVar('per_rep', AnsiLowerCase(mes_A[MesP]));
EkRTF1.CreateVar('per_out', NextPeriodStr(MesP, GodP));
EkRTF1.CreateVar('god_rep', IntToStr(GodP));
EkRTF1.CreateVar('Rups', 'по филиалу');
Screen.Cursor := crDefault;
EkRTF1.ExecuteOpen([OblTbl], SW_SHOW);
end
else
WarnMsg('Данные отсутствуют !');
GBoxTbl.Close;
OblTbl.Close;
end;
end;{Case}
SborTbl.Close;
RegionTbl.Close;
PeriodTbl.Close;
end;{With DM1}
MesFrm.Hide;
MesFrm.Free;
end;
finally
PeriodFrm.Close;
PeriodFrm.Free;
end;
end;
kyn66 (2009-11-06 16:57:00) [73]продолжение
CpsQuery.SQL.Clear;
CpsQuery.SQL.Add('SELECT DISTINCT TovKod,TovCena FROM Cps');
CpsQuery.Open;
CpsQuery.First;
with TADSQuery.Create(nil) do
try
ADSConnection := DM1.AdsConnection1;
ParamCheck := True;
while not CpsQuery.EOF do
begin
SQL.Clear;
SQL.Add('SELECT ');
SQL.Add('SUM(Kol1) As SKol1, SUM(Sum1) As SSum1,');
SQL.Add('SUM(Kol2) As SKol2, SUM(Sum2) As SSum2,');
SQL.Add('SUM(Kol3) As SKol3, SUM(Sum3) As SSum3,');
SQL.Add('SUM(Kol4) As SKol4, SUM(Sum4) As SSum4');
SQL.Add(' FROM Cps');
SQL.Add(' WHERE TovKod = :p0 AND TovCena = :p1');
Params[0].Value := CpsQueryTovKod.Value;
Params[1].Value := CpsQueryTovCena.Value;
Open;
SborTbl.InsertRecord([105, CpsQueryTovKod.Value, CpsQueryTovCena.Value,
Fields[0].Value, Fields[1].Value,
Fields[2].Value, Fields[3].Value,
Fields[4].Value, Fields[5].Value,
Fields[6].Value, Fields[7].Value]);
CpsQuery.Next;
end;
finally
Free;
end;
CpsQuery.Close;
CpsQuery.AdsCloseSQLStatement;
CpsTbl.Close;
Anatoly Podgoretsky (2009-11-06 16:57:00) [74]> kyn66 (06.11.2009 16:41:44) [44]
> Могу выложить полный кусок кода
Ты что хочешь обсуждение не на одну сотню сообщений?
kyn66 (2009-11-06 16:55:00) [75]КОроче, вот весь кусок, на котором они запираются(часики)
procedure TMainFrm.RepRupsItemClick(Sender: TObject);
Var
i, j : Integer;
begin
try
HaveChild := False; // Эмуляция параметра
PeriodFrm := TPeriodFrm.Create(Application);
if PeriodFrm.ShowModal = mrOK then
begin
MesFrm := TMesFrm.Create(nil);
MesFrm.Lab1.Caption := 'Формируется документ, ожидайте...';
MesFrm.Show;
MesFrm.Update;
MesP := PeriodFrm.MesComboBox.ItemIndex + 1;
GodP := PeriodFrm.GodSpinEdit.AsInteger;
With DM1 do
begin
if SborTbl.Active then
SborTbl.Close;
SborTbl.Exclusive := True;
SborTbl.EmptyTable;
SborTbl.Exclusive := False;
SborTbl.Open;
CpsTbl.Close;
CpsTbl.Exclusive := True;
CpsTbl.EmptyTable;
CpsTbl.Exclusive := False;
CpsTbl.Open;
RegionTbl.Open;
PeriodTbl.Open;
OpsTbl.Open;
OpsTbl.First;
while not OpsTbl.EOF do
begin
if PeriodTbl.Locate('RegKod;Mes;God', VarArrayOf([OpsTblKod.Value, MesP, GodP]), []) then
begin
// Отбор по основным РУПС
OborotQuery.SQL.Clear;
OborotQuery.SQL.Add('SELECT * FROM Oborot WHERE RegKod < 200 AND PerID = :p0 ORDER BY TovKod, Cena');
OborotQuery.Params[0].Value := PeriodTblID.Value;
OborotQuery.Open;
OborotQuery.First;
while not OborotQuery.EOF do
begin
SborTbl.InsertRecord([OpsTblKod.Value, OborotQueryTovKod.Value, OborotQueryCena.Value,
OborotQueryKolOst.Value, OborotQuerySumOst.Value,
OborotQueryKolPol.Value, OborotQuerySumPol.Value,
OborotQueryKolReal.Value, OborotQuerySumReal.Value,
OborotQueryOstMesKol.Value, OborotQueryOstMesSum.Value]);
OborotQuery.Next;
end;
// Отбор для ЦПС
OborotQuery.SQL.Clear;
OborotQuery.SQL.Add('SELECT * FROM Oborot WHERE RegKod > 200 AND PerID = :p0 ORDER BY TovKod, Cena');
OborotQuery.Params[0].Value := PeriodTblID.Value;
OborotQuery.Open;
OborotQuery.First;
while not OborotQuery.EOF do
begin
CpsTbl.InsertRecord([OpsTblKod.Value, OborotQueryTovKod.Value,
OborotQueryCena.Value,
OborotQueryKolOst.Value, OborotQuerySumOst.Value,
OborotQueryKolPol.Value, OborotQuerySumPol.Value,
OborotQueryKolReal.Value, OborotQuerySumReal.Value,
OborotQueryOstMesKol.Value, OborotQueryOstMesSum.Value]);
OborotQuery.Next;
end;
end;
OpsTbl.Next;
end;
.....
и далее БОльше форум не дает вставить
Сергей М. (2009-11-06 16:51:00) [76]
> и продолжали работать во время цикла
А цикл-то твой при каком событии формы стартует ?
Anatoly Podgoretsky (2009-11-06 16:41:00) [77]> kyn66 (06.11.2009 16:19:38) [38]
Это нормальное поведение.
kyn66 (2009-11-06 16:41:00) [78]
> Сергей М. © (06.11.09 16:38) [42]
> А так
А так - это "проверка на выносливость" . Мне то нужно чтобы часики заработали при самом первом появлении инфо-формы и продолжали работать во время цикла. У меня не стартуют, чтото задерживает их старт. Могу выложить полный кусок кода
Сергей М. (2009-11-06 16:38:00) [79]А так
procedure TForm1.Button6Click(Sender: TObject);
begin
Animate1.Active := true;
while true do;
end;
?
kyn66 (2009-11-06 16:30:00) [80]
> Так а куда ж ты торопился ?)
Не понял?
В твоем примере сделал так
procedure TMesFrm.FormShow(Sender: TObject);
begin
Animate1.Active := True;
end;
Заработал сразу. Переношу на свой код - нифига не работает. Вот и не понятно, что напрягает?