Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.27;
Скачать: CL | DM;

Вниз

Останавливается информация о ходе выполнения процесса   Найти похожие ветки 

 
Сергей М. ©   (2009-11-06 16:20) [40]


> Анимация начинает работать через 4 сек. после появления
> формы


Клиент не успеет застрелиться за это время от скуки, а остальным можно пренебречь


 
kyn66 ©   (2009-11-06 16:30) [41]


> Так а куда ж ты торопился ?)


Не понял?

В твоем примере сделал так

procedure TMesFrm.FormShow(Sender: TObject);
begin
 Animate1.Active := True;
end;

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


 
Сергей М. ©   (2009-11-06 16:38) [42]

А так

procedure TForm1.Button6Click(Sender: TObject);
begin
 Animate1.Active := true;
 while true do;
end;


?


 
Anatoly Podgoretsky ©   (2009-11-06 16:41) [43]

> kyn66  (06.11.2009 16:19:38)  [38]

Это нормальное поведение.


 
kyn66 ©   (2009-11-06 16:41) [44]


> Сергей М. ©   (06.11.09 16:38) [42]
> А так


А так - это "проверка на выносливость" . Мне то нужно чтобы часики заработали при самом первом появлении инфо-формы и продолжали работать во время цикла. У меня не стартуют, чтото задерживает их старт. Могу выложить полный кусок кода


 
Сергей М. ©   (2009-11-06 16:51) [45]


> и продолжали работать во время цикла


А цикл-то твой при каком событии формы стартует ?


 
kyn66 ©   (2009-11-06 16:55) [46]

КОроче, вот весь кусок, на котором они запираются(часики)

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;
.....


и далее БОльше форум не дает вставить


 
kyn66 ©   (2009-11-06 16:57) [47]

продолжение

        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) [48]

> kyn66  (06.11.2009 16:41:44)  [44]

> Могу выложить полный кусок кода

Ты что хочешь обсуждение не на одну сотню сообщений?


 
kyn66 ©   (2009-11-06 16:58) [49]

Продолжение
Вывод на печать

      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:59) [50]


Anatoly Podgoretsky ©   (06.11.09 16:57) [48]
> Ты что хочешь обсуждение не на одну сотню сообщений?


Ну ты же чай не хочешь ехать пить, так вот и показываю код, чтобы не выглядеть идиотом в глазах мастеров и Триждыорденоносцев.


 
Сергей М. ©   (2009-11-06 17:06) [51]

Т.е. ты утверждаешь, что если в OnShow формы активировать компонент Animate, то анимация начинается немедленно сразу при визуализации формы, а после клика на RepRupsItem визуализированной формы анимация прекращается вплоть до завершения соотв.обработчика либо или до первого вызова Application.ProcessMessages где-либо в теле этого обработчика,
так ?


 
kyn66 ©   (2009-11-06 17:51) [52]


> Сергей М. ©   (06.11.09 17:06) [51]
> Т.е. ты утверждаешь, что если в OnShow формы активировать
> компонент Animate, то анимация начинается немедленно сразу
> при визуализации формы, а после клика на RepRupsItem визуализированной
> формы анимация прекращается вплоть до завершения соотв.обработчика
> либо или до первого вызова Application.ProcessMessages где-
> либо в теле этого обработчика, так ?


Совершенно верно понято!


 
kyn66 ©   (2009-11-06 18:08) [53]

Точнее твой вопрос нужно разбить на 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 18:10) [54]


> Думал это как то исправит ситуацию, после проверенного твоего
> примера. Однако обломс...


Но зато в примере убралась за счет этого 4-секундная пауза


 
Leonid Troyanovsky ©   (2009-11-06 19:01) [55]


> kyn66 ©   (06.11.09 18:10) [54]

> Но зато в примере убралась за счет этого 4-секундная пауза

Ну все, можем отдохнуть.

--
Regards, LVT.


 
Сергей М. ©   (2009-11-06 19:16) [56]


> Как видно MesFrm отдельная форма. Внутри этой формы я создал
> запись
>
> procedure TMesFrm.FormShow(Sender: TObject);
> begin
> Animate1.Active := True;
> end;


Так а какого же хрена в [46] фигурирует


