Новости | Win API | VCL | Прочее | Железо |
Для перекодировки из Win(1251) кодовой
страницы в Dos(866) кодовую страницу и обратно
используются функции:
CharToOEM/OEMToChar и CharToOEMBuff/OEMToCharBuff и OemToAnsi/AnsiToOem
:
Пример чтения
текста дос из файла в memo ---------- procedure TForm1.FormCreate(Sender: TObject); var N: PChar; begin memo1.Lines.LoadFromFile('c:\11.txt'); N := Memo1.Lines.GetText; OemToAnsi(N, N); Memo1.Lines.Text := StrPas(N); end; |
или
Пример чтения
текста из файла в memo ---------- procedure TForm1.FormCreate(Sender: TObject); var i,j: integer; s:string; c:set of char; begin c:=['А'..'Я','а'..'я']; memo1.Lines.LoadFromFile('c:\11.txt'); for i:=0 to memo1.Lines.Count do begin s:=memo1.Lines.Strings[i]; for j:=1 to length(s) do if chr(ord(S[j])+64) in c then s[j]:=chr(ord(S[j])+64); memo1.Lines.Strings[i]:=s; end; end; |
Как запустить внешний процесс и подождать, пока он отработает? |
procedure TForm1.Button1Click(Sender: TObject); var si:TStartupInfo; pi:TProcessInformation; cmdline:string; begin ZeroMemory(@si,sizeof(si)); si.cb:=SizeOf(si); cmdline:='c:\command.com'; if not CreateProcess( nil, // No module name (use command line). PChar(cmdline), // Command line. nil, // Process handle not inheritable. nil, // Thread handle not inheritable. False, // Set handle inheritance to FALSE. 0, // No creation flags. nil, // Use parent's environment block. nil, // Use parent's starting directory. si, // Pointer to STARTUPINFO structure. pi ) // Pointer to PROCESS_INFORMATION structure. then begin ShowMessage( 'CreateProcess failed.' ); Exit; end; WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); ShowMessage('Done !'); end; |
procedure TForm1.Button1Click(Sender: TObject); var DC: HDC; Canva: TCanvas; B: TBitmap; begin Canva := TCanvas.Create; B := TBitmap.Create; DC := GetDC(0); try Canva.Handle := DC; with Screen do begin B.Width := Width; B.Height := Height; B.Canvas.CopyRect(Rect(0, 0, Width, Height), Canva,Rect(0, 0, Width, Height)); B.SaveToFile('c:\screen.bmp'); end finally ReleaseDC(0, DC); B.Free; Canva.Free end end; |
// короткий GetShortPathName(LongPath) // наоборот длинный GetFullPathName(ShortPath) |
Как добавить в исполняемый файл wav-файл, и затем проиграть этот звук? |
// В файл MyWave.rc
пишешь: // MyWave RCDATA LOADONCALL MyWave.wav // Затем компилируешь // brcc32.exe MyWave.rc, получаешь MyWave.res. // В своей программе пишешь: // {$R MyWave.res} // или используешь программу для работы с ресурсами // ( н-р Borland Resource WorkShop) для получения res файла procedure
RetrieveMyWave; |
Для работы с сетевыми
дисководами (и ресурсами типа LPT порта)
в WIN API 16 и WIN API 32 следующие функции:
WNetAddConnection(NetResourse,Password,LocalName:PChar):longint;
где
NetResourse - имя сетевого
ресурса (например '\\P166\c')
Password - пароль на доступ к ресурсу (если нет
пароля, то пустая строка)
LocalName - имя, под которым сетевой ресурс будет
отображен на данном компьютере (например 'F:')
Пример подключения сетевого диска: WNetAddConnection('\\P166\C','','F:');
Функция возвращает код ошибки. Для всех кодов предописаны константы, наиболее часто используемые :
NO_ERROR - Нет ошибок - успешное завершение
ERROR_ACCESS_DENIED - Ошибка доступа
ERROR_ALREADY_ASSIGNED - Уже подключен. Наиболее часто
возникает
при повторном вызове данной функции с
теми-же параметрами.
ERROR_BAD_DEV_TYPE - Неверный тип устройства.
ERROR_BAD_DEVICE - Неверное устройство указано в
LocalName
ERROR_BAD_NET_NAME - Неверный сетевой путь или
сетевое имя
ERROR_EXTENDED_ERROR - Некоторая ошибка сети (см.
функцию
WNetGetLastError для подробностей)
ERROR_INVALID_PASSWORD - Неверный пароль
ERROR_NO_NETWORK - Нет сети
WNetCancelConnection(LocalName:PChar;ForseMode:Boolean):Longint;
где
LocalName - имя, под которым сетевой ресурс был
подключен к данному
компьютеру (например 'F:')
ForseMode - режим отключения : False - корректное
отключение. Если
отключаемый ресурс еще используется, то
отключения не
произойдет (например, на сетевом диске
открыт файл)
True - скоростное некорректное отключение. Если
ресурс
используется, отключение все равно произойдет и
может
привести к любым последствиям (от отсутствия
ошибок до
глухого повисания)
Функция возвращает код ошибки. Для всех кодов предописаны константы, наиболее часто используемые :
NO_ERROR - Нет ошибок - успешное
завершение
ERROR_DEVICE_IN_USE - Ресурс используется
ERROR_EXTENDED_ERROR - Некоторая ошибка сети (см.
функцию
WNetGetLastError для подробностей)
ERROR_NOT_CONNECTED - Указанное ус-во не является сетевым
ERROR_OPEN_FILES - На отключаемом сетевом
диске имеются
открытые файлы и параметр ForseMode=false
Рекомендация: при отключении следует сначала попробовать отключить ус-во с параметром ForseMode=false и при ошибке типа ERROR_OPEN_FILES выдать запрос с сообщением о том, что ус-во еще используется и предложением отключить принудительно, и при согласии пользователя повторить вызов с ForseMode=true.
(Взято с http://delphinium.narod.ru/tips/tips/tips.html)
Clipboard.Assign(Image1.Picture); |
// Используйте
функцию FindWindow. // (Класс главного окна Delphi / C++ Builder - TAppBuilder) // прим: обходится путём создания ложного невидемого окна // с этим именем if FindWindow('TAppBuilder', Nil) <> 0 Then |
// Запустить аплет Панели
управления можно вызвав функцию // WinExec, для выполнения файла control.exe, которому передано // имя аплета. Обычно аплеты панели управления расположены в // каталоге System Windows и имеют расширение .cpl. procedure TForm1.Button1Click(Sender: TObject); begin WinExec('C:\WINDOWS\CONTROL.EXE TIMEDATE.CPL', sw_ShowNormal); WinExec('C:\WINDOWS\CONTROL.EXE MOUSE', sw_ShowNormal); WinExec('C:\WINDOWS\CONTROL.EXE PRINTERS', sw_ShowNormal); end; |
// Нужно создать два bitmap'а: // bitmap-маску ("AND" bitmap) и bitmap-картинку (XOR bitmap). // Потом передать дескрипторы "AND" и "XOR" // bitmap-ов API функции CreateIconIndirect() procedure
TForm1.Button1Click(Sender: TObject); |
function RgbToGray(RGBColor : TColor) : TColor; var Gray : byte; begin Gray := Round((0.30 * GetRValue(RGBColor)) + (0.59 * GetGValue(RGBColor)) + (0.11 * GetBValue(RGBColor ))); Result := RGB(Gray, Gray, Gray); end; procedure TForm1.FormCreate(Sender: TObject); begin Shape1.Brush.Color := RGB(255, 64, 64); Shape2.Brush.Color := RgbToGray(Shape1.Brush.Color); end; |
procedure Delay(ms : longint); var TheTime : LongInt; begin TheTime := GetTickCount + ms; while GetTickCount < TheTime do begin ..... {полезный код если надо что-то делать} ..... Application.ProcessMessages; end; end; |
// Используя
Bitmap.Canvas.Draw нарисуйте пиктограмму на Bitmap'е procedure TForm1.Button1Click(Sender: TObject); var TheIcon : TIcon; TheBitmap : TBitmap; begin TheIcon := TIcon.Create; TheIcon.LoadFromFile('C:\Program Files\Borland\IcoCur32\EARTH.ICO'); TheBitmap := TBitmap.Create; TheBitmap.Height := TheIcon.Height; TheBitmap.Width := TheIcon.Width; TheBitmap.Canvas.Draw(0, 0, TheIcon); Form1.Canvas.Draw(10, 10, TheBitmap); TheBitmap.Free; TheIcon.Free; end; |
// Вращение текста
осуществляется функцией SetWorldTransform // перед использованием этой функции заполняется структура XForm // Пример: var Dc: HDc; X: TXForm; s: String; {получение контекста устройства и другие подготовительные операции} ... {заполнение структуры XForm} X.eM11 := cos(45 * 2 * pi / 360); X.eM22 := cos(45 * 2 * pi / 360); X.eM21 := sin(45 * 2 * pi / 360); X.eM12 := -sin(45 * 2 * pi / 360); SetWorldTransform(Dc,@X); s := 'Текст под наклоном 45 градусов'; TextOut(Dc,50,0,s,Length(s)); // автор - Valler |
Как вычислить разницу времени в виде: дни, часы, минуты, секунды? |
// Целая часть = дни,
дробная = часы, минуты, секунды и // миллисекунды (см. пример, параметры - две переменные TDateTime) var |
// Очень просто:
версия - это особый тип ресурса, следовательно,
его можно // прочитать как ресурс и разбираться с ним. Второй путь - API, функции // GetFileVersionInfo, GetFileVersionInfoSize позволяют читать // структуру с информацией о версии для указанного EXE файла // (не обязательно своего). //
Получение информации о версии программы... // Автор: Full |
// Пример
регистрирует расширение файла(.myext) - файлы этого // типа будут открываться приложением MyApp.Exe. // Также регестрируется одно действие (action) // по умолчанию для файлов этого типа и два дополнительных // пункта контекстного меню, связанного сэтим типом файлов. // Возможно, потребуется перезайти в систему чтобы // изменения вступили в силу. uses Registry; // Автор: InSAn |
Как заставить иконку минимизированого приложения мигать на таскбаре? |
procedure TForm1.Timer1Timer(Sender: TObject); begin FlashWindow(Application.Handle, True); end; |
Как лучше всего сравнить две строки без учета регистра, но с учетом текущего языка системы ? |
function AnsiCompareText(const S1, S2: string): Integer;
// На форме три
MaskEdit'а (текущая дата, на сколько добавить,
конечный результат) uses sysutils; procedure TForm1.FormCreate(Sender: TObject); begin MaskEdit1.Text:=DateToStr(now); end; procedure TForm1.Button1Click(Sender: TObject); begin IncDate( Copy(MaskEdit2.Text, 7, 2), Copy(MaskEdit2.Text, 4, 2), Copy(MaskEdit2.Text, 1, 2)); end; procedure TForm1.IncDate(UpYear, UpMonth, UpDay: string); var UpYear1, UpMonth1, UpDay1: word; datein, dateout: TDate; begin DateIn:=StrToDate(MaskEdit1.Text); DateOut:=IncMonth(DateIn, StrToInt(UpMonth)); // ^^^ эта функция увеличивает месяцы (SysUtils.pas) DateOut:=DateOut+StrToInt(UpDay); DecodeDate(DateOut, UpYear1, UpMonth1, UpDay1); DateOut:=EncodeDate(StrToInt(UpYear)+UpYear1, UpMonth1, UpDay1); MaskEdit3.Text:=DateToStr(DateOut); end; |
var DirBytes : integer; function DirSize(Dir:string):integer; var SearchRec : TSearchRec; Separator : string; begin if Copy(Dir,Length(Dir),1)='\' then Separator := '' else Separator := '\'; 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 DirSize(Dir+Separator+SearchRec.Name); 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; |
// с помощью TLabel и
TTimer. // Пример: procedure TForm1.Timer1Timer(Sender: TObject); const LengthGoString = 10; GoString = 'В конце стpоку желательно повтоpить,'+ ' чтоб получить эффект кольцевого движения! В конце ст'; i: Integer = 1; begin Label1.Caption:=Copy(GoString,i,LengthGoString); Inc(i); If Length(GoString)-LengthGoString < i then i:=1; end; |
uses ShellApi; procedure TForm1.Button1Click(Sender: TObject); var OpStruc: TSHFileOpStruct; frombuf, tobuf: Array [0..128] of Char; begin FillChar( frombuf, Sizeof(frombuf), 0 ); FillChar( tobuf, Sizeof(tobuf), 0 ); StrPCopy( frombuf, 'h:\hook\*.*' ); StrPCopy( tobuf, 'd:\temp\brief' ); With OpStruc DO begin Wnd:= Handle; wFunc:= FO_COPY; pFrom:= @frombuf; pTo:=@tobuf; fFlags:= FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION; fAnyOperationsAborted:= False; hNameMappings:= Nil; lpszProgressTitle:= Nil; end; ShFileOperation( OpStruc ); end; |
Можно
ли скопировать группу файлов, используя
стандартный диалог |
// В следующем
примере используется функция SHFileOperation для // копирования группы файлов и показа анимированного диалога. Вы можете // использовать также следующие флаги для копирования, удаления, // переноса и переименования файлов. // TO_COPY, FO_DELETE, FO_MOVE, FO_RENAME // Примечание: буфер, содержащий имена файлов для // копирования должен заканчиваться двумя нулевыми символами. // Пример: uses ShellAPI; procedure TForm1.Button1Click(Sender: TObject); var Fo : TSHFileOpStruct; buffer : array[0..4096] of char; p : pchar; begin FillChar(Buffer, sizeof(Buffer), #0); p := @buffer; p := StrECopy(p, 'C:\DownLoad\1.ZIP') + 1; p := StrECopy(p, 'C:\DownLoad\2.ZIP') + 1; p := StrECopy(p, 'C:\DownLoad\3.ZIP') + 1; StrECopy(p, 'C:\DownLoad\4.ZIP'); FillChar(Fo, sizeof(Fo), #0); Fo.Wnd := Handle; Fo.wFunc := FO_COPY; Fo.pFrom := @Buffer; Fo.pTo := 'D:\'; Fo.fFlags := 0; if ((SHFileOperation(Fo) <> 0) or (Fo.fAnyOperationsAborted <> false)) then ShowMessage('Cancelled') end; |
{ На эту форму
можно бросить файл (например из проводника) и он будет открыт } unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ShellAPI {обязательно!}; type TForm1 = class(TForm) Memo1: TMemo; FileNameLabel: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); protected {Это и есть самая главная процедура} procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMDropFiles(var Msg: TMessage); var Filename: array[0 .. 256] of Char; Count : integer; begin { Получаем количество файлов (просто пример) } nCount := DragQueryFile( msg.WParam, $FFFFFFFF, acFileName, cnMaxFileNameLen); { Получаем имя первого файла } DragQueryFile( THandle(Msg.WParam), 0, { это номер файла } Filename,SizeOf(Filename) ) ; { Открываем его } with FileNameLabel do begin Caption := LowerCase(StrPas(FileName)); Memo1.Lines.LoadfromFile(Caption); end; { Отдаем сообщение о завершении процесса } DragFinish(THandle(Msg.WParam)); end; procedure TForm1.FormCreate(Sender: TObject); begin { Говорим Windows, что на нас можно бросать файлы } DragAcceptFiles(Handle, True); end; procedure TForm1.FormDestroy(Sender: TObject); begin { Закрываем за собой } DragAcceptFiles(Handle, False); end; end. |
{Автор: Ruslan Abu Zant Приводимая здесь функция показывает, как Ваше приложение может извлечь из браузера (IE или Netscape) URL , как, например, это делает аська. Cовместимость: Delphi 4.x (или выше) Не забудьте добавить DDEMan в Ваш проект!} uses windows, ddeman, ...... function Get_URL(Servicio: string): String; var Cliente_DDE: TDDEClientConv; temp:PChar; //<<-------------------------This is new begin Result := ''; Cliente_DDE:= TDDEClientConv.Create( nil ); with Cliente_DDE do begin SetLink( Servicio,'WWW_GetWindowInfo'); temp := RequestData('0xFFFFFFFF'); Result := StrPas(temp); StrDispose(temp); //<<-Предотвращаем утечку памяти CloseLink; end; Cliente_DDE.Free; end; procedure TForm1.Button1Click(Sender); begin showmessage(Get_URL('Netscape')); // или showmessage(Get_URL('IExplore')); end; |
{Данная функция
позволяет Вам проверить существование
определённого адреса(URL) в интернете. Естественно
она может пригодиться веб-мастерам, у которых на
сайте много ссылок, и необходимо с определённой
периодичнойстью эти ссылки проверять. URL может быть как с префиксом http:/ так и без него - эта функция добавляет префикс http:// если он отсутствует (необходимо для функции internetOpenUrl которая так же поддерживает FTP:// и gopher:// Эта функция проверяет только два возвращаемых кода '200'(ОК) или '302' (Редирект), но Вы можете заставить проверять функцию и другие коды. Для этого достаточно модифицировать строчку "result := ". Платформа: Delphi 3.x (или выше) } uses wininet; Function CheckUrl(url:string):boolean; var hSession, hfile, hRequest: hInternet; dwindex,dwcodelen :dword; dwcode:array[1..20] of char; res : pchar; begin if pos('http://',lowercase(url))=0 then url := 'http://'+url; Result := false; hSession := InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0); if assigned(hsession) then begin hfile := InternetOpenUrl( hsession, pchar(url), nil, 0, INTERNET_FLAG_RELOAD, 0); dwIndex := 0; dwCodeLen := 10; HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex); res := pchar(@dwcode); result:= (res ='200') or (res ='302'); if assigned(hfile) then InternetCloseHandle(hfile); InternetCloseHandle(hsession); end; end; |