VR
Virtual Reality On-line   Hack-FAQ
Новости   |     Журнал    |    Хаkер   |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]
[ Download  ]
[  Конкурс  ]
[  Анекдоты ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
???: Как определить размер файла?

Для этого есть три способа. Первый - открыть файл и перейти в конец. Переход по файлу возвращает текущую позицию, а раз текущая позиция это конец, то это и будет размер:

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.
???: Как мне узнать полный путь к запущенной мной программе?

Имя запущенной проги храниться в Application.ExeName. Чтобы вытащить путь нужно использовать функцию ExtractFilePath. Вот пример:

Str:=ExtractFilePath (Application.ExeName);

После этого, в переменной Str будет путь к твоей проге.


???: Как программно эмулировать нажатие на кнопку?

Для этого нужно послать сообщение Windows. Это можно сделать так:

ТButton1.Perform(WM_LBUTTONDOWN, 0, 0);

Эта строка посылает сообщение, что нажата левая кнопка мышки у ТButton1. Для правой кнопки мышки, первый параметр изменится на WM_RBUTTONDOWN. Если захочешь послать событие о поднятии кнопки, то первый параметр меняется на WM_LBUTTONUP или WM_RBUTTONUP для левой и правой кнопки соответственно.


???: Как проигрывать AVI, MOV, MPEG файлы?

Если у тебя установлены соответствующие кодеки в системе (AVI и MOV ставятся почти всегда), то нет проблем. Для этого нужно использовать компонент ТMediaPlayer. Он очень прост и никаких проблем с ним не возникнет. Вот тебе небольшой пример, как всё выполняется программно. В примере используется два компонента МediaPlayer1 nbgf TМediaPlayer и Panel1 типа TPanel: MediaPlayer1.Filename := 'C:\filename.avi'; MediaPlayer1.Open; MediaPlayer1.Display := Panel1; MediaPlayer1.DisplayRect := Panel1.ClientRect; MediaPlayer1.Play;


???: Как узнать версию Windows с которой я сейчас работаю?

Для этого есть API функция GetVersionEx. Вот пример её использования:

var
 os : TOSVERSIONINFO;
begin
  GetVersionEx(os);
  if os.dwPlatformId = VER_PLATFORM_WIN32s then 
     ShowMessage('Это Win32 для Windows 3.1');
  if os.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then 
     ShowMessage('Это Win9x');
  if os.dwPlatformId = VER_PLATFORM_WIN32_NT then 
     ShowMessage('Это NT');
end;

???: В каком порядке обрабатываются события при запуске проги?

OnCreate, OnShow, OnPaint, OnActivate, OnResize, OnPaint


???: Как закрыть помощь, когда закрывается приложение?

Всё очень даже просто:

procedure TMainForm.FormClose(Sender: TObject; 
          var Action: TCloseAction);
begin
  Winhelp(Handle, 'WINHELP.HLP', HELP_QUIT, 0);
end;

???: Как отключить обработку исключительных ситуаций?

Для этого есть ключ {$I-}. Чтобы снова включить её воспользуйся {$I+}. Например код рассмотренный в предыдущем примере:

procedure TMainForm.FormClose(Sender: TObject; 
          var Action: TCloseAction);
begin
{$I-}
  Winhelp(Handle, 'WINHELP.HLP', HELP_QUIT, 0);
{$I+}
end;

Если во время закрытия помощи произойдёт ошибка, то она не обработается.


???: Почему в MDI приложении, когда я пытаюсь закрыть дочернее окно, оно просто сворачивается? А я хочу, чтобы оно закрывалось

Для этого тебе нужно обрабатывать событие OnClose у этой дочерней формы. По этому событию тебе передаётся параметр Action. По умолчанию он равен caNone, что и не позволяет закрыть окно. Просто присвой этому параметру значение caFree и окно уничтожиться.

procedure TMainForm.FormClose(Sender: TObject; 
          var Action: TCloseAction);
begin
 Action:=caFree;
end;

???: А можно программно изменять раскладку клавиатуры?

Я всегда говорил, что возможно всё, вопрос только во времени. В твоём случае много времени не надо. Воспользуйся функцией WinAPI ActivateKeyboardLayout. У функции два параметра. Первый - константа и может быть HKL_NEXT или HKL_PREV, выбрать следующую или предыдущую раскладку клавиатуры. Второй параметр - флаг, который может быть KLF_REORDER. Для NT флаг может принимать ещё значение KLF_UNLOADPREVIOUS.


???: Как спрятать приложение, чтобы его не было видно в панеле задач?

Я всегда говорил, что возможно всё, вопрос только во времени. В твоём случае много времени не надо. Воспользуйся функцией WinAPI ActivateKeyboardLayout. У функции два параметра. Первый - константа и может быть HKL_NEXT или HKL_PREV, выбрать следующую или предыдущую раскладку клавиатуры. Второй параметр - флаг, который может быть KLF_REORDER. Для NT флаг может принимать ещё значение KLF_UNLOADPREVIOUS.


???: Как мне ограничить движение курсора определённой областью экрана?

Для этого есть функция ClipCursor. В качестве параметра нужно передать структуру Trect, которая будет указывать область движения курсора. Например: ClipCursor(Rect(10,10,100,100));


???: Как узнать ширину и высоту экрана?

Ширина: Screen.Width

Высота: Screen.Height

Эти значения можно только читать. Изменить ты их не сможешь.


???: Как добавить ссылку на программу в меню "Документы" из системного "Пуска"?

Для этого есть функция SHAddToRecentDocs. Для неё нужно два параметра: первый поставь SHARD_PATH, а второй - полный путь к твоей проги. Только не забудь добавить в uses ShlOBJ.Если ты первым параметром передашь SHARD_PIDL, то в качестве второго нужно будет пересылать не путь к твоему файлу, а идентификатор файла (PIDL).

Держи пример: SHAddToRecentDocs( SHARD_PATH, PChar('C:\filename.txt') )


???: Как заставить мышку самостоятельно бегать?

Поставь на форму таймер и по его событию напиши:

var
        p : TPoint;
begin
 GetCursorPos(p);
 If p.x>=Screen.Width then 
    p.x:=0
 If p.y>=Screen.Height then 
    p.y:=0
 SetCursorPos(p.x + 4, p.y + 2);
End;

???: Как получить короткий путь файла если имеется длинный?

Для этого уже давно существует функция GetShortPathName. Она имеет три параметра:

  • длинный путь (тип Pchar)
  • короткий путь, суда запишется результат (тип Pchar)
  • длинна буфера указанного во втором параметре (тип Integer).

???: Как можно скопировать файлы с помощью стандартных средств?

Для этого есть специальная функция 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;

???: Можно узнать удерживаться ли сейчас Shift?

Мона, всё мона:

 GetKeyboardState(State);
 if ((State[vk_Shift] and 128) <> 0) then
  Shift нажат
 else
  Не нажат;  

Copyright©: Horrific aka Флёнов Михаил
Design by FMk group©