Mostrando postagens com marcador Pascal. Mostrar todas as postagens
Mostrando postagens com marcador Pascal. Mostrar todas as postagens

(Tutorial) Operador AND (&)


Bem. Primeiramente olá a todos.

Hoje irei ensinar um tutorial que já me pediram algumas vezes, mas nunca tive vontade de fazer. Finalmente vou explicar como funciona os famosos operadores bit a bit, ou operadores estruturados em portas lógicas.

Primeiramente você deve saber que estes operadores usam instruções baseadas nas instruções booleanas. Mentirosas e Verdadeiras. Falses e Trues. 0 e 1


Vamos aos operadores:

Operador AND


Primeiramente você precisa gravar as seguintes regras:

A B (A & B)
0 0 0
0 1 0
1 0 0
1 1 1

Essas regras mudam de operador para operador. Mas basicamente operadores binários tem a mesma função o que muda é a regra acima.

A regra acima chama-se tabela verdade
http://pt.wikipedia.org/wiki/Tabela_verdade

Aqui outras regras:
http://pt.wikipedia.org/wiki/Porta_l%C3%B3gica

Em c++:
printf("%d", 0 & 0); // 0
printf("%d", 0 & 1); // 0
printf("%d", 1 & 0); // 0
printf("%d", 1 & 1); // 1

Resumindo a regra: Valores diferentes retorna falso. Valores que contenham zero em um dos parametros, retorna false. (Isto é, só 1 & 1 pode retornar verdadeiro)

Pois bem, já sabemos uma parte do operador &. Mas vem outra questão.

Quando os números usados como parâmetros são diferentes de 1 e 0? Como 10 & 15 ??

Como:
printf("%d", 10 & 15); // ??

Simples. O operador pega os valores de entrada e os transforma em binários:

Conversão para Binários:
10 -> 1010
15 -> 1111

Então usamos os próprio números binários para checagem BIT a BIT dos valores (algarismo por algarismo | digito por digito do número binário)

(10) (15)
1 1
0 1
1 1
0 1

Agora só aplicar as regra da tabela

1 & 1? 1
0 & 1? 0
1 & 1? 1
0 & 1? 0

Resultado:
1010

Agora por último a função transforma o número binário 1010 em decimal. Ficando 10

Logo 10 & 15 = 10

-----------------------------------------------------------------------

Pra que serve?

Para manipular os valores usando lógicas complexas. Exemplo

Saber se um número é Impar:

Para saber se um número é impar usando este operador basta usar (n & 1) sendo "n" o número a saber:

Ex:
9 & 1


Transformar em binário:
9 -> 1001
1 -> 0001

Comparar bit a bit:
1 & 0 =  0
0 & 0 =  0
0 & 0 =  0
1 & 1 =  1

Retornou 0001! Sim, 9 é impar.

-
-
-

Outro exemplo:
(12 & 1)



Transformar em binário:
12 -> 1100
1 -> 0001

Comparar bit a bit:
1 & 0 =  0
1 & 0 =  0
0 & 0 =  0
0 & 1 =  0

Retornou 0000 !! Não, 12 não é impar.

-
-

Entenderam?
_

** Importante - Dica
Para saber o valor binário de um número basta fazer:

printf("%b", VALOR);

Ex:
printf("%b", 15); // 1111


Simples não é? Não é muito difícil, precisa ler bem e entender. Dúvidas? Poste um comentário aqui!

Tutorial Criado por Bruno da Silva

(Delphi) Checar servidor MMS online

Como prometido, segue o source-code do código para checar se o servidor MMS está online:


(PHP) Checar servidor streaming MMS


Alguns programadores já devem ter se deparados com os problemas que temos ao mexer com Windows Media Server. Uma coisa tão básica as vezes pode ter problemas e acabar estragando com tudo.

Um exemplo disto, é para checar se um servidor MMS está online? É, é impossível fazer isto em PHP mesmo que coloque as portas e os protocolos corretos. Pensando nisto, criei um executável chamado mmsCheck em DELPHI que faz este serviço. Basta usar a linha de comando

mmsCheck.exe SERVIDOR PARA CHECAR

caso o servidor estiver online. Ele criará um arquivo, caso contrário não.

Segue aqui um código PHP usando mmsCheck.exe. Para checar se um servidor de streaming está online ou offline:




No próximo artigo do blog, irei colocar o código fonte do mmsCheck. É muito mais simples do que se imagina. Espero que isto possa ser útil.

Abraços

(Delphi) Form acima de tudo (sobreposição de janelas)

Já pensou em como deixar seu programa delphi por cima de todos programas? Até mesmo por cima do menu iniciar e das outras janelas ativas? Bem isto é bastante fácil, utilizando um simples truque de uma linha podemos fazer com que essa operação seja sobreposta em seu programa

Apenas coloque a seguinte função em um evento inicial de form (onShow ou onCreate do form):

