Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Останавливается информация о ходе выполнения процесса [D7, XP]


Страницы:   1 2 3 4 5 6

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;

Заработал сразу. Переношу на свой код - нифига не работает. Вот и не понятно, что напрягает?


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо