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

Вниз

Аналог Application.ProcessMessages   Найти похожие ветки 

 
Bratskiy ©   (2006-04-05 04:38) [0]

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


 
Palladin ©   (2006-04-05 07:15) [1]

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


 
Bratskiy ©   (2006-04-05 07:28) [2]

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


 
MBo ©   (2006-04-05 07:42) [3]

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

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

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


 
Bratskiy ©   (2006-04-05 10:11) [5]

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

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 работает нормально

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


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


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


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


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

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


 
Bratskiy ©   (2006-04-05 11:21) [8]


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

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



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

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

Наверх




Память: 0.51 MB
Время: 0.056 c
9-1127832954
Chuvak
2005-09-27 18:55
2006.04.16
Эффекты и синхронизация в OpenGL


2-1144089581
mc tarik
2006-04-03 22:39
2006.04.16
Как использовать (exe) вставленный в программу не сохраняя .....


3-1140196038
Taurus
2006-02-17 20:07
2006.04.16
Поле подстановки


15-1143011380
Бугага
2006-03-22 10:09
2006.04.16
Все голы сборной России по хоккею на Олимпиаде


2-1143699058
Logos
2006-03-30 10:10
2006.04.16
Формула