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

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

Аналог Application.ProcessMessages


Bratskiy ©   (2006-04-05 04:38:00) 

Всем привет! Подскажите пожалуйста как сделать аналог Application.ProcessMessages. Дело в том, что почему-то внутри моего класса его вызвать нельзя (даже если прописать uses Forms), а мне он там позарез нужен.


Bratskiy   (2006-04-05 11:21:00) [1]


> Жуков Олег   (05.04.06 10:58) [7]

Всё верно, спасибо!


Жуков Олег   (2006-04-05 10:58:00) [2]

Скорее всего у тебя в каком-то используемомом модуле описан ещё один другой Application. Напиши Forms.Application.ProcessMessages;


Сергей М.   (2006-04-05 10:26:00) [3]


> ка можно этот код оптимизировать


Для начала можно изменить обращения к полям НД по их имени на обращения по их индексам в коллекции полей НД.


Bratskiy   (2006-04-05 10:11:00) [4]

У меня такой код (процедура регистрации документа для последующего поиска в нём определённого слова)

procedure TMyClass.RegisterBlock(b_id:integer);
var
 i,j,n:integer;//счётчик цикла и количество слов;
 k,l:integer;//id слова
 m,p:integer;//число элементов массива
 q:integer;//id связного слова
 arr,parr:OleVariant;//массивы частей речи и однокоренных слов
 x,b_n_id,r,fr:integer;
 s:string;//само слово
 f:boolean;
begin
 n:=FWA.ActiveDocument.Words.Count;
 with DModule do
   begin
     WordTable.Active:=true;
     WordInBlockTable.Active:=true;
     WordTable.Last;
     WordInBlockTable.Last;
     if WordTable.IsEmpty then k:=0
     else k:=WordTable.FieldByName('id').AsInteger;
     if WordInBlockTable.IsEmpty then b_n_id:=0//номер последней записи в WordInBlock
     else b_n_id:=WordInBlockTable.FieldByName('id').AsInteger;
     for i:=1 to n do
       begin

         if BreakFlag = true then break;
         FOnWordComplete(self,n,i);
         f:=false;//флаг означающий, является ли слово словоформой слова, которое уже есть в базе
         s:=Trim(FWA.ActiveDocument.Words.Item(i).Text);
         if not WordTable.Locate('word',s,[loCaseInsensitive]) then//если слово не содержится в базе
           begin
           try
             parr:=FWA.ActiveDocument.Words.Item(i).SynonymInfo.PartOfSpeechList;//массив частей речи
             p:=VarArrayHighBound(parr,1);
             if p<>0 then//если часть речи определена
               begin
                 case parr[p] of
                 1://если слово существительное
                   begin
                     inc(k);//номер слова
                     l:=k;//переменная для номеров словоформ
                //запись в таблицу Слов
                     WordTable.Append;
                     WordTable.FieldValues['id']:=k;
                     WordTable.FieldValues['word']:=s;
                     WordTable.FieldValues['word_id']:=0;
                     WordTable.Post;
          //Запись в таблицу "слова в документах"
                       inc(b_n_id);
                       WordInBlockTable.Append;
                       WordInBlockTable.FieldValues['id']:=b_n_id;
                       WordInBlockTable.FieldValues['block_id']:=b_id;
                       WordInBlockTable.FieldValues['word_id']:=k;
                       WordInBlockTable.FieldValues['freq']:=0;
                       WordInBlockTable.Post;
                     arr:=FWA.ActiveDocument.Words.Item(i).SynonymInfo.RelatedWordList;//массив словоформ
                     m:=VarArrayHighBound(arr,1);
                     if m<>0 then
                       begin
                         for j:=1 to m do
                           begin
                             s:=Trim(arr[j]);
                             if not WordTable.Locate('word',s,[LoCaseInsensitive]) then//если словоформы нет в базе
                               begin
                                 inc(l);
                                 WordTable.Append;
                                 WordTable.FieldValues['id']:=l;
                                 WordTable.FieldValues['word']:=s;
                                 WordTable.FieldValues['word_id']:=k;
                                 WordTable.Post;
                               end
                             else//если она есть, то данное слово (не словоформа) является словоформой уже существующего в базе слова
                               begin
                                 f:=true;
                                 q:=WordTable.FieldbyName('word_id').AsInteger;
                               end;
                           end;
                         if f then
                           begin
                             WordTable.First;
                             WordTable.MoveBy(k-1);
                             WordTable.Edit;
                             WordTable.FieldValues['word_id']:=q;
                             WordTable.post;
                           end;
                         k:=l;
                       end;
                   end;
                 end;
               end;
           except
           end;
           end
         else   //если слово уже есть в базе
           begin
               r:=WordTable.FieldByName('id').AsInteger;
               WinBQ.active:=false;
               WinBQ.ParamByName('p1').value:=b_id;
               WinBQ.ParamByName('p2').value:=r;
               WinBQ.active:=true;
               if WinBQ.IsEmpty then //есть ли в WordInBlock запись с номером этого слова и с номером блока
                 begin
                   inc(b_n_id);
                   WordInBlockTable.Append;
                   WordInBlockTable.FieldValues['id']:=b_n_id;
                   WordInBlockTable.FieldValues['block_id']:=b_id;
                   WordInBlockTable.FieldValues['word_id']:=r;
                   WordInBlockTable.FieldValues['freq']:=0;
                   WordInBlockTable.Post;
                 end
               else
                 begin
                   x:=WinBQ.FieldByName('id').AsInteger;
                   WordInBlockTable.First;
                   WordInBlockTable.MoveBy(x-1);
                   fr:=WordInBlockTable.FieldByName('freq').AsInteger+1;
                   WordInBlockTable.Edit;
                   WordInBlockTable.FieldValues['freq']:=fr;
                   WordInBlockTable.Post;
                 end;
           end;
       end;
   end;
end;

В этой процедуре Application.ProcessMessages не вызывается (набираешь Application потом ставишь точку метода ProcessMessages в списке нет), и как я уже говорил, если пропишешь вручную, вылазит ошибка. Uses Forms у меня прописано.

Ну да ладно, эту неприятность я уже обошёл. В этом коде у меня есть переменная FOnWordComplete. Это событие, которое я сделал сам. В обработчике этого события (в другом юните, в котором подключен этот класс) Application.ProcessMessages работает нормально

Я конечно понимаю, что разбираться в чужом коде  не самое приятное занятие, но если кого-нибудь из вас не затруднит, подскажите пожалуйста ка можно этот код оптимизировать. Буду несказанно благодарен. Спасибо за внимание.


MBo   (2006-04-05 07:42:00) [5]

Ничего не ругается

unit Unit7;

interface
type
 TMy = class
   procedure DoWork;
 end;

implementation
uses Forms;
{ TMy }

procedure TMy.DoWork;
var
 i: Integer;
 d: Double;
begin
 for i:=1 to 50000000 do begin
   d:=Sin(i)*Sqrt(1/i);
   if (i mod 10000) = 0 then
     Application.ProcessMessages;
 end;
end;


Palladin   (2006-04-05 07:42:00) [6]

значит ты не подключил Forms


Bratskiy   (2006-04-05 07:28:00) [7]

Когда пишешь внутри цикла (в моём классе) Application.ProcessMessages Delphi начинает ругаться, говорит что неопределённый идентификатор


Palladin   (2006-04-05 07:15:00) [8]

кто сказал что нельзя?


Наверх

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