Форум: "Начинающим";
Текущий архив: 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.037 c