Delphi - база знаний

         

Как очистить canvas


procedureTForm1.Button1Click(Sender: TObject);
begin
  PatBlt(Form1.Canvas.Handle,0,0,Form1.ClientWidth,Form1.ClientHeight,WHITENESS);
end;

Взято с Исходников.ru


Canvas.Brush.Color := ClWhite;
Canvas.FillRect(Canvas.ClipRect);


InValidateRect(Canvas.handle,NIL,True);
(или взамен передать дескриптор компонента) 
 

Взято из







Как очистить кэш в IE?


Как очистить кэш в IE?



В примере описывается как программно в Internet Explorer нажать кнопку "Clear cache".

Вам нужно будет использовать WinINet в Вашей TfrmMain:

Uses WinINet; 

и добавить к TButton следующий обработчик btnEmptyCache: 

Procedure TfrmMain.btnEmptyCacheClick( Sender : TObject ); 
Var 
    lpEntryInfo : PInternetCacheEntryInfo; 
    hCacheDir   : LongWord; 
    dwEntrySize : LongWord; 
    dwLastError : LongWord; 
Begin 
    dwEntrySize := 0; 
    FindFirstUrlCacheEntry( NIL, TInternetCacheEntryInfo( NIL^ ), dwEntrySize ); 
    GetMem( lpEntryInfo, dwEntrySize ); 
    hCacheDir := FindFirstUrlCacheEntry( NIL, lpEntryInfo^, dwEntrySize ); 
    If ( hCacheDir <> 0 ) Then 
        DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName ); 
    FreeMem( lpEntryInfo ); 
    Repeat 
        dwEntrySize := 0; 
        FindNextUrlCacheEntry( hCacheDir, TInternetCacheEntryInfo( NIL^ ), dwEntrySize ); 
        dwLastError := GetLastError(); 
        If ( GetLastError = ERROR_INSUFFICIENT_BUFFER ) Then Begin 
            GetMem( lpEntryInfo, dwEntrySize ); 
            If ( FindNextUrlCacheEntry( hCacheDir, lpEntryInfo^, dwEntrySize ) ) Then 
                DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName ); 
            FreeMem(lpEntryInfo); 
        End; 
    Until ( dwLastError = ERROR_NO_MORE_ITEMS ); 
End;


Взято с Исходников.ru



Как очистить пункт меню Документы кнопки Пуск?


Как очистить пункт меню Документы кнопки Пуск?



Вызовите Windows API функцию SHAddToRecentDocs() передав nil вместо имени файла в качестве параметра.

uses ShlOBJ;

procedure TForm1.Button1Click(Sender: TObject);
begin
      SHAddToRecentDocs(SHARD_PATH, nil);
end;

Взято с Исходников.ru



Как очистить все окошки редактирования на форме?


Как очистить все окошки редактирования на форме?



procedure ClearEdits;
 var i : Integer;
begin
for i := 0 to ComponentCount-1 do
  if (Components[i] is TEdit) then
    (Components[i] as TEdit).Text := '';
end;

Взято с Исходников.ru



Как ограничить длинну вводимого текста шириной TEdit'а?


Как ограничить длинну вводимого текста шириной TEdit'а?




Как ограничить длинну текста, вводимого в TEdit, так чтобы ширина текста не превышала
ширину TEdit'а?

В примере приведено два способа ограничить длинну текста в TEdit так чтобы она не превышала ширину клиентской области окна TEdit'а и не появлялась прокрутка текста. Первый способ устанавливает свойство TEdit'а MaxLength равным числу букв "W", которые поместятся в TEdit. "W" выбрана потому, что является, наверное, самой широкой буквой в любом шрифте. Этот метод сносно работает для шрифтов с фиксированной шириной букв, но для шрифтов с переменной шириной букв вряд ли сгодится. Второй способ перхватывает событие KeyPress TEdit'а и измеряет ширину уже введенного текста и ширину нового символа. Если ширина больше чем клиентская область TEdit'а новый символ отбрасывается и вызывается MessageBeep.

procedure TForm1.FormCreate(Sender: TObject);
var
  cRect: TRect;
  bm: TBitmap;
  s: string;
begin
  Windows.GetClientRect(Edit1.Handle, cRect);
  bm := TBitmap.Create;
  bm.Width := cRect.Right;
  bm.Height := cRect.Bottom;
  bm.Canvas.Font := Edit1.Font;
  s := 'W';
  while bm.Canvas.TextWidth(s) < CRect.Right do
    s := s + 'W';
  if length(s) > 1 then
    begin
      Delete(s, 1, 1);
      Edit1.MaxLength := Length(s);
    end;
end;

{Другой вариант}

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  cRect: TRect;
  bm: TBitmap;
begin
  if ((Ord(Key) <> VK_TAB) and (Ord(Key) <> VK_RETURN) and
    (Ord(Key) <> VK_LEFT) and (Ord(Key) <> VK_BACK)) then
    begin
      Windows.GetClientRect(Edit1.Handle, cRect);
      bm := TBitmap.Create;
      bm.Width := cRect.Right;
      bm.Height := cRect.Bottom;
      bm.Canvas.Font := Edit1.Font;
      if bm.Canvas.TextWidth(Edit1.Text + Key) > CRect.Right then
        begin
          Key := #0;
          MessageBeep(-1);
        end;
      bm.Free;
    end;
end;



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


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



Для этого можно воспользоваться API функцией ClipCursor(). Например, можно вставить следующий код в обработчик события формы OnMouseDown:
ClipCursor(&BoundsRect); 

а следующий код в обработчик события формы OnMouseUp:
ClipCursor(NULL); 

Если нажать кнопку мыши на форме и удерживать её, то курсор мышки не сможет покинуть пределы формы.

Взято с Исходников.ru



Как округлять до сотых в большую сторону?


Как округлять до сотых в большую сторону?



Прибавляешь 0.5 затем отбрасываешь дробную часть:

Uses Math;  

Function RoundMax(Num:real; prec:integer):real; 
begin 
  result:=roundto(num+Power(10, prec-1)*5, prec); 
end;    


До сотых соответственно будет:

Function RoundMax100(Num:real):real; 
begin 
  result:=round(num*100+0.5)/100; 
end;    


Автор ответа: Vit
Взято с Vingrad.ru




Как опеделить состояние списка ComboBox, выпал/скрыт?


Как опеделить состояние списка ComboBox, выпал/скрыт?




Пошлите ComboBox сообщение CB_GETDROPPEDSTATE.


if SendMessage(ComboBox1.Handle, CB_GETDROPPEDSTATE, 0, 0) = 1 then
  begin {список ComboBox выпал}

  end;



Как оперделить все IP и порты на моем компьютере?


Как оперделить все IP и порты на моем компьютере?



Функции GetTcpTable, GetUdpTable.

Импорт GetTcpTable:

unit TcpTable;
interface
type
  PDWord = ^Longword;
  PMIB_TCPROW = ^TMIB_TCPROW;
  TMIB_TCPROW = record
    dwState: LongWord;
    dwLocalAddr: LongWord;
    dwLocalPort: LongWord;
    dwRemoteAddr: LongWord;
    dwRemotePort: LongWord;
  end;
  PMIB_TCPTABLE = ^TMIB_TCPTABLE;
  TMIB_TCPTABLE = record
    dwNumEntries: LongWord;
    table: array[0..0] of TMIB_TCPROW;
  end;
function GetTcpTable(var TcpTable: PMIB_TCPTABLE; var Size: PDWord; bOrder: Boolean): LongWord; stdcall
implementation
function GetTcpTable; external 'Iphlpapi.dll' name 'GetTcpTable';
end.

Вызов GetTcpTable:

{$R-}
    Entries:=16;
    Sz:=SizeOf(TMIB_TCPTABLE)+SizeOf(TMIB_TCPROW)*(Entries-1);
    pMibTable:=nil;
    try
     repeat
       ReallocMem(pMibTable,Sz);
       Res:=GetTcpTable(pMibTable^,Sz,False);
     until Res <> ERROR_INSUFFICIENT_BUFFER;
     if Res <> NO_ERROR then
      begin
       ShowMessage(SysErrorMessage(Res));
       exit;
      end;
     for Entries:=0 to pMibTable.dwNumEntries-1 do
      begin
         <Делать что-то>
      end;
    finally
     FreeMem(pMibTable);
    end;
{$R+}

Автор Spawn

Взято с Vingrad.ru





Как определить bitrate WAV файла?


Как определить bitrate WAV файла?




{....} 

  private 
    procedure OpenMedia(WaveFile : string); 
    function GetStatus(StatusRequested : DWord) : longint; 
    procedure CloseMedia; 

{....} 

var 
  MyError, dwFlags: Longint; 
  FDeviceID : Word; 

{....} 

uses 
  MMSystem; 

{....} 

procedure TForm1.OpenMedia(WaveFile: string); 
var 
  MyOpenParms: TMCI_Open_Parms; 
begin 
  with MyOpenParms do 
  begin 
    dwCallback       := Handle; // TForm1.Handle 
    lpstrDeviceType  := PChar('WaveAudio'); 
    lpstrElementName := PChar(WaveFile); 
  end; {with MyOpenParms} 
  dwFlags := MCI_WAIT or MCI_OPEN_ELEMENT or MCI_OPEN_TYPE; 
  MyError := mciSendCommand(0, MCI_OPEN, dwFlags, Longint(@MyOpenParms)); 
  // one could use mciSendCommand(DevId, here to specify a particular device 
  if MyError = 0 then 
    FDeviceID := MyOpenParms.wDeviceID 
  else 
    raise Exception.Create('Open Failed'); 
end; 

function TForm1.GetStatus(StatusRequested: DWORD): Longint; 
var 
  MyStatusParms: TMCI_Status_Parms; 
begin 
  dwFlags := MCI_WAIT or MCI_STATUS_ITEM; 
  with MyStatusParms do 
  begin 
    dwCallback := Handle; 
    dwItem     := StatusRequested; 
  end; 
  MyError := mciSendCommand(FDeviceID, 
    MCI_STATUS, 
    MCI_WAIT or MCI_STATUS_ITEM, 
    Longint(@MyStatusParms)); 
  if MyError = 0 then 
    Result := MyStatusParms.dwReturn 
  else 
    raise Exception.Create('Status call to get status of ' + 
      IntToStr(StatusRequested) + ' Failed'); 
end; 

procedure TForm1.CloseMedia; 
var 
  MyGenParms: TMCI_Generic_Parms; 
begin 
  if FDeviceID > 0 then 
  begin 
    dwFlags := 0; 
    MyGenParms.dwCallback := Handle; // TForm1.Handle 
    MyError := mciSendCommand(FDeviceID, MCI_CLOSE, dwFlags, Longint(@MyGenParms)); 
    if MyError = 0 then 
      FDeviceID := 0 
    else 
    begin 
      raise Exception.Create('Close Failed'); 
    end; 
  end; 
end; 


//Example: 
//Beispiel: 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if OpenDialog1.Execute then 
  begin 
    OpenMedia(OpenDialog1.FileName); 
    with ListBox1.Items do 
    begin 
      Add('Average Bytes / Sec : ' + IntToStr(GetStatus(MCI_WAVE_STATUS_AVGBYTESPERSEC))); 
      Add('Bits / Sample : ' + IntToStr(GetStatus(MCI_WAVE_STATUS_BITSPERSAMPLE))); 
      Add('Samples / Sec : ' + IntToStr(GetStatus(MCI_WAVE_STATUS_SAMPLESPERSEC))); 
      Add('Channels : ' + IntToStr(GetStatus(MCI_WAVE_STATUS_CHANNELS))); 
    end; 
    CloseMedia; 
  end; 
end; 
Взято с сайта



Как определить цвет код произвольной точки экрана?


Как определить цвет код произвольной точки экрана?



var
DC: HDC;  
Color: Cardinal;  
begin
DC := CreateDC ('MONITOR', nil, nil, nil);  
Color := GetPixel(DC, 300, 300);  
DeleteDC(DC);  
end; 

Автор Baa.
Взято с Vingrad.ru


var
DC: HDC;  
Color: Cardinal;  
begin
DC :=GetDC(0);  
Color := GetPixel(DC, 300, 300);  
ReleaseDC(0,DC);  
end;

Автор Mikel.
Взято с Vingrad.ru



Как определить графический формат файла (не используя расширение)?


Как определить графический формат файла (не используя расширение)?





You can determine it without extention. Below is a function that reads the file header and determines the type.

functionPhysicalResolveFileType(AStream: TStream): Integer;
var
  p: PChar;
begin
  Result := 0;
  if not Assigned(AStream) then
    Exit;
  GetMem(p, 10);
  try
    AStream.Position := 0;
    AStream.Read(p[0], 10);
    {bitmap format}
    if (p[0] = #66) and (p[1] = #77) then
      Result := 1;
    {tiff format}
    if ((p[0] = #73) and (p[1] = #73) and (p[2] = #42) and (p[3] = #0)) or
      ((p[0] = #77) and (p[1] = #77) and (p[2] = #42) and (p[3] = #0)) then
      Result := 2;
    {jpg format}
    if (p[6] = #74) and (p[7] = #70) and (p[8] = #73) and (p[9] = #70) then
      Result := 3;
    {png format}
    if (p[0] = #137) and (p[1] = #80) and (p[2] = #78) and (p[3] = #71) and
      (p[4] = #13) and (p[5] = #10) and (p[6] = #26) and (p[7] = #10) then
      Result := 4;
    {dcx format}
    if (p[0] = #177) and (p[1] = #104) and (p[2] = #222) and (p[3] = #58) then
      Result := 5;
    {pcx format}
    if p[0] = #10 then
      Result := 6;
    {emf format}
    if (p[0] = #215) and (p[1] = #205) and (p[2] = #198) and (p[3] = #154) then
      Result := 7;
    {emf format}
    if (p[0] = #1) and (p[1] = #0) and (p[2] = #0) and (p[3] = #0) then
      Result := 7;
  finally
    Freemem(p);
  end;
end;


Взято с

Delphi Knowledge Base






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


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



Следующий пример демонстрирует обработку сообщения WM_TIMECHANGE. Приложение, которое изменяет системное время, посылает сообщение WM_TIMECHANGE всем окнам верхнего уровня.

type 
TForm1 = class(TForm)   
private   
{ Private declarations }   
  procedure WMTIMECHANGE(var Message: TWMTIMECHANGE); message WM_TIMECHANGE;   
public   
{ Public declarations }   
end;   

var 
Form1: TForm1; 

implementation 

{$R *.DFM} 

procedure TForm1.WMTIMECHANGE(var Message: TWMTIMECHANGE); 
begin 
  Form1.Caption := 'Time Changed'; 
end;

Взято с Исходников.ru



Как определить, является ли диск NTFS?


Как определить, является ли диск NTFS?





uses 
  ComObj; 

function IsNTFS(AFileName: string): Boolean; 
var 
  fso, drv: OleVariant; 
begin 
  IsNTFS := False; 
  fso := CreateOleObject('Scripting.FileSystemObject'); 
  drv := fso.GetDrive(fso.GetDriveName(AFileName)); 
  IsNTFS := drv.FileSystem = 'NTFS' 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if IsNTFS('X:\Temp\File.doc') then 
    ShowMessage('File is on NTFS File System') 
  else 
    ShowMessage('File is not on NTFS File System') 
end; 

Взято с сайта




Как определить, является ли метод потомком TNotifyEvent?


Как определить, является ли метод потомком TNotifyEvent?






If I am given a TPersistent object, and a method name, is there a way to determine if the name is an event of TNotifyEvent type? For example, given a TPersistent lMyObj and an event name, "OnDataChanged", how can I determine if OnDataChanged is a TNotifyEvent?


functionIsNotifyEvent(Sender: TObject; const Event: string): Boolean;
var
  PropInfo: PPropInfo;
  Method: TNotifyEvent;
begin
  Result := False;
  PropInfo := GetPropInfo(Sender.ClassInfo, Event);
  if not Assigned(PropInfo) then
    Exit;
  if PropInfo.PropType^.Kind <> tkMethod then
    Exit;
  Method := TNotifyEvent(GetMethodProp(Sender, PropInfo));
  Result := Assigned(Method);
end;



Tip by Jack Sudarev


Взято из






Как определить какие приложения уже запущены?


Как определить какие приложения уже запущены?




procedure TForm1.Button1Click(Sender: TObject);
VAR
Wnd : hWnd;  
buff: ARRAY [0..127] OF Char;  
begin
ListBox1.Clear;  
Wnd := GetWindow(Handle, gw_HWndFirst);  
WHILE Wnd <> 0 DO   
BEGIN {Не показываем:}  
IF (Wnd <> Application.Handle) AND {-Собственное окно}  
IsWindowVisible(Wnd) AND {-Невидимые окна}  
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}  
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}  
THEN BEGIN  
GetWindowText(Wnd, buff, sizeof(buff));  
ListBox1.Items.Add(StrPas(buff));  
END;  
Wnd := GetWindow(Wnd, gw_hWndNext);  
END;  
ListBox1.ItemIndex := 0;  
end;

Взято с Исходников.ru



Как определить координаты курсора мыши?


Как определить координаты курсора мыши?



GetCursorPos()

Автор Spawn
Взято с Vingrad.ru




Обрабатывай событие OnMouseMove. Координаты курсора можно получить следующим путем:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
   if (X >= 40 or X <= 234) and (Y >= 60 or Y <=258) then {здесь запуск твоей функции};
end;


Автор Pegas
Взято с Vingrad.ru




  mouse.CursorPos.x
  mouse.CursorPos.y

Автор Vit
Взято с Vingrad.ru


Для этого можно воспользоваться API функцией GetCursorPos. Передав в эту функцию TPoint, мы получим текущие координаты курсора. Следующий код показывает, как получить значения координат курсора по нажатию кнопки.

procedure Form1.Button1Click(Sender: TObject);
var
  foo: TPoint;
begin
  GetCursorPos(foo)
  ShowMessage( '(' + IntToStr(foo.X) + ' ,' + IntToStr( foo.Y ) + ')' );
end;

Взято с Исходников.ru



Как определить лежит ли точка внутри полигона?


Как определить лежит ли точка внутри полигона?





The main procedure is called ExploreLine. In this procedure Fst and Lst may be two consecutively points in the polyline. Srch is the point searched.

{... }
const {global}
  BigM = 1000000;

function Pend(Pi, Pf: TPoint): Real;
begin
  if (Pf.X = Pi.X) then
    Result := BigM {for a vertical line}
  else
    Result := (Pf.Y - Pi.Y) / (Pf.X - Pi.X);
end;

function Dist(Pi, Pf: TPoint): Real;
begin
  Result := sqrt(sqr(Pi.Y - Pf.Y) + sqr(Pi.X - Pf.X))
end;

function CalcPoint(Pi, Pf: TPoint; d: Word): TPoint;
var
  k, m: Real; { k=d / (1 + m2)Ѕ }
begin
  m := Pend(Pi, Pf);
  k := d / (Sqrt(1 + Sqr(m)));
  if ((Pf.X - Pi.X) < 0) then
  begin
    Result.X := Pi.X - Round(k);
    Result.Y := Pi.Y - Round(m * k);
  end
  else
  begin
    Result.X := Pi.X + Round(k);
    Result.Y := Pi.Y + Round(m * k);
  end;
end;

function ExploreLine(Srch, Fst, Lst: TPoint): Boolean;
var
  p: Word;
  Any: TPoint;
  lim, dis: Real;
begin
  lim := Dist(Lst, Fst);
  p := 1;
  Any := Fst;
  repeat
    Result := TestPoint(Srch, Any);
    dis := Dist(Any, Fst);
    Any := CalcPoint(Fst, Lst, Rad * p);
    Inc(p);
  until
    (Result)rr(dis >= lim);
end;


Взято с

Delphi Knowledge Base






Как определить локализацию ОС: английская или русская?


Как определить локализацию ОС: английская или русская?



GetSystemDefaultLangID

Взято с сайта



Как определить MAC адрес NIC?


Как определить MAC адрес NIC?



Вот на что наткнулся в одном из ФАКов:

Вариант1:
From : Sergey Gazimagomedov 2:453/11.13
Мне нужен был МАС адpес, так я его получал, пользуясь NetBIOS.
Добавляешь имя NetBIOS и посылаешь на имя станции, нужной для опpеделения(можно
и своей) датагpамный пакет с заполненным NCB.
Вот исходник моей функции для опpеделения МАС адpеса.


UCHARMYLIBAPI GetAdapterID(char *Name, // NetBIOS ??? ???????
UINT lana_num,
CARDID *ID) // 6 ???????? ??????
{
UCHAR rc = 0;
UCHAR Status[256];
while( lstrlen(Name) - 15)
lstrcat(Name, " ");
memset(&SNcb, 0, sizeof(NCB));
SNcb.ncb_command = NCBASTAT;
SNcb.ncb_buffer = (LPSTR)Status;
SNcb.ncb_length = 256;
lstrcpy(SNcb.ncb_callname, Name);
SNcb.ncb_lana_num = lana_num;
rc = Netbios( &SNcb );
if(rc ==0){
memcpy(ID, Status, 6);
}
return(SNcb.ncb_cmd_cplt);
}

Это под Win32. Конечно должен быть пpотокол NetBIOS, но он в фоpточках и так
необходим.


Взято с Vingrad.ru

Вариант2:
From : Alexey Grachyov

#include 
#include 
#include 
#include 
#include 
void main()
{
int iAdapters,iOpt=sizeof(iAdapters),iSize=sizeof(SOCKADDR_IPX);
SOCKET skNum;
SOCKADDR_IPX Addr;
WSADATA Wsa;
if(WSAStartup(0x0101,&Wsa)) return;
if((skNum=socket(AF_IPX,SOCK_DGRAM,NSPROTO_IPX))!=INVALID_SOCKET)
{
memset(&Addr,0,sizeof(Addr));
Addr.sa_family=AF_IPX;
if(bind(skNum,(SOCKADDR *)&Addr,iSize)!=SOCKET_ERROR)
{
if(getsockopt(skNum,NSPROTO_IPX,IPX_MAX_ADAPTER_NUM,
(char *)&iAdapters,&iOpt)!=SOCKET_ERROR)
{
while(iAdapters)
{
IPX_ADDRESS_DATA Data;
memset(&Data,0,sizeof(Data));
Data.adapternum=iAdapters-1;
iOpt=sizeof(Data);
if(getsockopt(skNum,NSPROTO_IPX,IPX_ADDRESS,(char
*)&Data,&iOpt)!=SOCKET_ERROR)
{
printf("Addr: %02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X\n",
(int)Data.netnum[0],(int)Data.netnum[1],(int)Data.netnum[2],
(int)Data.netnum[3],(int)Data.netnum[4],(int)Data.netnum[5],
(int)Data.netnum[6],(int)Data.netnum[7],(int)Data.netnum[8],
(int)Data.netnum[9]);
}
iAdapters--;
}
}
}
closesocket(skNum);
}
WSACleanup();
}

Взято с Vingrad.ru

Вариант3:

From: MSDN

#include 
#include 
#include 
#include 
#include 
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
void main (void)
{
NCB Ncb;
UCHAR uRetCode;
char NetName[50];
memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = 0;
uRetCode = Netbios( &Ncb );
printf( "The NCBRESET return code is: 0x%x \n", uRetCode );
memset( &Ncb, 0, sizeof (Ncb) );
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = 0;
strcpy( Ncb.ncb_callname, "* " );
Ncb.ncb_buffer = (char *) &Adapter;
Ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &Ncb );
printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );
if ( uRetCode == 0 )
{
printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5] );
}
}


Автор ответа: Garik

Взято с Vingrad.ru


Автор: Daniel Wischnewski

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

Совместимость: Delphi 3.x (или выше)

Данный пример был составлен на основе статьи на сайте Borland:



uses 
  NB30; 

function GetAdapterInfo(Lana: Char): String; 
var 
  Adapter: TAdapterStatus; 
  NCB: TNCB; 
begin 
  FillChar(NCB, SizeOf(NCB), 0); 
  NCB.ncb_command := Char(NCBRESET); 
  NCB.ncb_lana_num := Lana; 
  if Netbios(@NCB) <> Char(NRC_GOODRET) then 
  begin 
    Result := 'mac not found'; 
    Exit; 
  end; 

  FillChar(NCB, SizeOf(NCB), 0); 
  NCB.ncb_command := Char(NCBASTAT); 
  NCB.ncb_lana_num := Lana; 
  NCB.ncb_callname := '*'; 

  FillChar(Adapter, SizeOf(Adapter), 0); 
  NCB.ncb_buffer := @Adapter; 
  NCB.ncb_length := SizeOf(Adapter); 
  if Netbios(@NCB) <> Char(NRC_GOODRET) then 
  begin 
    Result := 'mac not found'; 
    Exit; 
  end; 
  Result := 
    IntToHex(Byte(Adapter.adapter_address[0]), 2) + '-' + 
    IntToHex(Byte(Adapter.adapter_address[1]), 2) + '-' + 
    IntToHex(Byte(Adapter.adapter_address[2]), 2) + '-' + 
    IntToHex(Byte(Adapter.adapter_address[3]), 2) + '-' + 
    IntToHex(Byte(Adapter.adapter_address[4]), 2) + '-' + 
    IntToHex(Byte(Adapter.adapter_address[5]), 2); 
end; 

function GetMACAddress: string; 
var 
  AdapterList: TLanaEnum; 
  NCB: TNCB; 
begin 
  FillChar(NCB, SizeOf(NCB), 0); 
  NCB.ncb_command := Char(NCBENUM); 
  NCB.ncb_buffer := @AdapterList; 
  NCB.ncb_length := SizeOf(AdapterList); 
  Netbios(@NCB); 
  if Byte(AdapterList.length) > 0 then 
    Result := GetAdapterInfo(AdapterList.lana[0]) 
  else 
    Result := 'mac not found'; 
end; 

Взято с Исходников.ru



Как определить - находится ли Ваше приложение в режиме отладки ?


Как определить - находится ли Ваше приложение в режиме отладки ?



Автор: Simon Carter
Обычно господа взломщики, для того, чтобы взломать защиту приложения, запускают его в режиме отладки и анализируют машинный код для определения точки перехвата ввода пароля с клавиатуры.
Обычно таким способом ломаются игрушки :)
Конечно данный способ не сможет полностью защитить Ваш программный продукт от взлома, но прекратить выполнение секретного кода - запросто. Для этого мы будем использовать API функцию IsDebuggerPresent. Единственный недостаток этой функции, заключается в том, что она не работет под Windows 95.
Теперь посмотрим как эту функцию реализовать в Delphi:

function DebuggerPresent: boolean; 
type 
  TDebugProc = function: boolean; stdcall; 
var 
  Kernel32: HMODULE; 
  DebugProc: TDebugProc; 
begin 
  Result := False; 
  Kernel32 := GetModuleHandle('kernel32.dll'); 
  if Kernel32 <> 0 then 
  begin 
    @DebugProc := GetProcAddress(Kernel32, 'IsDebuggerPresent'); 
    if Assigned(DebugProc) then 
      Result := DebugProc; 
  end; 
end; 

А это окончательный пример вызова нашей функции:

if DebuggerPresent then 
  ShowMessage('debugging') 
else 
  ShowMessage('NOT debugging'); 

Взято с Исходников.ru





Как определить наличие сопроцессора?


Как определить наличие сопроцессора?





В отличие от общепринятого мнения не всее клоны 486/586/686/ и Pentium имеют сопроцессор для вычислений с плавающей запятой. В примере определяется наличие сопроцессора и под Win16 и под Win32.
Пример:

{$IFDEFWIN32}

uses Registry;

{$ENDIF}

function HasCoProcesser : bool;
{$IFDEF WIN32}
var
   TheKey : hKey;
{$ENDIF}
begin
   Result := true;
   {$IFNDEF WIN32}
   if GetWinFlags and Wf_80x87 = 0 then
   Result := false;
   {$ELSE}
   if RegOpenKeyEx(HKEY_LOCAL_MACHINE,
   'HARDWARE\DESCRIPTION\System\FloatingPointProcessor',0,
   KEY_EXECUTE, TheKey) <> ERROR_SUCCESS then result := false;
   RegCloseKey(TheKey);
{$ENDIF}
   end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if HasCoProcesser then
      ShowMessage('Has CoProcessor') 
   else
      ShowMessage('No CoProcessor - Windows Emulation Mode');
end;



Взято из
DELPHI VCL FAQ

Перевод с английского   
Подборку, перевод и адаптацию материала подготовил Aziz(JINX)
специально для




Как определить, насдледовано ли свойство от определённого класса?


Как определить, насдледовано ли свойство от определённого класса?





functionGetFontProp(anObj: TObject): TFont;
var
  PInfo: PPropInfo;
begin
  {Try to get a pointer to the property information for a property with the name 'Font'.
  TObject.ClassInfo returns a pointer to the RTTI table, which we need to pass to GetPropInfo}
  PInfo := GetPropInfo(anObj.ClassInfo, 'font');
  Result := nil;
  if PInfo <> nil then
    {found a property with this name, check if it has the correct type}
    if (PInfo^.Proptype^.Kind = tkClass) and
      GetTypeData(PInfo^.Proptype^)^.ClassType.InheritsFrom(TFont)
      then
      Result := TFont(GetOrdProp(anObj, PInfo));
end;


Tip by Peter Below

Взято из






Как определить, нажал ли пользователь клавишу PrintScreen?


Как определить, нажал ли пользователь клавишу PrintScreen?



В событиях, обрабатывающих нажатия клавишь в TForm, клавиша PrintScreen не обрабатывается. Однако проблему можно решить при помощи 'GetAsyncKeyState'. Функция GetAsyncKeyState определяет, когда клавиша была нажата или отпущена каждый раз, когда функция вызвана, а так же, когда клавиша была нажата после предыдущего вызова GetAsyncKeyState.

Событие OnIdle в TApplication как раз подходит для вызова этой API функции:


procedure TForm1.FormCreate(Sender: TObject); 
begin 
  Application.OnIdle := AppIdle; 
end; 


procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean); 
begin 
if GetAsyncKeyState(VK_SNAPSHOT) <> 0 then   
Form1.Caption := 'PrintScreen нажата !';   
Done := True;   
end;

Взято с Исходников.ru


The PrintScreen system key is not processed during the TForm
keydown event. The following example tests if the PrintScreen key has
been pressed by calling the Windows API function GetAsyncKeyState()
during the Application.OnIdle event.

Example:

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure AppIdle(Sender: TObject; var Done: Boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := AppIdle;
end;

procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
  if GetAsyncKeyState(VK_SNAPSHOT)  0 then
    Form1.Caption := 'SnapShot';
  Done := True;
end;






Как определить, нажата ли в данный момент клавиша Shift, Ctrl или Alt?


Как определить, нажата ли в данный момент клавиша Shift, Ctrl или Alt?



Следующий пример демонстрирует проверку состояния клавиши Shift (нажата она или нет), в то время когда выделен пункт меню. А так же в примере содержатся функции, позволяющие определить состояние клавишь Alt, Ctrl, и shift:

function CtrlDown : Boolean;
var
  State : TKeyboardState;
begin
  GetKeyboardState(State);
  Result := ((State[vk_Control] And 128) <> 0);
end;

function ShiftDown : Boolean;
var
  State : TKeyboardState;
begin
  GetKeyboardState(State);
  Result := ((State[vk_Shift] and 128) <> 0);
end;

function AltDown : Boolean;
var
  State : TKeyboardState;
begin
  GetKeyboardState(State);
  Result := ((State[vk_Menu] and 128) <> 0);
end;

procedure TForm1.MenuItem12Click(Sender: TObject);
begin
  if ShiftDown then
    Form1.Caption := 'Shift' else
    Form1.Caption := '';
end;

Взято с Исходников.ru



Как определить откуда был запущен процесс?


Как определить откуда был запущен процесс?



Есть handle запущенного PE файла. Как определить откуда он был запущен?

Я так предполагаю что getmodulefilename как и GetModuleHandle
работает в рамках только своего процесса.

А решить твою задачу .. можно так:
Тут парочка моих любимых функций

uses
tlhelp32;

type
TModuleArray = array of TModuleEntry32;

// Возвращает список описаний (TModuleEntry32) модулей по идентификатору процесса 
function GetModulesListByProcessId(ProcessId : Cardinal) : TModuleArray;

implementation

function GetModulesListByProcessId(ProcessId : Cardinal) : TModuleArray;
var
hSnapshot : THandle;  
lpme : TModuleEntry32;  
 
procedure AddModuleToList;
begin
SetLength(Result,High(Result)+2);  
Result[high(Result)]:=lpme;  
end;

begin
SetLength(Result,0);  
hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,ProcessId);  
if hSnapshot=-1 then RaiseLastWin32Error;  
lpme.dwSize:=SizeOf(lpme);  
if Module32First(hSnapshot,lpme) then  
begin  
AddModuleToList;  
while Module32Next(hSnapshot,lpme) do AddModuleToList;  
end;  
end;

Исходный код 

VAR Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
//------------------------------------
Pid : Cardinal;
modarr : TModuleArray;
Name : String;
//------------------------------------
begin
StringGrid1.RowCount:=1;  
Wnd := GetWindow(Handle, gw_HWndFirst);  
WHILE Wnd <> 0 DO  
BEGIN   
IF (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) THEN   
BEGIN  
fillchar(name,sizeof(name),#0);   
GetWindowText(wnd,buff,sizeof(buff));  
// if getmodulefilename(GetWindowLong(wnd,GWL_HINSTANCE),name,sizeof(name))=0  
// then name:='Null';  
//-----------------------------------------  
GetWindowThreadProcessId(Wnd,@Pid);  
modarr:=GetModulesListByProcessId(Pid);  
name:='Null';  
for i:=0 to High(modarr) do  
begin  
if Integer(modarr[i].modBaseAddr)=$400000 then  
begin  
name:=modarr[i].szExePath;  
break;  
end;  
end;   
//-----------------------------------------  
StringGrid1.Cells[0,StringGrid1.RowCount-1]:=StrPas(buff);  
StringGrid1.Cells[1,StringGrid1.RowCount-1]:=StrPas(name);  
StringGrid1.RowCount:=StringGrid1.RowCount+1;  
END;  
Wnd := GetWindow(Wnd, gw_hWndNext);  
END;  
StringGrid1.RowCount:=StringGrid1.RowCount-1;  
end; 

Автор ответа: TAPAKAH
Взято с Vingrad.ru




Как определить продолжительность в секундах wav файла?


Как определить продолжительность в секундах wav файла?




uses
  MPlayer, MMsystem; 

type 
  EMyMCIException = class(Exception); 
  TWavHeader = record 
    Marker1: array[0..3] of Char; 
    BytesFollowing: Longint; 
    Marker2: array[0..3] of Char; 
    Marker3: array[0..3] of Char; 
    Fixed1: Longint; 
    FormatTag: Word; 
    Channels: Word; 
    SampleRate: Longint; 
    BytesPerSecond: Longint; 
    BytesPerSample: Word; 
    BitsPerSample: Word; 
    Marker4: array[0..3] of Char; 
    DataBytes: Longint; 
  end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  Header: TWavHeader; 
begin 
  with TFileStream.Create('C:\SomeFile.wav', fmOpenRead) do 
    try 
      ReadBuffer(Header, SizeOf(Header)); 
    finally 
      Free; 
    end; 
  ShowMessage(FloatToStr((Int64(1000) * header.DataBytes div header.BytesPerSecond) / 1000)); 
end;  

Взято с сайта


function GetWaveLength(WaveFile: string): Double;
var
    groupID: array[0..3] of char;
    riffType: array[0..3] of char;
    BytesPerSec: Integer;
    Stream: TFileStream;
    dataSize: Integer;
  // chunk seeking function,
  // -1 means: chunk not found

  function GotoChunk(ID: string): Integer;
  var
      chunkID: array[0..3] of char;
      chunkSize: Integer;
  begin
      Result := -1;

    with Stream do
        begin
             // index of first chunk
          Position := 12;
        repeat
             // read next chunk
          Read(chunkID, 4);
          Read(chunkSize, 4);
           if chunkID <> ID then
             // skip chunk
         Position := Position + chunkSize;
          until(chunkID = ID) or (Position >= Size);
          if chunkID = ID then
               // chunk found,
             // return chunk size
            Result := chunkSize;
        end;
  end;

begin
    Result := -1;
    Stream := TFileStream.Create(WaveFile, fmOpenRead or fmShareDenyNone);
    with Stream do
        try
          Read(groupID, 4);
        Position := Position + 4; // skip four bytes (file size)
        Read(riffType, 4);

        if(groupID = 'RIFF') and (riffType = 'WAVE') then
           begin
              // search for format chunk
           if GotoChunk('fmt') <> -1 then
              begin
                // found it
              Position := Position + 8;
              Read(BytesPerSec, 4);
                 //search for data chunk
                dataSize := GotoChunk('data');

                if dataSize <> -1 then
                     // found it
                  Result := dataSize / BytesPerSec
                end
            end
        finally
          Free;
      end;
end;

This returns the number of seconds as a floating point number, which is not necessarily the most helpful format. Far better to return it as a string representing the time in hours, minutes and seconds. The following function achieves this based on the number of seconds as an integer:

function SecondsToTimeStr(RemainingSeconds: Integer): string;
var
    Hours, Minutes, Seconds: Integer;
    HourString, MinuteString, SecondString: string;
begin
     // Calculate Minutes
    Seconds := RemainingSeconds mod 60;
    Minutes := RemainingSeconds div 60;
    Hours := Minutes div 60;
    Minutes := Minutes - (Hours * 60);

    if Hours < 10 then
       HourString := '0' + IntToStr(Hours) + ':'
     else
       HourString := IntToStr(Hours) + ':';

    if Minutes < 10 then
        MinuteString := '0' + IntToStr(Minutes) + ':'
      else
        MinuteString := IntToStr(Minutes) + ':';

    if Seconds < 10 then
        SecondString := '0' + IntToStr(Seconds)
      else
        SecondString := IntToStr(Seconds);
    Result := HourString + MinuteString + SecondString;
end;

Having created these functions you can call them from any relevant event - for example a button click:

procedure TForm1.Button1Click(Sender: TObject);
var
   Seconds: Integer;
begin
    Seconds := Trunc(GetWaveLength(Edit1.Text));
    //gets only the Integer part of the length
    Label1.Caption := SecondsToTimeStr(Seconds);
end;

You can even reduce this to a single line of code if you prefer:

procedure TForm1.Button1Click(Sender: TObject);
begin
    Label1.Caption := SecondsToTimeStr(Trunc(GetWaveLength(Edit1.Text)));
end;


Взято с

Delphi Knowledge Base







Как определить реальный размер поля типа BLOB, которое сохранено в таблице?


Как определить реальный размер поля типа BLOB, которое сохранено в таблице?




Ниже приведена функция GetBlobSize, которая возвращает размер данного BLOB или MEMO поля.

Пример вызова:


functionGetBlobSize(Field: TBlobField): Longint;
begin
  with TBlobStream.Create(Field, bmRead) do
  try
    Result := Seek(0, 2);
  finally
    Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 { This sets the Edit1 edit box to display the size of }
 { a memo field named Notes.                           }

  Edit1.Text := IntToStr(GetBlobSize(Notes));
end;




Copyright © 1996 Epsylon Technologies


Взято из

FAQ Epsylon Technologies (095)-913-5608; (095)-913-2934; (095)-535-5349




Как определить сколько памяти выделено в дельфи для программы?


Как определить сколько памяти выделено в дельфи для программы?



Для этого можно воспользоваться функцией

GetHeapStatus

:

lwMem.Items.Clear;
s := LastStatsList[cbCompare.ItemIndex];
LastStatsList[0] := GetHeapStatus;
LastStats := LastStatsList[PointId];

ListItem := lwMem.Items.Add;
ListItem.Caption := 'TotalAddrSpace';
ListItem.SubItems.Add(Numb2USA(Format(strFormat,[s.TotalAddrSpace])));
tmp := s.TotalAddrSpace - LastStats.TotalAddrSpace;
ListItem.SubItems.Add(DeltaToStr(tmp));

ListItem := lwMem.Items.Add;
ListItem.Caption := 'TotalUncommitted';
ListItem.SubItems.Add(Numb2USA(Format(strFormat,[s.TotalUncommitted])));
tmp := s.TotalUncommitted - LastStats.TotalUncommitted;
ListItem.SubItems.Add(DeltaToStr(tmp));

ListItem := lwMem.Items.Add;
ListItem.Caption := 'TotalCommitted';
ListItem.SubItems.Add(Numb2USA(Format(strFormat,[s.TotalCommitted])));
tmp := s.TotalCommitted - LastStats.TotalCommitted;
ListItem.SubItems.Add(DeltaToStr(tmp));

ListItem := lwMem.Items.Add;
ListItem.Caption := 'TotalAllocated';
ListItem.SubItems.Add(Numb2USA(Format(strFormat,[s.TotalAllocated])));
tmp := s.TotalAllocated - LastStats.TotalAllocated;
ListItem.SubItems.Add(DeltaToStr(tmp));

ListItem := lwMem.Items.Add;
ListItem.Caption := 'TotalFree';
ListItem.SubItems.Add(Numb2USA(Format(strFormat,[s.TotalFree])));
tmp := s.TotalFree - LastStats.TotalFree;
ListItem.SubItems.Add(DeltaToStr(tmp));

ListItem := lwMem.Items.Add;
ListItem.Caption := 'FreeSmall';
ListItem.SubItems.Add(Numb2USA(Format(strFormat,[s.FreeSmall])));
tmp := s.FreeSmall - LastStats.FreeSmall;
ListItem.SubItems.Add(DeltaToStr(tmp));

ListItem := lwMem.Items.Add;
ListItem.Caption := 'FreeBig';
ListItem.SubItems.Add(Numb2USA(Format(strFormat,[s.FreeBig])));
tmp := s.FreeBig - LastStats.FreeBig;
ListItem.SubItems.Add(DeltaToStr(tmp));

ListItem := lwMem.Items.Add;
ListItem.Caption := 'Unused';
ListItem.SubItems.Add(Numb2USA(Format(strFormat,[s.Unused])));
tmp := s.Unused - LastStats.Unused;
ListItem.SubItems.Add(DeltaToStr(tmp));

ListItem := lwMem.Items.Add;
ListItem.Caption := 'Overhead';
ListItem.SubItems.Add(Numb2USA(Format(strFormat,[s.Overhead])));
tmp := s.Overhead - LastStats.Overhead;
ListItem.SubItems.Add(DeltaToStr(tmp));

ListItem := lwMem.Items.Add;
ListItem.Caption := 'HeapErrorCode';
ListItem.SubItems.Add(Numb2USA(Format(strFormat,[s.HeapErrorCode])));

Взято с Исходников.ru



Как определить уровень звука в данный момент?


Как определить уровень звука в данный момент?



Единственное, что удалось найти это компонент на Дельфи (с исходным кодом) на компонент называется Vumeter v.1.0. Я его не разбирал, но похоже что он опрашивает Audio Mixer Driver (или что-то подобное).

Автор ответа: Vit
Взято с Vingrad.ru


Я построил диограмму так:
Назначил F:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead );
Затем считал заголовок Wav- SampleCount, SamplesPerSec, BitsPerSample, Channeles.
Затем считал данные- GetMem(buf, SampleCount * Channeles * BitsPerSample);
Описал массив Volume- SetLength(Volume, SampleCount);
Затем - F.Read(buf^, SampleCount*2); F.Free;
Затем заполнил массив -

buf16 := buf;
for h := 0 to SampleCount - 1 do
  begin
    Volume[h] := abs(buf16^);
    inc(buf16);
  end;
FreeMem(buf);


Затем строил график(в экранных координатах) - по горизонтальной оси откладывал значения SampleCount, по вертикальной значения Volume[h].
График получается точно такой же как в SoundForge.
Единственно, я писал программу для конкретного случая - у меня файлы по 10 минут, моно, 11025 Гц., 16 бит. Так что программа у меня не универсальная. Но работает нормально. По времени: обработка файла и построение графика около 4 -5 секунд.

Автор ответа: TPavel
Взято с Vingrad.ru





Как определить установлен ли Excel?


Как определить установлен ли Excel?





Функция возвращает True если найден OLE-объект

Пример использования
  if not IsOLEObjectInstalled('Excel.Application') then
    ShowMessage('Класс не зарегистрирован')
  else
    ShowMessage('Класс найден');


function IsOLEObjectInstalled(Name: String): boolean;
var
  ClassID: TCLSID;
  Rez : HRESULT;
begin
  // Ищем CLSID OLE-объекта
  Rez := CLSIDFromProgID(PWideChar(WideString(Name)), ClassID);

  if Rez = S_OK then  // Объект найден
    Result := true
  else
    Result := false;
end;

Если нужна более подробная информация об объекте, можно почитать хелп по функции API CLSIDFromProgID.

Автор Кулюкин Олег
Взято с сайта



Как определить установлен ли Internet Explorer?


Как определить установлен ли Internet Explorer?





uses 
  registry; 

function IE_installed(var Version: string): Boolean; 
var 
  Reg: TRegistry; 
begin 
  Reg := TRegistry.Create; 
  with Reg do 
  begin 
    RootKey := HKEY_LOCAL_MACHINE; 
    OpenKey('Software\Microsoft\Internet Explorer', False); 
    if ValueExists('Version') then 
      Version := ReadString('Version') 
    else 
      Version := ''; 
    CloseKey; 
    Free; 
  end; 
  Result := Version <> ''; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  IE_Version: string; 
begin 
  if IE_Installed(IE_Version) then 
    ShowMessage(Format('Internet Explorer %s installed.', [IE_Version])); 
end; 

Взято с сайта



Как определить установлена ли звуковая карта?


Как определить установлена ли звуковая карта?





{... }
if WaveOutGetNumDevs > 0 then
  ShowMessage('Wave-Device present')
else
  ShowMessage('No Wave-Device present');
{ ... }



function IsSoundCardInstalled: Boolean;
type
  SCFunc = function: UInt; stdcall;
var
  LibInst: LongInt;
  EntryPoint: SCFunc;
begin
  Result := False;
  LibInst := LoadLibrary(PChar('winmm.dll'));
  try
    if LibInst <> 0 then
    begin
      EntryPoint := GetProcAddress(LibInst, 'waveOutGetNumDevs');
      if (EntryPoint <> 0) then
        Result := True;
    end;
  finally
    if (LibInst <> 0) then
      FreeLibrary(LibInst);
  end;
end;

Взято с

Delphi Knowledge Base






Как определить видеокарту?


Как определить видеокарту?





procedure TForm1.button1click(Sender: TObject); 
var 
  lpDisplayDevice: TDisplayDevice; 
  dwFlags: DWORD; 
  cc: DWORD; 
begin 
form2.memo1.Clear;   
lpDisplayDevice.cb := sizeof(lpDisplayDevice);   
dwFlags := 0;   
cc:= 0;   
while EnumDisplayDevices(nil, cc, lpDisplayDevice , dwFlags) do   
  begin   
    Inc(cc);   
    form2.memo1.lines.add(lpDisplayDevice.DeviceString);  
        {Так же мы увидим дополнительную информацию в lpDisplayDevice}   
    form2.show;   
  end;   
end;

Взято с Исходников.ru




Как определить, включено ли автоскрытие у панели задач?


Как определить, включено ли автоскрытие у панели задач?



uses ShellAPI; 

... 

function IsTaskbarAutoHideOn : boolean; 
var ABData : TAppBarData; 
begin 
ABData.cbSize := sizeof(ABData);   
Result :=(SHAppBarMessage(ABM_GETSTATE, ABData) and ABS_AUTOHIDE) > 0;   
end; 

Взято с Исходников.ru



Как определить запущен ли Excel?


Как определить запущен ли Excel?




Данный пример ищет активный экземпляр Excel и делает его видимым

var
    ExcelApp : Variant;
begin
  try
    // Ищем запущеный экземплят Excel, если он не найден, вызывается исключение
    ExcelApp := GetActiveOleObject('Excel.Application');

    // Делаем его видимым
    ExcelApp.Visible := true;
  except
  end;

Автор Кулюкин Олег
Взято с сайта



Как определить, запущена ли Delphi


Как определить, запущена ли Delphi



Иногда, особенно при создании компонент, бывает необходимо получить доступ к компоненту только когда запущена Delphi IDE.

If FindWindow('TAppBuilder',nil) <= 0 then 
  ShowMessage('Delphi is not running !') 
else 
  ShowWindow('Delphi is running !'); 

Взято с Исходников.ru



Как определить, запущено ли приложение в Windows NT?


Как определить, запущено ли приложение в Windows NT?



Следующий кодкомпилируется как на 16-ти, так и на 32-битных платформах.

{$IFNDEF WIN32} 
  const WF_WINNT = $4000; 
{$ENDIF} 

function IsNT : bool; 
{$IFDEF WIN32} 
var 
   osv : TOSVERSIONINFO; 
{$ENDIF} 
begin 
  result := true; 
{$IFDEF WIN32} 
  GetVersionEx(osv); 
  if osv.dwPlatformId = VER_PLATFORM_WIN32_NT then exit; 
{$ELSE} 
   if ((GetWinFlags and WF_WINNT) = WF_WINNT ) then exit; 
{$ENDIF} 
  result := false; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if IsNt then 
    ShowMessage('Running on NT') 
  else 
    ShowMessage('Not Running on NT'); 
end;


Взято с Исходников.ru




function IsNT: bool;
var osv: TOSVERSIONINFO;
begin result := true;
  GetVersionEx(osv);
  if osv.dwPlatformId = VER_PLATFORM_WIN32_NT then exit;
  result := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsNt then
    ShowMessage('Running on NT')
  else
    ShowMessage('Not Running on NT');

Взято с сайта



Как остановить автодобавление из DBGrid?


Как остановить автодобавление из DBGrid?



Добавьте в событие "BeforeInsert" Вашего TTables следующие строки:

procedure TForm1.Tbable1BeforeInsert(DataSet: TDataset); 
begin 
  Abort; 
end; 

ИЛИ

procedure TForm8.DBGrid1KeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState); 
begin 
  if (Key = VK_DOWN) then 
  begin 
    TTable1.DisableControls ; 
    TTable1Next ; 
    if TTable1.EOF then 
      Key := 0 else TTable1.Prior ; 
    TTable1.EnableControls ; 
  end ; 
end;

Взято с Исходников.ru



Как остановить или запустить IB сервис?


Как остановить или запустить IB сервис?





Do you need to shutdown the Interbase db service e.g. for an installation program and afterwards restart it?

You could do this with a lot of Delphi code involving unit WinSvc and function calls to

OpenSCManager()
EnumServicesStatus()
OpenService()
StartService()or ControlService().

But luckily there is a much easier solution that uses the NET.EXE program which has been part of Windows since Windows for Workgroups (Wfw 3.11). Just create the two batch files

IBSTOP.BAT
IBSTART.BAT

and call them from your code. You may want to call them and wait for their termination.

IBSTOP.BAT
=============
@echo off
net stop "InterBase Guardian" >NULL
net stop "InterBase Server" >NULL

IBSTART.BAT
=============
@echo off
net start "Interbase Guardian" >NULL

Взято с

Delphi Knowledge Base




Как осуществить быстрый поиск в Listbox?


Как осуществить быстрый поиск в Listbox?



Очень просто, смотри пример....
считаем, сто есть поле Edit1, в котором набираем текст, и ListBox, в котором ищем нужную строку, (как в Нelp).

procedure TForm1.Edit1Change(Sender: TObject);
begin
  ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text)));