SetWindowPos(Form1.handle, HWND_TOPMOST, Form1.Left, Form1.Top,Form1.Width, Form1.Height, 0);

Espero que tenham gostado. Abraços!

(Delphi) Deixar programa oculto

Saudações!

Várias dicas já passaram, mas nem todas hoje em dia funcionam. Pensando nisto, experimentei várias técnicas para como deixar o form/programa oculto mas a única que obtive sucesso foi a seguinte


procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Visible := false;
Application.ShowMainForm := False;Form1.Visible := false; end;

Logo que o programa é criado. Ele é ocultado.
Funcionou em Delphi 2012.

Abraço!

(Delphi) Adicionar site/html/codigofonte em memo

Saudações!

Para adicionar o código fonte de uma página em um memo é bastante simples. Basta utilizar o componente idhttp (na paleta indy client) e um tradicional Memo que pode ser encontrado na paleta Standard

Então, colocar o seguinte código

Memo1.Text := IdHttp1.get('http://brunodasilva.com.br');

A lógica é bastante simples. O idhttp faz a requisição do código fonte da página que logo é passada para o Memo.

Espero que apreciem está dica.

Abraço!

(Delphi) Pegar espaço do hd

Saudações!

Para pegar o espaço livre, usado ou total do hd (disco rigido ou hard disk) basta usar o seguinte código




          total := (DiskSize(3) div  1000000);
          livre := (DiskFree(3) div  1000000);
          usado := (DiskSize(3) -DiskFree(3)) div  1000000;


Também não esqueça de declarar as variáveis usando

var total, livre, usado:integer;

As divisões servem para retorna o resultado em megabytes

O número três indica o hd para coletar as informações. No meu caso, C:/

Abraço!

(Delphi) GetSOComputer (pegar sistema operacional do computador)

Saudações!

Essa função é utilizada para pegar o nome do sistema operacional via registro do windows. Usa-se a use Registry

function GetSOComputer: string;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion', False) then
    begin
      Result := Reg.ReadString('ProductName');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

Espero que apreciem a mesma. Abraços

(Delphi) GetProcessorName (pegar nome processador)

Esta função serve para pegar o nome do processador atual do computador. Usa registros do windows ..

function GetProcessorName: string;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('Hardware\Description\System\CentralProcessor\0', False) then
    begin
      Result := Reg.ReadString('ProcessorNameString');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

Bom uso!

(Delphi) GetOwner (pegar proprietário do computador)

Está função pega o nome de quem está registrado o computador. No caso é através do registro do windows.
(Lembre-se adicionem SEMPRE a use Registry caso for manipular registros no windows)

function GetOwnerComputer: string;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion', False) then
    begin
      Result := Reg.ReadString('RegisteredOwner');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

Abraço

(Delphi) GetBiosDate

Criei esta função que pega a data da BIOS (basic input output system) através dos registros do windows



function GetBiosDate: string;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('Hardware\Description\System\', False) then
    begin
      Result := Reg.ReadString('SystemBiosDate');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;



(Delphi) Pegar Família do Processador

Saudações!

A partir de hoje começarei a colocar algumas informações que servem para pegar informações básicas do computador. Os artigos já foram programados para postar, serão em media dois artigos por dia até semana que vem (pelo menos assim dá pra manter a média de 1.6 artigos por dia)

Segue a função de hoje:

function GetProcessorFamily: string;
var
  Reg: TRegistry;
begin
   Result  := '';
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\Hardware\Description\System\CentralProcessor\0', False) then
      Result := Reg.ReadString('Identifier');
  finally
    Reg.Free;
  end;
end;

Grande parte das funções são retiradas dos registro do windows.

Abraço

(Outros) Gerador de Seguidores Twitter

EDITADO EM AGOSTO de 2012 Ferramenta obsoleta. Não servirá mais para uso.

(Delphi) Alterar Memory Address (memória)

Saudações! :)

Este código aqui serve para alterar o endereço de memória de um determinado programa através do nome do exe !!

Segue aqui o código:
unit Unit1;
interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, tlhelp32, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;

procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;


implementation
{$R *.dfm}


function GetProcessID(Const ExeFileName: string; var ProcessId: integer): boolean;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := false;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do begin
if (StrIComp(PChar(ExtractFileName(FProcessEntry32.szExeFile)), PChar(ExeFileName)) = 0)
or (StrIComp(FProcessEntry32.szExeFile, PChar(ExeFileName)) = 0) then begin
ProcessId:= FProcessEntry32.th32ProcessID;
result := true;
break;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;


procedure TForm1.Button1Click(Sender: TObject);

var valorEndereco, retornoEscrita: Cardinal;
var processoId, tempProcess: integer;

begin
if GetProcessID('EXECUTAVEL.exe', tempProcess) then
begin

valorEndereco := $a; // NOVO VALOR PARA O ENDERÇO

processoId := OpenProcess(PROCESS_ALL_ACCESS, False, tempProcess);

// ========================

WriteProcessMemory(processoId, Pointer($00AA6A34), @valorEndereco, Sizeof(valorEndereco), retornoEscrita); // $00AA6A34 em HEXADECIMAL ($ = 0x)

// ========================

closehandle(processoId);
end else

begin
MessageDlg('Abra o programa primeiro', mtwarning, [mbOK],0);
end;
end;

end.

Criadores
Criado por Bruno da Silva

Obs:
GetProcessID (eu modifiquei a partir dela)

Abraços


(Assembly) Swap para Pascal

Saudações!

Estudando Assembly descobri uma forma legal de se fazer swap (troca de valores nas variáveis) usando apenas asm em pascal

Segue o trecho do código:

procedure TForm1.Button1Click(Sender: TObject);

var X, Y: DWORD;
begin
// Valores antes do swap
X := 10;
Y := 05;

asm // Parte em Assembly

mov edx, [x]
mov ebx, [y]


mov dword ptr [x], edx
mov dword ptr [y], ebx

end;

// Valores trocados
ShowMessage('VALOR X ->' + IntToStr(X));
ShowMessage('VALOR Y ->' + IntToStr(Y));
end;

É uma forma padrão de swap, porém é usado em assembly que passa os valores para pascal.

O sistema usa endereços temporários, no caso são ebx e edx. Os endereços assumem os valores de Y e X que posteriormente são trocados passando o valor as variáveis em pascal.


(Pascal) Mudar Endereço de Proxy

Saudações!

Criei aqui uma função que muda o endereço de proxy atraves do registro no windows. Espero que gostem a função é bastante eficiente

function setInternetProxy(proxy:string);

var registroWindows : TRegistry;

begin

registroWindows := TRegistry.Create;

registroWindows.OpenKey('Software\Microsoft\Windows\CurrentVersion\Internet Settings', false);

registroWindows.WriteBool('ProxyEnable', true);
registroWindows.WriteString('ProxyServer', proxy);


registroWindows.CloseKey;
registroWindows.Free;

end;


Exemplo de uso:
setInternetProxy('127.0.0.1:80');

Desenvolvido por Bruno da Silva



(Pascal) 4shared Music Downloader

Fiz um sistema de downloader para músicas do 4shared


Demonstração:

Ele também acelera bastante o download.

Código fonte:
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP, XPMan, ExtCtrls;

type
TForm2 = class(TForm)
Button1: TButton;
Edit1: TEdit;
ProgressBar1: TProgressBar;
Label1: TLabel;
IdHTTP1: TIdHTTP;
IdHTTP2: TIdHTTP;
XPManifest1: TXPManifest;
Label2: TLabel;
LinkLabel1: TLinkLabel;
procedure Button1Click(Sender: TObject);
procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
arquivo, url: string;
i: integer;
MyFile: TFileStream;
begin
Label1.caption := 'Status: Inicializando';
url := IdHTTP2.Get(edit1.text);

i := pos('preview.mp3', url);

arquivo := '';
Label1.caption := 'Status: Procurando Link';
While (url[i] <> '=') Do
Begin
arquivo := url[i] + arquivo;
i := i - 1;
End;
arquivo := arquivo + 'review.mp3';

MyFile := TFileStream.Create('musica baixada.mp3', fmCreate);
try
IdHTTP1.Get(arquivo, MyFile);
finally

MyFile.Free;
end;

ShowMessage('Música baixada. Confira na pasta do programa!');
end;

procedure TForm2.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
ProgressBar1.Position := AWorkCount;
end;

procedure TForm2.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
ProgressBar1.Position := 0;
ProgressBar1.Max := AWorkCountMax;
Label1.caption := 'Status: Em andamento';
end;

procedure TForm2.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
ProgressBar1.Position := ProgressBar1.Max;
Label1.caption := 'Status: Concluído';
end;

end.





Download:


Desenvolvido por Bruno da Silva

(Pascal) Fazer fade em form

Vou abrir hoje a seção pascal (logo que pouca coisa foi postada nesta linguagem) Vou postar um simples sisteminha que faz fade em form. Bem básico utilizando AlphaBlendValue e um loop com sleep ..


Segue aqui o código
// Apenas crie dois frames:
// frmSplash e TfrmProg
procedure TfrmProg.FormCreate(Sender: TObject);
begin
//criar o splash
frmSplash := TfrmSplash.Create (Application);
frmSplash.Show;
frmSplash.Update;

frmProg.visible := false; // deixar o main invísivel enquanto inicia
// efeito fade no splash
while frmSplash.AlphaBlendValue < 255 do
begin
sleep(10);
frmSplash.AlphaBlendValue:= frmSplash.AlphaBlendValue + 2;
end;

//fechar splash
frmSplash.free;

//mostrar o main de volta
frmProg.visible := true;
end;
end


Que também pode ser acessado por meu pastebin.

Criado por Bruno da Silva