20
May 08

Delphi: AdapterMacAddress

:: articles :: by Gilberto Saraiva

Camaradas,

Muitos aqui devem ter vivido o problema de obter o endereço MAC de um adaptador de rede wireless, quando o mesmo está desativado.

Eu escrevi uma pequena função que obtem o MAC Address mesmo que o adaptador indicado esteje desativado.
Então vamos lá:

 Delphi |  copy code |? 
01
function AdapterMacAddress(AAdptNum: Cardinal): string;
02
type
03
  PC = PCardinal;
04
  PB = PByte;
05
var
06
  hLib: HMODULE;
07
  { Note: Type from IpHlpApi GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
08
    var pOutBufLen: ULONG): DWORD; stdcall;
09
  }
10
  GetAdptInfo: function(A: Pointer; var B: ULONG): DWORD; stdcall;
11
  i, Size, Buff: Cardinal;
12
begin
13
  Result := '-----';
14
  hLib := LoadLibrary('iphlpapi.dll');
15
  if hLib <> 0 then
16
    try
17
      @GetAdptInfo := GetProcAddress(hLib, 'GetAdaptersInfo');
18
      Size := 0;
19
      if GetAdptInfo(nil, Size) = 111 then
20
      begin
21
        GetMem(Pointer(Buff), Size);
22
        try
23
          if GetAdptInfo(Pointer(Buff), Size) = 0 then
24
            for I := PC(Buff + (640 * AAdptNum) + 400)^ - 1 downto 0 do
25
              Insert(IntToHex(PB(Buff + (640 * AAdptNum) + 404 + I)^, 2),
26
                Result, I + 1);
27
        finally
28
          FreeMem(Pointer(Buff));
29
        end;
30
      end;
31
    finally
32
      FreeLibrary(hLib);
33
    end;
34
end;

Escrevi esse código pra não ter dependências a outras Units, mas como alguns aqui devem saber,
tudo que escrevi é baseado na Biblioteca em anexo, a IpHlpApi.

Para os curiosos vale a pena dar uma olhada nessa Lib.

Agora o mais interessante – Como usar a função acima?
Adicione um TMemo no form(coloquei o name de ‘mmoMACs’).

 Delphi |  copy code |? 
1
  mmoMACs.Lines.Add(AdapterMacAddress(0));
2
  mmoMACs.Lines.Add(AdapterMacAddress(1));

Nesse exemplo eu pego o MAC Address do primeiro e do segundo adaptador.
O retorno aqui ficou:
00-19-DB-9D-D0-4F
00-03-0D-7A-5D-40

Respectivamente, Placa de Rede a Cabo e Placa de Rede Wireless(Desativada no switch do notebook [OFF])

Obs: Lembre-se que em programação iniciamos contagem do 0, então de 0 a 10 temos 11 elementos.

Abraço a todos



19
May 08

Delphi: FormatDateTime

:: articles :: by Gilberto Saraiva

Camaradas,

FormatDateTime é um procedimento que retorna uma string de acordo com o formato passado como 1º parametro usando o 2º parametro que é a data.

 Delphi |  copy code |? 
1
2
// SysUtils.pas [Delphi 7]:
3
function FormatDateTime(const Format: string; DateTime: TDateTime): string;
4
begin
5
  DateTimeToString(Result, Format, DateTime);
6
end;

Exemplo:

 Delphi |  copy code |? 
1
2
begin
3
  ShowMessage(FormatDateTime('dd/mm/yyyy', (Now + 1)));
4
end;
5

Resultará em uma mensagem contendo:
‘19/05/2008′

Uma das grandes facilidade que ele traz é durante a interação com um banco de dados:
Exemplo para o mySQL:

 Delphi |  copy code |? 
01
02
begin
03
  MyQuery.SQL.Text := Format(
04
    'SELECT * FROM `log` WHERE `date` BETWEEN ''%s'' AND ''%s''',
05
    [
06
      // Data inicial
07
      FormatDateTime('yyyy-mm-dd', (Now)),
08
      // Data final
09
      FormatDateTime('yyyy-mm-dd', (Now + 1))
10
    ]);
11
end;
12

Sintaxes para formatação:

Sintax Finalidade Resultado
c Resulta na Data e hora com o formato ShortDateFormat + LongTimeFormat. (Se for exatamente meia-noite não irá mostrar a hora) 02/09/2008 07:04:01
d Resulta no valor número que representa o Dia do mês ( sem 0 na frente ) 2
dd Resulta no valor número que representa o Dia do mês ( com 0 na frente [00] ) 02
ddd Resulta na abraviação do nome do dia da semana ter
dddd Resulta no nome do dia da semana terça-feira
ddddd Resulta na data formatada usando ShortDateFormat 02/09/2008
dddddd Resulta na data formatada usando LongDateFormat terça-feira, 2 de setembro de 2008
m Resulta no valor número que representa o mês ( sem 0 na frente ) 9
mm Resulta no valor número que representa o mês ( com 0 na frente [00] ) 09
mmm Resulta na abreviação do nome do mês set
mmm Resulta no nome do mês setembro
y Resulta no ano em dois digitos 08
yyyy Resulta no ano em quatro digitos 2008
h Resulta nas horas ( sem 0 na frente ) 7
hh Resulta nas horas ( com 0 na frente [00] ) 07
n Resulta nos minutos ( sem 0 na frente ) 4
nn Resulta nos minutos ( com 0 na frente [00] ) 04
s Resulta nos segundos ( sem 0 na frente ) 1
ss Resulta nos segundos ( com 0 na frente [00] ) 01
z Resulta nos milisegundos ( sem 0 na frente ) 31
zzz Resulta nos milisegundos ( com 0 na frente [000] ) 031
t Resulta na hora formatada usando ShortTimeFormat 07:04
tt Resulta na hora formatada usando LongTimeFormat 07:04:01
am/pm Reajusta a hora resultada para horários de 12 horas (manha e tarde) 07:04 am

Abraço a todos