end;



Взято с Исходников.ru





Как осуществить поиск ячейки по её значению?


Как осуществить поиск ячейки по её значению?





{... }
var
  Rnge: OleVariant;
  { ... }

Rnge := WS.Cells;
Rnge := Rnge.Find('Is this text on the sheet?');
if Pointer(IDispatch(Rnge)) <> nil then
  {The text was found somewhere, so colour it pink}
  Rnge.Interior.Color := clFuchsia;


Взято с

Delphi Knowledge Base






Как осуществить поиск слов по маске?


Как осуществить поиск слов по маске?



Может у кого-нибудь есть готовая функция поиска(выборки) слов по маске (с использованием символов '*' и '?').

Такая функция в Дельфи есть: MatchesMask из модуля masks.

Автор ответа: MBo
Взято с Vingrad.ru





Как осуществить ввод текста в компоненте Label?


Как осуществить ввод текста в компоненте Label?



Многие программисты задавая такой вопрос получают на него стандартный ответ "используй edit box." На самом же деле этот вопрос вполне решаем, хотя лейблы и не основаны на окне и, соответственно не могут получать фокус ввода и, соответственно не могут получать символы, вводимые с клавиатуры. Давайте рассмотрим шаги, которые были предприняты мной для разработки данного компонента.

Первый шаг, это кнопка, которая может отображать вводимый текст:

