Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

Аналог 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.039 c
15-1143440326
Ega23
2006-03-27 10:18
2006.04.16
С Днём рождения! 25 марта


15-1143325381
artemESC
2006-03-26 01:23
2006.04.16
Серверная обработка...


2-1144224144
EXILE
2006-04-05 12:02
2006.04.16
Файл базы данных Access


4-1138792357
bvn123
2006-02-01 14:12
2006.04.16
Как написать обработчик события, созданного с пом. CreateEvent


5-1129233940
auz
2005-10-14 00:05
2006.04.16
Когда вызывается TCustomControl.Paint если компонент из *.dfm





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский