vk_Insert = $2D;
vk_Delete = $2E;
vk_Help = $2F;
{ vk_A - vk_Z такие же, как и их ASCII-эквиваленты: 'A' - 'Z' }
{ vk_0 - vk_9 такие же, как и их ASCII-эквиваленты: '0' - '9' }
var
DirBytes : integer;
function TFileBrowser.DirSize(Dir:string):integer;
var
SearchRec : TSearchRec;
Separator : string;
begin
if Copy(Dir,Length(Dir),1)='\' then
Separator := ''elseSeparator := '\';
if FindFirst(Dir+Separator+'*.*',faAnyFile,SearchRec) = 0
then
begin
if FileExists(Dir+Separator+SearchRec.Name)
then
begin
DirBytes :=
DirBytes + SearchRec.Size;
{Memo1.Lines.Add(Dir+Separator+SearchRec.Name);}
end
else
if DirectoryExists(Dir+Separator+SearchRec.Name)
then
begin
if
(SearchRec.Name<>'.') and (SearchRec.Name<>'..') then
begin
DirSize(Dir+Separator+SearchRec.Name);
end;
end;
while FindNext(SearchRec) =
0 do
begin
if FileExists(Dir+Separator+SearchRec.Name)
then
begin
DirBytes
:= DirBytes + SearchRec.Size;
{Memo1.Lines.Add(Dir+Separator+SearchRec.Name);}
end
else
if
DirectoryExists(Dir+Separator+SearchRec.Name) then
begin
if
(SearchRec.Name<>'.') and (SearchRec.Name<>'..') then
begin DirSize(Dir+Separator+SearchRec.Name);
end;
end;
end;
end;
FindClose(SearchRec);
end;
function FontToStr(font: TFont): string;
procedure yes(var str:string);
begin
str := str + 'y';end;
procedure no(var str:string);
begin
str := str + 'n';end;
begin
{кодируем все атрибуты TFont в строку}Result := '';Result := Result + IntToStr(font.Color)
+ '|';Result := Result + IntToStr(font.Height) + '|';Result := Result +
font.Name + '|';Result := Result + IntToStr(Ord(font.Pitch)) + '|';Result
:= Result + IntToStr(font.PixelsPerInch) + '|';Result := Result + IntToStr(font.size)
+ '|';if fsBold in font.style then yes(Result) else no(Result);if fsItalic
in font.style then yes(Result) else no(Result);if fsUnderline in font.style
then yes(Result) else no(Result);if fsStrikeout in font.style then yes(Result)
else no(Result);end;
procedure StrToFont(str: string; font: TFont);
begin
if str = '' then Exit;font.Color := StrToInt(tok('|', str));font.Height
:= StrToInt(tok('|', str));font.Name := tok('|', str);font.Pitch := TFontPitch(StrToInt(tok('|',
str)));font.PixelsPerInch := StrToInt(tok('|', str));font.Size := StrToInt(tok('|',
str));font.Style := [];if str[0] = 'y' then font.Style := font.Style + [fsBold];if
str[1] = 'y' then font.Style := font.Style + [fsItalic];if str[2] = 'y'
then font.Style := font.Style + [fsUnderline];if str[3] = 'y' then font.Style
:= font.Style + [fsStrikeout];end;
function tok(sep: string; var s: string): string;
function isoneof(c, s: string): Boolean;variTmp: integer;beginResult
:= False;for iTmp := 1 to Length(s) dobeginif c = Copy(s,
iTmp, 1) thenbeginResult := True;Exit;end;end;end;var
c, t: string;begin
if s = '' thenbeginResult := s;Exit;end;c := Copy(s, 1, 1);while
isoneof(c, sep) dobegins := Copy(s, 2, Length(s) - 1);c := Copy(s,
1, 1);end;t := '';while (not isoneof(c, sep)) and (s <> '') dobegint
:= t + c;s := Copy(s, 2, length(s)-1);c := Copy(s, 1, 1);end;Result
:= t;end;
function DiskInDrive(const Drive: char): Boolean;
var
DrvNum: byte;
EMode: Word;
begin
result := true; // было false
DrvNum := ord(Drive);
if DrvNum >= ord('a') then dec(DrvNum,$20);
EMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try while DiskSize(DrvNum-$40) = -1 do begin // при неудаче выводимдиалог
if (Application.MessageBox('Диск не готов...'+chr(13)+chr(10)+'Повторить?',PChar('Диск
'+UpperCase(Drive)),mb_OKCANCEL+mb_iconexclamation{IconQuestion})=idcancel)
then beginResult:=false;Break;end;end;finally
SetErrorMode(EMode);
end;
end;
procedure WinToDos;
var Src, Str:PChar;//Src-строка для перевода Str-конечная
begin
Src := Memo1.Lines.GetText; //Берем текст из TMemo как тип PChar
CharToOem(Src, Str); //API функция для перевода текста
Memo2.Lines.Text := StrPas(Str);//Записываем назад
end;
procedure DosToWin;
var Src, Str:PChar;
begin
Src := Memo1.Lines.GetText; //Берем текст из TMemo как тип PChar
OemToChar(Src, Str);
//API функция для перевода текста
Memo2.Lines.Text := StrPas(Str);//Записываем назад
end;
В некоторых случаях (например, при работе в полноэкранном режиме, показе
своей презентации или экранной заставки ...) бывает полезно заблокировать
перечисленные комбинации клавиш. Они блокируются при работе системы
в режиме "экранная заставка" , который в свою очередь несложно включить
и выключить:
// Включение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
// Выключение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);
Кстати, SystemParametersInfo имеет еще кучу полезных ключей SPI_****,
подробности см. в win32.hlp
program wallpapr;
uses Registry, WinProcs;
procedure SetWallpaper(sWallpaperBMPPath:String;bTile:boolean);
var
reg : TRegIniFile;
begin
// Изменяем ключи реестра
// HKEY_CURRENT_USER
// Control Panel\Desktop
// TileWallpaper (REG_SZ)
// Wallpaper (REG_SZ)
reg := TRegIniFile.Create('Control Panel\Desktop' );
with reg do begin
WriteString( '', 'Wallpaper',
sWallpaperBMPPath );
if( bTile )then
begin
WriteString('', 'TileWallpaper', '1' );
end else begin
WriteString('', 'TileWallpaper', '0' );
end;
end;
reg.Free;
// Оповещаем всех о том, что мы изменили системные настройки
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Nil,
{Эта строка - продолжение предыдущей}SPIF_SENDWININICHANGE
);
end;
// пример установки WallPaper по центру рабочего стола
SetWallpaper('c:\winnt\winnt.bmp', False );
//Эту строчку надо написать где-то в программе.
var
R:TRegistry;
No:String;
begin
R:=TRegistry.Create;
R.RootKey:=HKEY_LOCAL_MACHINE;
R.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion', False) {если
false то пытается откpыть не создавая}
No:=R.ReadString('VersionNumber');
if No=..... then ...... else ......
end;
Кроме того, обязательно посмотрите на список функций WinAPI, имена
которых начинаются с Get.... Например, GetComputerName, GetVersionEx,
GetSystemInfo, SystemParametersInfo.
Процесс получения иконок из .EXE, .DLL или .ICO файлов полностью
идентичен.
Различие только в том, что в .ICO файле может храниться только одна
иконка, а в
.EXE и .DLL несколько. Для получения иконок из файлов, в модуле ShellAPI,
есть
функция:
function ExtractIcon(Inst: THandle; FileName: PChar; IconIndex: Word):
HIcon;
где
Inst - указатель на приложение вызвавшее функцию, FileName - имя файла
из которого необходимо получить иконку, IconIndex - номер необходимой
иконки.
Если функция возвращает значение не равное нулю, то в файле есть следующая
иконка.
В данном примере в компонент Image1 выводится иконка запущенного файла.
USES ShellAPI;
procedure TForm1.FormCreate(Sender: TObject);
VAR A: ARRAY [0..78] OF Char;
begin
{Получение имени запущенного файла}
StrPCopy(A, ParamStr(0));
{Вывод на экран нулевой иконки из файла}
Image1.Picture.Icon.Handle := ExtractIcon(HInstance, A, 0);
end;
//Use the registry to register your own filetype. uses registry;
procedure TForm1.RegisterFileType(prefix:String; exepfad:String);
var reg:TRegistry;
begin
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CLASSES_ROOT;
//create a new key --> .pci
reg.OpenKey('.'+prefix,True);
//create a new value for this key --> pcifile
reg.WriteString('',prefix+'file');
reg.CloseKey; //create a new key --> pcifile
reg.CreateKey(prefix+'file');
//create a new key pcifile\DefaultIcon
reg.OpenKey(prefix+'file\DefaultIcon',True);
//and create a value where the icon is stored --> c:\project1.exe,0
reg.WriteString('',exepfad+',0');
reg.CloseKey;
reg.OpenKey(prefix+'file\shell\open\command',True);
//create value where exefile is stored --> c:\project1.exe "%1"
reg.WriteString('',exepfad+' "%1"'); reg.CloseKey;
reg.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterFileType('pci','c:\project1.exe');
end;
Const
Base64Table='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
function Base64Decode(cStr:string):string;
var ResStr:string;
DecStr:string; RecodeLine : array [1..76] of byte; f1,f2 :
word; l:integer; begin l :=length(cStr); ResStr:=''; for f1:=1 to l do
if cStr[f1]='=' then RecodeLine[f1]:=0
else RecodeLine[f1]:=pos(cStr[f1],Base64Table)-1;
f1:=1;
while f1<length(cStr) do
begin
DecStr:=chr(byte(RecodeLine[f1] shl 2)+RecodeLine[f1+1]
shr 4)+
chr(byte(RecodeLine[f1+1] shl 4)+RecodeLine[f1+2] shr 2)+ chr(byte(RecodeLine[f1+2]
shl 6)+RecodeLine[f1+3]);
ResStr:=ResStr+DecStr;
inc(f1,4);
end;
Base64Decode:=ResStr;
end;
procedure TForm1.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
WITH Source AS TImage DO BEGIN Left := X; Top := Y; END; end;
procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); begin
Accept := Source IS TImage; end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WITH TImage.Create(Self) DO BEGIN Parent := Panel1; AutoSize := True;
Picture.LoadFromFile('...'); DragMode := dmAutomatic; OnDragOver := Panel1DragOver;
OnDragDrop := Panel1DragDrop; END; end;
procedure RotateRight(BitMap : tImage); var FirstC, LastC, c, r : integer;
procedure FixPixels(c,r : integer); var SavePix, SavePix2 : tColor;
i, NewC, NewR : integer; begin SavePix := Bitmap.Canvas.Pixels[c,r]; for
i := 1 to 4 do begin newc := BitMap.Height-r+1; newr := c; SavePix2 :=
BitMap.Canvas.Pixels[newc,newr]; Bitmap.Canvas.Pixels[newc,newr] := SavePix;
SavePix := SavePix2; c := Newc; r := NewR; end; end;
begin if BitMap.Width <> BitMap.Height then exit; BitMap.Visible
:= false; with Bitmap.Canvas do begin firstc := 0; lastc := BitMap.Width;
for r := 0 to BitMap.Height div 2 do begin for c := firstc to lastc do
begin FixPixels(c,r); end;inc(FirstC); Dec(LastC); end; end; BitMap.Visible
:= true; end;
Ниже приведен код, который поможет вам завершить ВСЕ задачи без всяких
уведомлений о необходимости сохранения данных.
Поэтому, прежде чем запустить этот код, убедитесь в наличии сохраненных
данных и в том, что пользователь осведомлен об этой операции.
procedure TForm1.ButtonKillAllClick(Sender: TObject);
var
pTask : PTaskEntry; Task : Bool; ThisTask:
THANDLE; begin
GetMem (pTask, SizeOf (TTaskEntry)); pTask^.dwSize := SizeOf (TTaskEntry);
Task := TaskFirst (pTask); while Task do begin if pTask^.hInst = hInstance
then ThisTask := pTask^.hTask else TerminateApp (pTask^.hTask, NO_UAE_BOX);
Task := TaskNext (pTask); end; TerminateApp (ThisTask, NO_UAE_BOX); end;
Использование анимированных курсоров
const crMyCursor = 1;
procedure TForm1.FormCreate(Sender: TObject);
begin
// Загружаем курсор. Единственный способ для этого Screen.Cursors[crMyCursor]
:= LoadCursorFromFile('c:\mystuff\mycursor.ani');
// Используем курсор на форме Cursor := crMyCursor; end;