From f04d64869f3b1de54fb343f28f955584780001b8 Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Sat, 26 Nov 2011 15:41:10 +0000 Subject: Project folders rename part 3 git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@215 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- importtxt/ImportThrd.pas | 599 ----------------------------------------------- 1 file changed, 599 deletions(-) delete mode 100644 importtxt/ImportThrd.pas (limited to 'importtxt/ImportThrd.pas') diff --git a/importtxt/ImportThrd.pas b/importtxt/ImportThrd.pas deleted file mode 100644 index 4da1eae..0000000 --- a/importtxt/ImportThrd.pas +++ /dev/null @@ -1,599 +0,0 @@ -unit ImportThrd; - -interface - -uses - Classes, - Windows, - SysUtils, - StrUtils, - PerlRegEx, - m_api, - general, - ImportT, - ImportTU, - KOLEdb - ; - - - -const ITXT_THREAD_BASE = $8000+$2000;//WM_APP + $2000 - ITXT_THREAD_START = ITXT_THREAD_BASE+1; //Поток запустился (0,0) - ITXT_THREAD_MAXPROGRESS = ITXT_THREAD_BASE+2; // Мах прогресс (0, MaxProgress) - ITXT_THREAD_PROGRESS = ITXT_THREAD_BASE+3; //Прогресс (Current, 0) - ITXT_THREAD_ERROR = ITXT_THREAD_BASE+4; //Возникла ошибка (PWideChar(ErrorString),0) - ITXT_THREAD_FINISH = ITXT_THREAD_BASE+5; //Завершение файла, подведение результатов (Added, Duplicates) - ITXT_THREAD_START_FILE = ITXT_THREAD_BASE+6; //Начали работать с файлом(PWideChar(FileName),0); - ITXT_THREAD_DEST_CONTACT = ITXT_THREAD_BASE+7; //Определили контакт (hContact,0) - ITXT_THREAD_ALLSTARTED = ITXT_THREAD_BASE+8; //Началось - ITXT_THREAD_ALLFINISHED = ITXT_THREAD_BASE+9; //Всё закончено :) - -type - TSendMethod = (smSend,smPost); - -type - TImportThrd = class(TThread) - private - { Private declarations } - RegExpr:TPerlRegEx; - hMapedFile:THandle; - hFile:THandle; - pFileText:Pointer; - FolderName:WideString; - FileName:WideString; - FileLen:Cardinal; - fContact:TDestContact; //Contact recognised by filename - AddedMessages: integer; - Duplicates: integer; - function DoMessage(Message: Longword; wParam: WPARAM; lParam: LPARAM; Method: TSendMethod = smSend): Boolean; - function DoMapFile:boolean; - procedure DoUnMapFile; - Procedure PreMessageSP(var src:string; CSP:integer); - procedure AddMsgToDB(hContact:Thandle; Direction:integer; MsgTimeStamp:LongWord; const Text: string; - var AddMsg,Dupy:integer); - procedure TextImportProcedure; - procedure BinImportProcedure; - protected - procedure Execute; override; - public - FileNames:WideString; //File Names - OffsetFileName:integer; //offset name of file in FileNames - WorkPattern:RTxtPattern; // Pattern for work - DContact:TDestContact; //Recognised or defined contact - Destination:TDestProto; // destination protocol - ParentHWND:LongWord; //HWND of parent window - end; - - -function IsDuplicateEvent(hContact:THandle; dbei:TDBEVENTINFO):boolean; - -function PassMessage(Handle: THandle; Message: LongWord; wParam: WPARAM; lParam: LPARAM; Method: TSendMethod = smSend): Boolean; - - -implementation - - -// Returns TRUE if event already is in base -function IsDuplicateEvent(hContact:THandle; dbei:TDBEVENTINFO):boolean; -var - hExistingDbEvent:THandle; - dbeiExisting:TDBEVENTINFO; - dwFirstEventTimeStamp:LongWord; - dwLastEventTimeStamp:LongWord; - dwPreviousTimeStamp:LongWord; -begin - result:=FALSE; - if not CheckForDuplicates then exit; - hExistingDbEvent:=pluginLink^.CallService(MS_DB_EVENT_FINDFIRST, hContact, 0); - if hExistingDbEvent=0 then begin Result:=False; exit; end; - - FillChar(dbeiExisting, SizeOf(dbeiExisting), Byte(0)); - dbeiExisting.cbSize:= sizeof(dbeiExisting); - dbeiExisting.cbBlob:= 0; - pluginLink^.CallService(MS_DB_EVENT_GET, wParam(hExistingDbEvent), lParam(@dbeiExisting)); - dwFirstEventTimeStamp:=dbeiExisting.timestamp; - - hExistingDbEvent:=pluginLink^.CallService(MS_DB_EVENT_FINDLAST, wParam(hContact), lParam(0)); - if hExistingDbEvent=0 then begin Result:=False; exit; end; - - FillChar(dbeiExisting, SizeOf(dbeiExisting), Byte(0)); - dbeiExisting.cbSize:= sizeof(dbeiExisting); - dbeiExisting.cbBlob:= 0; - pluginLink^.CallService(MS_DB_EVENT_GET, wParam(hExistingDbEvent), lParam(@dbeiExisting)); - dwLastEventTimeStamp:=dbeiExisting.timestamp; - - // If before the first - if (dbei.timestamp < dwFirstEventTimeStamp) then begin Result:=False; exit; end; - - // If after the last - if (dbei.timestamp > dwLastEventTimeStamp) then begin Result:=False; exit; end; - - dwPreviousTimeStamp:=dwLastEventTimeStamp; - - if (dbei.timestamp <= dwPreviousTimeStamp) then // search from the end - begin - while (hExistingDbEvent <> 0) do - begin - FillChar(dbeiExisting, SizeOf(dbeiExisting), Byte(0)); - dbeiExisting.cbSize:= sizeof(dbeiExisting); - dbeiExisting.cbBlob:= 0; - pluginLink^.CallService(MS_DB_EVENT_GET, wParam(hExistingDbEvent), lParam(@dbeiExisting)); - // compare event - if ( dbei.timestamp = dbeiExisting.timestamp ) and - ( (dbei.flags) = (dbeiExisting.flags and not DBEF_FIRST)) and //fix for first event - (dbei.eventType = dbeiExisting.eventType) and - (dbei.cbBlob = dbeiExisting.cbBlob) then begin Result:=true; exit; end; - - if (dbei.timestamp > dbeiExisting.timestamp) then begin Result:=False; exit; end; - // get the previous - hExistingDbEvent:=pluginLink^.CallService(MS_DB_EVENT_FINDPREV, wParam(hExistingDbEvent), 0); - end; - end; -end; - - -Procedure TImportThrd.PreMessageSP(var src:string; CSP:integer); -var i:integer; - ls:integer; - PSP,ASP:integer; -begin - ls:=-1; - repeat - i:=ls+2; - PSP:=0; - while (src[i+PSP]=' ') do inc(PSP); - if PSP>0 then - case WorkPattern.PreMsg.PreSP of - 0: PSP:=0; - -1: ; - -2: if PSP>CSP then PSP:=CSP; - else if PSP>WorkPattern.PreMsg.PreSP then PSP:=WorkPattern.PreMsg.PreSP; - end; //case - Delete(src,i,PSP); - ls:=PosEx(#$0D#$0A,src,i); - ASP:=0; - while (ls>1) and (src[ls-ASP-1]=' ') do inc(ASP); - if ASP>0 then - case WorkPattern.PreMsg.AfterSP of - 0: ASP:=0; - -1: ; - -2: if ASP>CSP then ASP:=CSP; - else if ASP>WorkPattern.PreMsg.AfterSP then ASP:=WorkPattern.PreMsg.AfterSP; - end; //case - Delete(src,ls-ASP-1,ASP); - Until ls<=0 -end; - -Procedure TImportThrd.AddMsgToDB(hContact:Thandle; Direction:integer;MsgTimeStamp:LongWord; const Text: string; - var AddMsg,Dupy:integer); -var dbei:TDBEVENTINFO; - proto:string; - s:WideString; -begin - FillChar(dbei, SizeOf(dbei), Byte(0)); - dbei.cbSize:= sizeof(dbei); - dbei.eventType:= EVENTTYPE_MESSAGE; - dbei.flags:=direction; - proto:=GetContactProto(hContact); - dbei.szModule:= PAnsiChar(proto); - dbei.timestamp:=MsgTimeStamp; - dbei.cbBlob:=Length(Text)+1; - dbei.pBlob:=PByte(AllocMem(dbei.cbBlob)); - try - Move(Text[1],dbei.pBlob^,dbei.cbBlob); - if not IsDuplicateEvent(hContact,dbei) then - if pluginLink^.CallService(MS_DB_EVENT_ADD, wParam(hContact), lParam(@dbei))<>0 then Inc(AddMsg) - else begin - s:= 'Error adding message to DB'; - DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0); end - - else - begin - if ShowDuplicates then - begin - if (dbei.flags and DBEF_SENT)>0 then s:='>' - else s:='<'; - s:=TranslateWideString('Duplicate:')+' '+s+' '+TimeStampToWStr(dbei.timestamp); - DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0,smSend); - end; - Inc(Dupy); - end; - finally - FreeMem(dbei.pBlob); - end; -end; - -function PassMessage(Handle: THandle; Message: LongWord; wParam: WPARAM; lParam: LPARAM; Method: TSendMethod = smSend): Boolean; -var - Tries: integer; -begin - Result := True; - case Method of - smSend: SendMessage(Handle,Message,wParam,lParam); - smPost: begin - Tries := 5; - while (Tries > 0) and not PostMessage(Handle,Message,wParam,lParam) do begin - Dec(Tries); - Sleep(5); - end; - Result := (Tries > 0); - end; - end; -end; - -function TImportThrd.DoMessage(Message: LongWord; wParam: WPARAM; lParam: LPARAM; Method: TSendMethod = smSend): Boolean; -begin - Result := PassMessage(ParentHWND,Message,wParam,lParam,Method); -end; - -function TImportThrd.DoMapFile:boolean; -var s:WideString; -begin - result:=true; - hFile:=CreateFileW(PWideChar(FileName),GENERIC_READ,0,nil,OPEN_EXISTING,0,0); - if hFile=INVALID_HANDLE_VALUE then - begin - result:=false; - s:='Error opening file'; - DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0); - exit; - end; - FileLen:=GetFileSize(hFile,nil); - hMapedFile:=CreateFileMapping(hFile,nil,PAGE_READONLY,0,0,'ImportTXTmapfile'); - if hMapedFile=0 then - begin - result:=false; - s:= 'Error mapping file'; - DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0); - exit; - end; - pFileText:=MapViewOfFile(hMapedFile,FILE_MAP_READ,0,0,0); - if pFileText=nil then - begin - result:=false; - s:='Error mapping'; - DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0); - exit; - end; -end; - -procedure TImportThrd.DoUnMapFile; -begin - UnmapViewOfFile(pFileText); - pFileText:=nil; - CloseHandle(hMapedFile); - CloseHandle(hFile); -end; - -procedure TryDetermContact(var dContact:TDestContact); -begin - if dContact.ProtoName<>'' then - begin - if dContact.ContactUID<>'' then - begin - dContact.hContact:=GetContactByUID(dContact.ProtoName,dContact.ContactUID) - end - else - if dContact.ContactNick<>'' then - begin - dContact.hContact:=GetContactByNick(dContact.ProtoName,dContact.ContactNick); - end - else - dContact.hContact:=INVALID_HANDLE_VALUE; - end - else - dContact.hContact:=INVALID_HANDLE_VALUE; -end; - -procedure TImportThrd.TextImportProcedure; -var - PosCur,LenCur,PosNext:integer; - TextLength, - h1,h2:integer; - PRN,ARN,j:DWORD; - msg_flag:integer; - DT:LongWord; - TxtMsg:string; - s:WideString; - tempstr:PChar; - tempwstr:PWideChar; -begin - AddedMessages:=0; - Duplicates:=0; - Case WorkPattern.Charset of - inANSI:if IsMirandaUnicode then - begin - if WorkPattern.Codepage<>0 then tempstr:=ANSIToUTF8(PAnsiChar(pFileText),tempstr,WorkPattern.Codepage) - else tempstr:=ANSIToUTF8(PAnsiChar(pFileText),tempstr,cp); - RegExpr.Subject:=tempstr; - FreeMem(tempstr); - end - else RegExpr.Subject:=PAnsiChar(pFileText); - inUTF8:if IsMirandaUnicode then RegExpr.Subject:=PChar(pFileText)+3 - else - begin - tempstr:=UTF8ToANSI(PChar(pFileText)+3,tempstr,cp); - RegExpr.Subject:=tempstr; - FreeMem(tempstr); - end; - inUCS2:begin - GetMem(tempwstr,FileLen+2); - lstrcpynW(tempwstr,PWideChar(pFileText),FileLen); - tempwstr[FileLen div SizeOf(WideChar)]:=#$0000; //file is not ended dy #0000 - if IsMirandaUnicode then tempstr:=WidetoUTF8(ChangeUnicode(tempwstr),tempstr) - else tempstr:=WideToANSI(ChangeUnicode(tempwstr),tempstr,cp); - RegExpr.Subject:=tempstr; - FreeMem(tempstr); - FreeMem(tempwstr); - end; - end; //case - if (WorkPattern.UseHeader and 1)=0 then //If the information on a direction is not present that we will transform a line - begin - if IsMirandaUnicode then - begin - tempstr:=ANSIToUTF8(PAnsiChar(WorkPattern.Msg.Incoming),tempstr,cp); - WorkPattern.Msg.Incoming:=tempstr; - FreeMem(tempstr); - tempstr:=ANSIToUTF8(PAnsiChar(WorkPattern.Msg.Outgoing),tempstr,cp); - WorkPattern.Msg.Outgoing:=tempstr; - FreeMem(tempstr); - end - end; - if (WorkPattern.UseHeader>0) then - begin - if IsMirandaUnicode then - begin - tempstr:=ANSIToUTF8(PAnsiChar(WorkPattern.Header.Pattern),tempstr,cp); - RegExpr.RegEx:=tempstr; - RegExpr.Options:=[preMultiLine, preUTF8]; - FreeMem(tempstr); - end - else - begin - RegExpr.RegEx:=WorkPattern.Header.Pattern; - RegExpr.Options:=[preMultiLine]; - end; - if not RegExpr.Match then - begin - s:=TranslateWideString('Header not found'); - DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0); - exit; - end - else - begin - if (WorkPattern.UseHeader and 1)=1 then - begin - WorkPattern.Msg.Incoming:=RegExpr.SubExpressions[WorkPattern.Header.Incoming]; - WorkPattern.Msg.Outgoing:=RegExpr.SubExpressions[WorkPattern.Header.Outgoing]; - end; - if (WorkPattern.UseHeader and 2)=2 then - if (DContact.hContact=0) or (DContact.hContact=INVALID_HANDLE_VALUE) then - begin - if WorkPattern.Header.InUID<>0 then DContact.ContactUID:=RegExpr.SubExpressions[WorkPattern.Header.InUID] - else DContact.ContactUID:=''; - if WorkPattern.Header.InNick<>0 then DContact.ContactNick:=RegExpr.SubExpressions[WorkPattern.Header.InNick] - else DContact.ContactNick:=''; - TryDetermContact(DContact); - end; - end; - end; - //Whether if it has not turned out to define in header then we look it was defined in a file - if (DContact.hContact=0) or (DContact.hContact=INVALID_HANDLE_VALUE) then - if (fContact.hContact<>0) and (fContact.hContact<>INVALID_HANDLE_VALUE) then - DContact:=fContact; - if (DContact.hContact<>0) and (DContact.hContact<>INVALID_HANDLE_VALUE) then - begin - DoMessage(ITXT_THREAD_DEST_CONTACT,DContact.hContact,0); - DoMessage(ITXT_THREAD_START,0,0); - if IsMirandaUnicode then - begin - tempstr:=ANSIToUTF8(PAnsiChar(WorkPattern.Msg.Pattern),tempstr,cp); - RegExpr.RegEx:=tempstr; - RegExpr.Options:=[preMultiLine, preUTF8]; - FreeMem(tempstr); - end - else - begin - RegExpr.RegEx:=WorkPattern.Msg.Pattern; - RegExpr.Options:=[preMultiLine]; - end; - - TextLength:=Length(RegExpr.Subject)-1; //Position of last symbol - DoMessage(ITXT_THREAD_MAXPROGRESS,0,TextLength); - RegExpr.State:=[preNotEmpty]; - //search for regular expression - if not RegExpr.Match then - begin - s:=TranslateWideString('No messages in this file'); - DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0); - end - else - begin - PosCur:=RegExpr.MatchedExpressionOffset; //get the position of RegExpression - repeat - LenCur:=RegExpr.MatchedExpressionLength; //get the length of RegExpression - //Further we define a message direction (incoming or outgoing) - if RegExpr.SubExpressions[WorkPattern.Msg.Direction]=WorkPattern.Msg.Incoming then msg_flag:=DBEF_READ - else msg_flag:=DBEF_READ or DBEF_SENT; - if IsMirandaUnicode then msg_flag:=msg_flag or DBEF_UTF; - //make timestamp - if WorkPattern.Msg.Seconds<>0 then - DT:=TimeStamp( - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Year]), - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Month]), - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Day]), - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Hours]), - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Minutes]), - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Seconds]) - ) else - DT:=TimeStamp( - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Year]), - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Month]), - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Day]), - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Hours]), - StrToInt(RegExpr.SubExpressions[WorkPattern.Msg.Minutes]), - 0 - ); - - if RegExpr.MatchAgain then PosNext:=RegExpr.MatchedExpressionOffset //search for next regexpr - else PosNext:=TextLength; // if not then end of file - h1:=PosCur+LenCur; //The message text beginning presumably - h2:=PosNext-PosCur-LenCur-2; //its presumably message length - //working with message text - if WorkPattern.UsePreMsg then PRN:=DWORD(WorkPattern.PreMsg.PreRN) - else PRN:=DWORD(-1); - if PRN<>0 then - begin - j:=1; - while ((RegExpr.Subject[h1]=Char($0D))and - (RegExpr.Subject[h1+1]=Char($0A))) and - (j<=PRN) - do begin inc(h1,2); dec(h2,2); inc(j); end; //remove carriage return in the beginning - end; - if WorkPattern.UsePreMsg then ARN:=DWORD(WorkPattern.PreMsg.AfterRN) - else ARN:=DWORD(-1); - if ARN<>0 then - begin - j:=1; - while ((RegExpr.Subject[h1+h2]=Char($0D))and - (RegExpr.Subject[h1+h2+1]=Char($0A))) and - (j<=ARN) - do begin dec(h2,2); inc(j) end; //remove carriage return in the end - end; - //get the message text - TxtMsg:=Copy(RegExpr.Subject,h1,h2+2); - //remove spaces if needs - if WorkPattern.UsePreMsg and ((WorkPattern.PreMsg.PreSP<>0) or (WorkPattern.PreMsg.AfterSP<>0)) then - if IsMirandaUnicode then PreMessageSP(TxtMsg,UTF8Len(PChar(RegExpr.MatchedExpression))) - else PreMessageSP(TxtMsg,LenCur); - AddMsgToDB(DContact.hContact,msg_flag,DT,TxtMsg,AddedMessages,Duplicates); //adding in base - PosCur:=PosNext; - DoMessage(ITXT_THREAD_PROGRESS,PosCur,0); - until (PosNext = TextLength) or Terminated ; - end; //RegExpr.Exec - end - else - begin - s:=TranslateWideString('Can''t determine destination contact'); - DoMessage(ITXT_THREAD_ERROR,integer(PWideChar(s)),0); - end; -end; - -procedure TImportThrd.BinImportProcedure; -var i:integer; - s:WideString; - tempstr:PChar; -var dbei:TDBEVENTINFO; - proto:string; - pt:integer; - fsz:integer; - -{$define BIN_IMPORT_} -{$i BmContactIP.inc} -{$i BqhfIP.inc} -{$i BICQ6IP.inc} -{$i BICQ5IP.inc} -{$i BRMSIP.inc} -{$i BbayanIP.inc} -{$undef BIN_IMPORT_} -begin - AddedMessages:=0; - Duplicates:=0; - case WorkPattern.BinProc of - 1: //mContactImport - {$i BmContactIP.inc} - 2: //QHF - {$i BqhfIP.inc} - 3: //ICQ6 - {$i BICQ6IP.inc} - 4: //ICQ5 - {$i BICQ5IP.inc} - 5: //Nokia midp-rms - {$i BRMSIP.inc} - 6: //BayanICQ - {$i BbayanIP.inc} - - end; -end; - -procedure TImportThrd.Execute; -var - i:integer; - s1:WideString; - tempstr:PChar; -begin - DoMessage(ITXT_THREAD_ALLSTARTED,0,0); - FolderName:=Copy(FileNames,1,OffsetFileName-1); - i:=OffsetFileName; - while (FileNames[i+1]<>#0)and not Terminated do - begin //начало цикла по файлам - s1:=''; - Inc(i); - while FileNames[i]<>#0 do - begin s1:=s1+FileNames[i]; inc(i); end; - if (s1<>'') and (s1<>#0) then - begin //Начинаем работать с файлом - FileName:=FolderName+'\'+s1; - DoMessage(ITXT_THREAD_START_FILE,Integer(PWideChar(FileName)),0,smSend); - pFileText:=nil; - hFile:=INVALID_HANDLE_VALUE; - DContact.ProtoName:=Destination.ProtoName; - fContact.hContact:=INVALID_HANDLE_VALUE; - RegExpr:=TPerlRegEx.Create; //Создаём объект для работы с рег. выражениями - try - //Поработаем с именем файла - if WorkPattern.UseFileName then - if (DContact.hContact=0) or (DContact.hContact=INVALID_HANDLE_VALUE) then - begin - if IsMirandaUnicode then - begin - tempstr:=WideToUTF8(PWideChar(FileName),tempstr); - RegExpr.Subject:=tempstr; - FreeMem(tempstr); - tempstr:=ANSIToUTF8(PAnsiChar(WorkPattern.FName.Pattern),tempstr,cp); - RegExpr.RegEx:=tempstr; - FreeMem(tempstr); - RegExpr.Options:=[preUTF8]; - end - else - begin - RegExpr.Subject:=FileName; - RegExpr.RegEx:=WorkPattern.FName.Pattern; - RegExpr.Options:=[]; - end; - if RegExpr.Match then - begin - fContact.ProtoName:=Destination.ProtoName; - if WorkPattern.FName.InUID<>0 then fContact.ContactUID:=RegExpr.SubExpressions[WorkPattern.FName.InUID] - else fContact.ContactUID:=''; - if WorkPattern.FName.InNick<>0 then fContact.ContactNick:=RegExpr.SubExpressions[WorkPattern.FName.InNick] - else fContact.ContactNick:=''; - TryDetermContact(fContact); - end; - end; - - //Загружаем сам файл - // [preMultiLine] модификатор для восприятия многострочного текста - if DoMapFile then //Загружаем файл - begin - pluginLink^.CallService(MS_DB_SETSAFETYMODE, wParam(false), 0); - case WorkPattern.IType of - 1:TextImportProcedure; - 2:BinImportProcedure; - end; //case - end; //DoMapFile - finally - pluginLink^.CallService(MS_DB_SETSAFETYMODE, wParam(true), 0); - DoMessage(ITXT_THREAD_FINISH,AddedMessages,Duplicates); - DoUnMapFile; - RegExpr.Free; - end; - DContact.hContact:=INVALID_HANDLE_VALUE; - Sleep(10); //чтобы все сообщения дошли до окна - end; //закончили работать с файлом - end; //цикла по файлам - DoMessage(ITXT_THREAD_ALLFINISHED,0,0); -end; - -end. - \ No newline at end of file -- cgit v1.2.3