> procedure TMainFrm.RepRupsItemClick(Sender: TObject);


Это же две разных формы)


 
Anatoly Podgoretsky ©   (2009-11-06 19:41) [57]

> kyn66  (06.11.2009 16:59:50)  [50]

Ладно, я же пошутил, код всегда не плох, если в меру приведен.


 
Anatoly Podgoretsky ©   (2009-11-06 19:42) [58]

> Leonid Troyanovsky  (06.11.2009 19:01:55)  [55]

Но тольоко четыре секунды.


 
kyn66 ©   (2009-11-06 20:27) [59]


> Это же две разных формы)


А что в этом удивительного? Так там еще и третья присутствует PeriodFrm . Из одной формы вызывается другая и третья. Каждая отработав оставляет свои данные. А MesFrm(инфо-форма) конкретно, отвечает за содержание в себе анимационной картинки.


 
Сергей М. ©   (2009-11-07 19:45) [60]

И при этом ты утверждаешь, что запуск RepRupsItemClick в том виде, в котором он у тебя реализован, останавливает анимацию, а если в теле метода будет всего одна строчка while True do, то анимация не останавливается,
так ?


 
kyn66 ©   (2009-11-07 20:27) [61]


> Сергей М. ©   (07.11.09 19:45) [60]
> И при этом ты утверждаешь, что запуск RepRupsItemClick в
> том виде, в котором он у тебя реализован, останавливает
> анимацию,


Я не сказал что останавливает. Я сказал , что анимация не успевает(возможно) стартануть, как инфо окно уже закрывается.


 
Сергей М. ©   (2009-11-07 20:31) [62]

Как это "не успевает", если [54] ?)


 
kyn66 ©   (2009-11-07 20:33) [63]


[54]
> Но зато в примере убралась за счет этого 4-секундная пауза


PS
Кстати, рад тебя видеть в эфире в выходные :)


 
Сергей М. ©   (2009-11-07 20:35) [64]

В каком примере-то ?)


 
kyn66 ©   (2009-11-07 20:38) [65]

В твоем,

procedure TForm1.Button6Click(Sender: TObject);
begin
while true do;
end;


 
Сергей М. ©   (2009-11-07 20:43) [66]

А как мой пример пересекается с твоим ?)
В моем примере форма не исчезает и позволяет видеть работает или не работает компонент как положено ..
А у тебя форма, как ты говоришь, исчезает, так что ты сам не знаешь, то ли есть анимация. толи нет, то ли есть задержка, то ли нет)


 
kyn66 ©   (2009-11-07 20:51) [67]

Жалко в твоем профайле мало инфы о тебе. Если бы у тя была указана ася, я бы быстрее смог объяснить, чем через форум. Ато товарищ из города Эстония уже сделал намек, что обсуждение слишком затянулось.

Так вот, как еще обэяснить то.. ДА и у меня никакие формы не исчезают. Просмотри внимательно мой код после этого коммента попунктно:
1) Тыкаем по пункту меню для формирования отчета procedure TMainFrm.RepRupsItemClick(Sender: TObject);
2)Прявляется форма выбора отчетного периода , чтобы указать месяц и год отчета PeriodFrm := TPeriodFrm.Create(Application); . Если выбрано и все Окейно, if PeriodFrm.ShowModal = mrOK then то появляется инфо-окошко, форма MesFrm на котором и расположены аничасики.

   MesFrm := TMesFrm.Create(nil);
   MesFrm.Lab1.Caption := "Формируется документ, ожидайте...";
   MesFrm.Show;
   MesFrm.Update;

3) Пошел выполняться основной этап отбора данных для отчета. Пока он выполняется в фоне, часики на инфо-панели должны тикать
....

НУ вот как то так. Понятно ща?


 
Сергей М. ©   (2009-11-07 20:55) [68]


> Пока он выполняется в фоне, часики на инфо-панели должны
> тикать


И что, не тикают ?)


 
kyn66 ©   (2009-11-07 20:57) [69]

В том то и дело, что не тикают. Яж говорю, возможно 4-х сек. задержка виновата, возможно напорциклов перебора таблиц не дает стартануть, напрягает перерисовку инфо-формы... Вот поэтому и спрашиваю, что это могет быть


 
Сергей М. ©   (2009-11-07 21:08) [70]