type
  TInputButton = class(TButton)
  private
    procedure WmChar (var Msg: TWMChar);
      message wm_Char;
  end;

procedure TInputButton.WmChar (var Msg: TWMChar);
var
  Temp: String;
begin
  if Char (Msg.CharCode) = #8 then
  begin
    Temp := Caption;
    Delete (Temp, Length (Temp), 1);
    Caption := Temp;
  end
  else
    Caption := Caption + Char (Msg.CharCode);
end;

С меткой (label) дела обстоят немного сложнее, так как прийдётся создать некоторые ухищрения, чтобы обойти её внутреннюю структуру. Впринципе, проблему можно решить созданием других скрытых компонент (кстати, тот же edit box). Итак, посмотрим на объявление класса:

type
  TInputLabel = class (TLabel)
  private
    MyEdit: TEdit;
    procedure WMLButtonDown (var Msg: TMessage);
      message wm_LButtonDown;
  protected
    procedure EditChange (Sender: TObject);
    procedure EditExit (Sender: TObject);
  public
    constructor Create (AOwner: TComponent); override;
  end;

Когда метка (label) создана, то она в свою очередь создаёт edit box и устанавливает несколько обработчиков событий для него. Фактически, если пользователь кликает по метке, то фокус перемещается на (невидимый) edit box, и мы используем его события для обновления метки. Обратите внимание на ту часть кода, которая подражает фокусу для метки (рисует прямоугольничек), основанная на API функции DrawFocusRect:

constructor TInputLabel.Create (AOwner: TComponent);
begin
  inherited Create (AOwner);

  MyEdit := TEdit.Create (AOwner);
  MyEdit.Parent := AOwner as TForm;
  MyEdit.Width := 0;
  MyEdit.Height := 0;
  MyEdit.TabStop := False;
  MyEdit.OnChange := EditChange;
  MyEdit.OnExit := EditExit;
end;

procedure TInputLabel.WMLButtonDown (var Msg: TMessage);
begin
  MyEdit.SetFocus;
  MyEdit.Text := Caption;
  (Owner as TForm).Canvas.DrawFocusRect (BoundsRect);
end;

procedure TInputLabel.EditChange (Sender: TObject);
begin
  Caption := MyEdit.Text;
  Invalidate;
  Update;
  (Owner as TForm).Canvas.DrawFocusRect (BoundsRect);
end;

procedure TInputLabel.EditExit (Sender: TObject);
begin
  (Owner as TForm).Invalidate;
end;

Взято с Исходников.ru



Как отчитывать промежутки времени с точностью, большей чем 60 мсек?


Как отчитывать промежутки времени с точностью, большей чем 60 мсек?




Для начала описываешь процедуру, которая будет вызываться по сообщению от таймера :
procedureFNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD)
stdcall;
begin
//
//  Тело процедуры.
end; 

