???: Как определить размер файла?
Для этого есть три способа. Первый - открыть файл и перейти в конец. Переход по файлу возвращает текущую позицию, а раз текущая позиция это конец, то это и будет размер:
var
f:HFILE;
FileSize:Integer;
begin
// Открываем файл только для чтения (этого достаточно)
f:=_lopen(PChar(FileName), OF_READ);
// Получаем размер файла
FileSize :=_lseek(f,0, FILE_END);
//Закрываем файл
_lclose(f);
end;
Второй способ - через поиск, который так же возвращает размер.
var
SearchRec:TSearchRec;
Begin
// Ищем файл
if FindFirst(ExpandFileName(FileName),faAnyFile,SearchRec)=0
// Забираем размер
FilrSize:=SearchRec.Size
//Закрываем поиск
FindClose(SearchRec);
end;
Третий способ - это получить размер файла напрямую через функцию GetFileSize.
function GetFileSize(
hFile: THandle;
lpFileSizeHigh: Pointer)
: DWORD; stdcall;
В качестве первого параметра будет указатель на файл, а второй - указатель на число DWORD, куда засунут старший байт размера файла. Не пугайся, старший байт тебе врятли понадобиться, очень редко встречаются файлы больше 2 гига. Поэтому можно смело использовать в качестве второго параметра nil.
???: Как программно эмулировать нажатие на кнопку?
Для этого нужно послать сообщение Windows. Это можно сделать так:
ТButton1.Perform(WM_LBUTTONDOWN, 0, 0);
Эта строка посылает сообщение, что нажата левая кнопка мышки у ТButton1. Для правой кнопки мышки, первый параметр изменится на WM_RBUTTONDOWN. Если захочешь послать событие о поднятии кнопки, то первый параметр меняется на WM_LBUTTONUP или WM_RBUTTONUP для левой и правой кнопки соответственно.
???: Как отключить обработку исключительных ситуаций?
Для этого есть ключ {$I-}. Чтобы снова включить её воспользуйся {$I+}. Например код рассмотренный в предыдущем примере:
procedure TMainForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
{$I-}
Winhelp(Handle, 'WINHELP.HLP', HELP_QUIT, 0);
{$I+}
end;
Если во время закрытия помощи произойдёт ошибка, то она не обработается.
???: Как добавить ссылку на программу в меню "Документы" из системного "Пуска"?
Для этого есть функция SHAddToRecentDocs. Для неё нужно два параметра: первый поставь SHARD_PATH, а второй - полный путь к твоей проги. Только не забудь добавить в uses ShlOBJ.Если ты первым параметром передашь SHARD_PIDL, то в качестве второго нужно будет пересылать не путь к твоему файлу, а идентификатор файла (PIDL).
Держи пример: SHAddToRecentDocs( SHARD_PATH, PChar('C:\filename.txt') )
???: Как можно скопировать файлы с помощью стандартных средств?
Для этого есть специальная функция ShFileOperation.
procedure TForm1.Copy1Click(Sender: TObject);
var
FSrc,FDes,FPath: string;
begin
FDes := '';
if not SelectDirectory('Select Directory', '', FDes) then exit;
FSrc:=DirectoryPath +#0;
DoSHFileOp(Handle, FileOpMode[0], FSrc, FDes, true);
end;
DirectoryPath – указывает на директорию, которую надо скопировать. Функция DoSHFileOp выглядит так:
function TForm1.DoSHFileOp(Handle: THandle; OpMode: UInt; Src,
Dest: string; DelRicleBin: Boolean): Boolean;
var
Ret: integer;
ipFileOp: TSHFileOpStruct;
begin
Screen.Cursor:=crAppStart;
FillChar(ipFileOp, SizeOf(ipFileOp), 0);
with ipFileOp do
begin
wnd := Handle;
wFunc := OpMode;
pFrom := pChar(Src);
pTo := pChar(Dest);
if DelRicleBin then
fFlags := FOF_ALLOWUNDO
else
fFlags := FOF_NOCONFIRMMKDIR;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := '';
end;
try
Ret := SHFileOperation(ipFileOp);
except
Ret := 1;
end;
result := (Ret = 0);
Screen.Cursor:=crDefault;
end;
FileOpMode – константа, которая выглядит как:
const
FileOpMode: array[0..3] of UInt =(FO_COPY, FO_DELETE, FO_MOVE, FO_RENAME);
Объявлять эту константу надо перед implementation. Например:
var
Form1: TForm1;
const
FileOpMode: array[0..3] of UInt =(FO_COPY, FO_DELETE, FO_MOVE, FO_RENAME);
implementation
{$R *.DFM}
С помощью этой функции можно копировать удалять директории вместе с подкаталогами. Только не забудь подключить в раздел USES модуль ShellApi.
???: Как с помощью CreateProcess сделать так, чтобы прога ждала завершения работы другой???
Легко:
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOW;
if not CreateProcess(nil,
zAppName, { указатель командной строки, путь к
проге + аргументы }
nil, { указатель на процесс атрибутов безопасности }
nil, { указатель на поток атрибутов безопасности }
false, { флаг родительского обработчика }
CREATE_NEW_CONSOLE or { флаг создания }
NORMAL_PRIORITY_CLASS,
nil, { указатель на новую среду процесса }
nil, { указатель на имя текущей директории }
StartupInfo, { указатель на STARTUPINFO }
ProcessInfo) { указатель на PROCESS_INF }
then Result := -1
else
begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;