Как избавиться от торможения модальных окон?
Igor Nikolaev aKa The Spriteсоветует:
Hемодальные диалоговые окна, находящиеся на экране во время выполнения длительных операций,могут реагировать на действия пользователя очень медленно. Это ограничение Windows, и обойти его можно так:
whileFlag do begin
PerformOperation;
Application.ProcessMessages;
Flag:=ContinueOperation;
end;
Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать?
Nomadicотвечает:
A: Application.ProcessMessages.
(AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе.
(Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield().
По моему глубокому убеждению для получения метки диска в среде Win95 необходимо использовать FindFile. Но это не работает, так?
Правильно, FindFile в Win32 больше не возвращает имя диска, поскольку в не-FAT файловых системах (например, в NTFS) это работает иначе, чем в FAT. Вместо этого используйте функцию API GetVolumeInformation.
– Peter Below
Восстанавление длинных имен файлов по известным коротким
borisсоветует:
//---------------------------------------------------------------------
// Восстанавливает длинные имена файлов по известным коротким (8.3)
// В качестве аргумента принимает полный или неполный (в т.ч. относительный)
// путь к файлу, например 'C:\WINDOWS\РАБОЧИ~1\ИТАКДА~1.LNK' или
// '..\..\COMMON~1\BORLAN~1\BDE\BDEREA~1.TXT'. Понимает сетевые имена.
// Возвращает полный(!) путь типа 'C:\Windows\Рабочий стол\и так далее.lnk',
// 'C:\Program Files\Common Files\Borland Shared\BDE\bdereadme.txt',
// '\\Computer\resource\Folder with long name\File with long name.ext'
//---------------------------------------------------------------------
FunctionRestoreLongName(fn: string): string;
functionLookupLongName( constfilename: string): string;
varsr: TSearchRec;
begin
ifFindFirst(filename, faAnyFile, sr)=0 thenResult:=sr.Name
elseResult:=ExtractFileName(filename);
SysUtils.FindClose(sr);
end;
functionGetNextFN: string;
vari: integer;
begin
Result:='';
ifPos('\\', fn)=1 then begin
Result:='\\';
fn:=Copy(fn, 3, length(fn)-2);
i:=Pos('\', fn);
ifi<>0 then begin
Result:=Result+Copy(fn,1,i);
fn:=Copy(fn, i+1, length(fn)-i);
end;
end;
i:=Pos('\', fn);
ifi<>0 then begin
Result:=Result+Copy(fn,1,i-1);
fn:=Copy(fn, i+1, length(fn)-i);
end else begin
Result:=Result+fn;
fn:='';
end;
end;
Varname: string;
Begin
fn:=ExpandFileName(fn);
Result:=GetNextFN;
Repeat
name:=GetNextFN;
Result:=Result+'\'+LookupLongName(Result+'\'+name);
Untillength(fn)=0;
End;
Как указать системе на необходимость сбросить буфера *.INI-файла на диск?
Nomadicсоветует:
procedureFlushIni(FileName: string);
var
{$IFDEF WIN32}
CFileName: array[0..MAX_PATH] ofWideChar;
{$ELSE}
CFileName: array[0..127] ofChar;
{$ENDIF}
begin
{$IFDEF WIN32}
if(Win32Platform = VER_PLATFORM_WIN32_NT) then begin
WritePrivateProfileStringW( nil, nil, nil, StringToWideChar(FileName, CFileName, MAX_PATH));
end else begin
WritePrivateProfileString( nil, nil, nil, PChar(FileName));
end;
{$ELSE}
WritePrivateProfileString( nil, nil, nil, StrPLCopy(CFileName, FileName, SizeOf(CFileName) – 1));
{$ENDIF}
end;
Nomadicсоветует:
Можно так:
procedureCopyFile( constFileName, DestName: TFileName);
var
CopyBuffer: Pointer; { buffer for copying }
TimeStamp, BytesCopied: Longint;
Source, Dest: Integer; { handles }
Destination: TFileName; { holder for expanded destination name }
const
ChunkSize: Longint = 8192; { copy in 8K chunks }
begin
Destination := ExpandFileName(DestName); { expand the destination path }
ifHasAttr(Destination, faDirectory) then{ if destination is a directory... }
Destination := Destination + '\' + ExtractFileName(FileName); { ...clone file name }
Читать дальше