а дальше в программе (например по нажатию кнопки) создаешь Таймер и вешаешь на него созданную процедуру
uTimerID:=timeSetEvent(10,500,@FNTimeCallBack,100,TIME_PERIODIC); 

Подробности смотри в Help.
Hу и в конце убиваешь таймер
timeKillEvent(uTimerID); 

И все. Точность этого способа до 1 мсек. минимальный интервал времени можно задавать 1 мсек.

Автор: Leonid Tserling
tlv@f3334.dd.vaz.tlt.ru

Автор:

StayAtHome

Взято из





Как открыть базу данных Microsoft Access .MDB в Delphi?


Как открыть базу данных Microsoft Access .MDB в Delphi?



ADO

Если у Вас Delphi 5 Enterprise или Delphi 5 Professional с ADO Express, то Вы можете использовать компонент ADOTable и в его свойстве ConnectionString настроить (build) подключение как базе данных MS Access. Например:

Provider=Microsoft.Jet.OLEDB.4.0;
User ID=Admin;
Password=Password;
Data Source=D:\Path\dbname.mdb;
Mode=ReadWrite;
Extended Properties="";
Persist Security Info=False;
Jet OLEDB:System database="";
Jet OLEDB:Registry Path="";
Jet OLEDB:Database Password="";
Jet OLEDB:Engine Type=5;
Jet OLEDB:Database Locking Mode=1;
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";
Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;
Jet OLEDB:Don't Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=True;
Jet OLEDB:SFP=False