> возможно 4-х сек. задержка виновата


Сказка про белого бычка)..
Ну ты же сам в [41] сказал, что при активайии компонента в OnShow задержка исчезает ?


> напорциклов


))
Мощно задвинул)

Ну понатыкай ты в этот цикл слипов побольше да подольше и посмотри, есть ли анимация или нет ..


 
kyn66 ©   (2009-11-07 21:10) [71]


> Сказка про белого бычка)..Ну ты же сам в [41] сказал, что
> при активайии компонента в OnShow задержка исчезает ?


Говорил, не отрицаю. В примере все работало. Когда задействовал в своем коде - нет. Мистика?


 
Сергей М. ©   (2009-11-07 21:20) [72]

Так не тикают вообще или все же тикают, но с задержкой ?)


 
Сергей М. ©   (2009-11-07 21:20) [73]

Так не тикают вообще или все же тикают, но с задержкой ?)


 
kyn66 ©   (2009-11-07 21:22) [74]


> Так не тикают вообще или все же тикают, но с задержкой ?
> )


За тот промежуток времени пока они видны на экране(~ 3 сек) - не тикают


 
Сергей М. ©   (2009-11-07 21:25) [75]


> За тот промежуток времени пока они видны


Да упарил ты уже своим "промежутком" !)

Понатыкай слипов в свой премудрый цикл, так чтобы он выполнялся заведомо дольше той самой задержки, да посмотри наконец что там на самом деле происходит !

Как дитя малое, ей-богу)


 
Сергей М. ©   (2009-11-07 21:31) [76]


>       MesFrm := TMesFrm.Create(nil);
>       MesFrm.Lab1.Caption := "Формируется документ, ожидайте.
> ..";
>       MesFrm.Show;
>       MesFrm.Update; //это замени на Application.ProcessMessages


 
kyn66 ©   (2009-11-07 21:32) [77]


> Понатыкай слипов в свой премудрый цикл, так чтобы он выполнялся
> заведомо дольше той самой задержки,


Sleep() ?
Никогда не использовал. А что он даст. В каком плане будет выглядеть задержка? Точнее где его нужно ставить, в цикле, перед, после и т.д?


 
Сергей М. ©   (2009-11-07 21:37) [78]


> что он даст


Он "заморозит" выполнение вызывающего потока на указанное время.


> где его нужно ставить


Где угодно, но, разумеется, после

MesFrm.Show
pplication.ProcessMessages


 
kyn66 ©   (2009-11-07 21:45) [79]


> Он "заморозит" выполнение вызывающего потока на указанное
> время.


Т.е. программа не прервется визуально, это типа Delay()?


> pplication.ProcessMessages

Ты же сказал он не нужен, если Animate.Timers = False. Т.е. он будет в отдельном потоке работать. Кого тогда конкретно слип тормозить будет?


 
Сергей М. ©   (2009-11-07 21:50) [80]


> это типа Delay()?


Да.


> Ты же сказал он не нужен, если Animate.Timers = False


Так у тебя де на форме не только Animate, но и какие-то другие виз.контролы !
Их то надо обновить..


> Кого тогда конкретно слип тормозить будет?


Я же сказал - вызывающий поток. Т.е. основной в дан.случае.
А поскольку анимация выполнаяется в дополнительном, слип основного потока не должен никак на нее повлиять



Страницы: 1 2 3 вся ветка

Текущий архив: 2009.12.27;
Скачать: CL | DM;

Наверх




Память: 0.67 MB
Время: 0.019 c
15-1256898600
RWolf
2009-10-30 13:30
2009.12.27
Firebird: как поднять БД из SHADOW?


2-1257668589
Zheksonz
2009-11-08 11:23
2009.12.27
XPManifest, цвет компонента


1-1230592103
ivanoff
2008-12-30 02:08
2009.12.27
Форма MDIChild не разворачвается полностью


2-1257824241
Андрей Смирнов
2009-11-10 06:37
2009.12.27
Как подсчитать кол-во вхождений в RichEdit?


15-1256634915
{RASkov}
2009-10-27 12:15
2009.12.27
О вирусе...