При этом будет открыта база данных D:\Path\dbname.mdb, будет использован драйвер ADO для базы данных Access (Microsoft.Jet.OLEDB.4.0). Имя пользователя будет Admin без пароля (эти значения присваиваются поумолчанию при создании базы Access). Если Вы всё-таки захотите использовать пароль, то его надо будет задать в ствойстве Jet OLEDB:Database Password. Если у Вас установлен режим безопасности, то необходимо указать файл .MDW или .MDA в свойстве Jet OLEDB:System database.


BDE
Так же для открытия базы данных Access можно воспользоваться BDE которая содержит родной драйвер (MSACCESS). В компоненте Database установите следующие свойства:

DatabaseName = Any_name (или Alias_name)
DriverName   = MSACCESS
LoginPrompt  = False
Params       = PATH=d:\path
               DATABASE NAME=d:\path\filename.mdb
               TRACE MODE=0
               LANGDRIVER=Access General
               USER NAME=Admin
               PASSWORD=your_password
               Open/MODE=Read/Write
               SQLPASSTHRU MODE=Not SHARED

Значения свойства DatabaseName объекта Database, это то, которое Вы будете использовать в свойстве DatabaseName компонентов Table и Query, которые представляют таблицы и запросы для этой базы данных (тем самым связывая их с объектом Database).

BDE+ODBC
В случае с базой данных Access, BDE предоставляет драйвер, однако существует множество других баз, для которых в BDE драйвера нет, но для которых есть драйвер ODBC. ODBC обычно используется для небольших баз данных или в приложениях, в которых присутствуют только операции импорта/экспорта...

Ниже приведён пример использования драйвера ODBC с BDE для открытия базы данных Access:


Создайте DSN (Data Source Name) для Вашей базы данных (используя апплет ODBC Data Sources в панели управления).
Кликните на закладку "System DSN" или "User DSN"
Кликните по кнопке "Add..."
Выберите "Microsoft Access Driver (*.mdb)" и нажмите ENTER. Появится диалоговое окошко "ODBC Microsoft Access Setup".
Задайте имя в текстовом окошке Data Source Name (без пробелов и без специальных символов).
Кликните по кнопке "Select..." чтобы выбрать нужный файл .MDB.
Если у Вас установлена схема безопасноти, то выберите радио кнопку "Database" в "System Database", а затем кликните кнопку "System database...", чтобы указать файл рабочей группы .MDW или .MDA.
Если Вы хотите указать имя пользователя и пароль, то нажмите кнопку "Advanced...". Данный способ защиты является низкоуровневым, так как любой, кто имеет доступ к Вашей машине может спокойно посмотреть свойства DSN. Если Вам необходим более высокий уровень защиты, то задавать имя пользователя и пароль необходимо на стадии открытия базы данных (см. ниже).
В заключении нажмите "OK", после чего Ваш DSN будет сохранён.
В Delphi установите свойства компонента TDatabase:
В DatabaseName задайте имя, которое указали в DSN.
Если Вы хотите, чтобы пользователя спрашивали имя и пароль, то установите LoginPrompt в True.
Если Вы не хотите использовать стандартный диалог имени и пароля (или если имя и пароль будут задаваться программно), то установите LoginPrompt в False и задайте свойство Params (или задайте эти свойства по ходу выполнения программы):
USER NAME=your_username
PASSWORD=your_password
Свяжите компоненты TTable или TQuery с компонентом TDatabase, как рассказывалось Выше, просто указав тоже имя (которое было задано в DSN) в их соответствующих свойствах DatabaseName.


Взято с Исходников.ru



Как открыть диалог Add printer?


Как открыть диалог Add printer?



// добавьте ShellAPI в USES

ShellExecute(handle, nil, 
'rundll32.exe', 
'shell32.dll,SHHelpShortcuts_RunDLL AddPrinter', '', SW_SHOWNORMAL); 

Взято с Исходников.ru





Как открыть диалог смены системного времени?


Как открыть диалог смены системного времени?




uses 
  Shellapi; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  ShellExecute(Handle, 'open', 'control', 'date/time', nil, SW_SHOW); 
end; 

Взято с сайта




Как открыть диалог создания ярлыка?


Как открыть диалог создания ярлыка?




uses 
  registry, shellapi; 

function Launch_CreateShortCut_Dialog(Directory: string): Boolean; 
var 
  reg: TRegistry; 
  cmd: string; 
begin 
  Result := False; 
  reg    := TRegistry.Create; 
  try 
    reg.Rootkey := HKEY_CLASSES_ROOT; 
    if reg.OpenKeyReadOnly('.LNK\ShellNew') then 
    begin 
      cmd    := reg.ReadString('Command'); 
      cmd    := StringReplace(cmd, '%1', Directory, []); 
      Result := True; 
      WinExec(PChar(cmd), SW_SHOWNORMAL); 
    end 
  finally 
    reg.Free; 
  end; 
end; 

{Example} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Launch_CreateShortCut_Dialog('c:\temp'); 
end; 

Взято с сайта



Как открыть диалог свойств аудио?


Как открыть диалог свойств аудио?





WinExec('rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2',SW_SHOWNORMAL); 

Взято с сайта