Você está aqui: Delphi ::: Win32 API (Windows API) ::: Tipos de Dados

Como formar um WORD a partir de dois BYTE

Quantidade de visualizações: 11876 vezes
O tipo de dados BYTE da API do Windows é um tipo integral de 8 bits sem sinal (com valor mínimo de 0 e máximo de 255) enquanto o tipo WORD é um tipo integral de 16 bits também sem sinal (com o valor mínimo de 0 e o máximo de 65.535). Isso nos mostra que um WORD é o dobro de um BYTE.

Em algumas ocasiões pode ser necessário guardar em um WORD o valor de dois BYTE, talvez com o propósito de separá-los em um determinado momento (em minhas dicas nesta mesma seção você verá como isso pode ser feito).

Dois BYTE podem ser agrupados em um WORD usando a macro MAKEWORD da API do Windows. Comece analisando os seguintes valores:

Valor 1: 80
Valor 2: 120

Estes dois valores podem ser representados em binário da seguinte forma:

Valor 1: 01010000
Valor 2: 01111000

Ao combinarmos estes dois bytes em um WORD, o primeiro valor será o byte de ordem alta (mais significativo) e o segundo valor será o byte de ordem baixa (menos significativo). E o resultado será dois bytes:

Valor final: 01010000 01111000

Transformando este valor binário em decimal nós temos 20600. Vamos ver isso em Delphi? Analise cuidadosamente o trecho de código abaixo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure TForm3.Button2Click(Sender: TObject);
var
  resultado: WORD;
  ordem_alta, ordem_baixa: BYTE;
begin
  // byte mais significativo
  ordem_alta := 80;

  // byte menos significativo
  ordem_baixa := 120;

  // vamos juntar os dois valores em um WORD
  resultado := MAKEWORD(ordem_baixa, ordem_alta);

  // vamos exibir o resultado
  Memo1.Lines.Add('O valor WORD resultante é: ' +
    IntToStr(resultado));
end;

Ao executar este código teremos o seguinte resultado:

O valor WORD resultante é: 20600

Note que a macro MAKEWORD pede primeiro o byte de ordem baixa e então o byte de ordem alta. O Delphi também nos oferece uma função MakeWord() que recebe dois bytes (na mesma ordem que MAKEWORD) e retorna um Word. Veja sua definição na unit Windows.pas:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

function MakeWord(A, B: Byte): Word;
begin
  Result := A or B shl 8;
end;

O entendimento desta função é bem simples. Suponhamos que temos os seguintes bytes:

a: 01010000 (ordem alta)
b: 01111000 (ordem baixa)

O operador shl move (shift) o byte de ordem alta 8 bits para a esquerda, resultando em 01010000 00000000. Em seguida aplicamos o operador or (que torna um bit 0 somente quando os dois bits dos valores comparados são 0). Veja:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

00000000 01111000 (ordem baixa)
01010000 00000000 (ordem alta - depois de aplicado o operador shl)
-----------------
01010000 01111000


Convertendo 01010000 01111000 para decimal nós temos 20600.

Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009.

Link para compartilhar na Internet ou com seus amigos:

Delphi ::: Dicas & Truques ::: MIDI Musical Instrument Digital Interface, Mapeamento e sequenciamento MIDI, Entrada e saída MIDI

Como retornar uma lista dos dispositivos de saída MIDI no sistema usando Delphi

Quantidade de visualizações: 11137 vezes
Em algumas ocasiões nós precisamos obter uma lista dos dispositivos de saída MIDI no sistema, talvez com o propósito de selecionar um determinado dispositivo em uma ListBox ou ComboBox. O trecho de código abaixo mostra como isso pode ser feito.

O primeiro passo é declarar uma variável do tipo TMidiOutCaps. Este registro está declarado na unit MMSystem.pas e é uma tradução da estrutura MIDIOUTCAPS da API do Windows. Entre outros tipos de dados, esta estrutura possui um membro szPname que retorna o nome do dispositivo. Na unit MMSystem.pas este membro está declarado como array[0..MAXPNAMELEN-1] of AnsiChar, ou seja, uma matriz de AnsiChar que será preenchida pela API do Windows e terá seu final marcado com o caractere null (NULL terminated string). Note a conversão deste valor para o tipo String no momento de inserí-lo no ComboBox. Em versões anteriores do Delphi (estou escrevendo este código no Delphi 2009) podíamos usar a função StrPas() para esta finalidade.

O passo seguinte é obter a quantidade de dispositivos de saída MIDI. Isso é feito com uma chamada à função midiOutGetNumDevs da API do Windows. Uma vez obtida a quantidade de dispositivos nós usamos um laço for e, no corpo deste laço, usamos o valor da variável de controle i para efetuar uma chamada à função midiOutGetDevCaps(), também da API do Windows:

midiOutGetDevCaps(i, @MidiOutCaps, sizeof(TMidiOutCaps));

Esta função recebe o identificador do dispositivo (um valor inteiro começando em 0 e indo até a quantidade de dispositivos - 1), um ponteiro para um registro MidiOutCaps e o tamanho em bytes do registro. Se a função for executada com sucesso, o registro MidiOutCaps será preenchido com várias informações úteis, tais como o nome do dispositivo, o ID do fabricante, o ID do produto, versão do driver, tipo do dispositivo MIDI, número de vozes suportadas, número máximo de notas que podem ser tocadas simultaneamente, etc.

Para finalizar, nós acessamos o campo szPname do registro MidiOutCaps e o adicionamos no ComboBox. Veja o código completo a seguir:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
  MidiOutCaps: TMidiOutCaps; // este registro (record) está definido em MMSystem.pas
  erro: Word;
begin
  // uses MMSystem

  ComboBox2.Clear;
  // midiOutGetNumDevs retorna a quantidade de dispositivos de saída MIDI no sistema
  for i := 0 to midiOutGetNumDevs - 1 do
  begin
    // vamos obter o dispositivo identificado pela variável i (uDeviceID)
    erro := midiOutGetDevCaps(i, @MidiOutCaps, sizeof(TMidiOutCaps));
    if erro <> MMSYSERR_NOERROR then
       raise Exception.Create('Não foi possível obter a lista de dispositivos ' +
         'de saída MIDI');

    // vamos adicionar o nome do dispositivo no ComboBox
    ComboBox2.Items.Add(StrPas(MidiOutCaps.szPname));
  end;
end;

Ao executar este código o ComboBox será preenchido com valores semelhantes à:

Microsoft GS Wavetable SW Synth
MPU-401

Nas demais dicas relacionadas a este assunto você deverá sempre indicar o dispositivo de saída MIDI. Geralmente você poderá fornecer os valores 0 ou 1 para as funções MIDI que pedem o ID do dispositivo de saída.

Para fins de compatibilidade esta dica ou anotação foi escrita usando Delphi 2009.


Delphi ::: Dicas & Truques ::: Imagens e Processamento de Imagens

Como carregar uma imagem JPG, convertê-la em Bitmap e desenhá-la no formulário usando Delphi

Quantidade de visualizações: 18341 vezes
Em algumas situações nós precisamos carregar uma imagem JPG, convertê-la em Bitmap e desenhá-la em nosso formulário. Nesta dica eu mostro como isso pode ser feito. Vamos começar lendo a imagem JPG a partir do diretório da aplicação:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure TForm3.Button1Click(Sender: TObject);
var
  bmp: TBitmap;
  jpg: TJPEGImage;
begin
  // uses Jpeg; // não esqueça

  // vamos criar o bitmap
  bmp := TBitmap.Create;
  // vamos criar o JPG
  jpg := TJPEGImage.Create;

  try
    // vamos carregar a imagem JPG
    jpg.LoadFromFile('foto.jpg');
    // vamos convertê-la para Bitmap
    bmp.Assign(jpg);
    // vamos desenhar o bitmap no formulário
    // começando nas coordenadas x = 0; y = 0 a partir
    // do canto superior esquerdo da área cliente do formulário
    Form3.Canvas.Draw(0, 0, bmp);
  finally
    Jpg.Free;
    Bmp.Free;
  end;
end;

Veja que a técnica consiste em carregar a imagem JPG e convertê-la em Bitmap usando o método Assign() da classe TBitmap. Em seguida só precisamos usar o método Draw() do Canvas do formulário para desenhar a imagem já convertida.

Caso você precise carregar a imagem JPG em tempo de execução, basta colocar um TOpenPictureDialog no formulário e alterar o código do evento Click do botão para:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure TForm3.Button1Click(Sender: TObject);
var
  bmp: TBitmap;
  jpg: TJPEGImage;
begin
  // uses Jpeg; // não esqueça

  if OpenPictureDialog1.Execute then
    begin
      // vamos criar o bitmap
      bmp := TBitmap.Create;
      // vamos criar o JPG
      jpg := TJPEGImage.Create;

      try
        // vamos carregar a imagem JPG
        jpg.LoadFromFile(OpenPictureDialog1.FileName);
        // vamos convertê-la para Bitmap
        bmp.Assign(jpg);
        // vamos desenhar o bitmap no formulário
        // começando nas coordenadas x = 0; y = 0 a partir
        // do canto superior esquerdo da área cliente do formulário
        Form3.Canvas.Draw(0, 0, bmp);
      finally
        Jpg.Free;
        Bmp.Free;
      end;
    end;
end;


Vamos complicar um pouco mais? Que tal uma função que carrega a imagem JPG, faz a conversão para Bitmap e retorna o Bitmap para o chamador? Veja:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

function jpg2bitmap(const imagem: String): TBitmap;
var
  bmp: TBitmap;
  jpg: TJPEGImage;
begin
  // uses Jpeg; // não esqueça
  // vamos criar o bitmap
  bmp := TBitmap.Create;
  // vamos criar o JPG
  jpg := TJPEGImage.Create;

  try
    // vamos carregar a imagem JPG
    jpg.LoadFromFile(imagem);
    // vamos convertê-la para Bitmap
    bmp.Assign(jpg);
  except
    bmp := nil;
  end;

  // vamos retornar o bitmap resultante
  Jpg.Free;
  Result := bmp;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  bmp: TBitmap;
begin
  // vamos obter o Bitmap a partir da função personalizada
  bmp := jpg2bitmap('foto2.jpg');

  // a imagem Bitmap foi obtida com sucesso?
  if bmp <> nil then
    begin
      // vamos desenhar o bitmap no formulário
      // começando nas coordenadas x = 0; y = 0 a partir
      // do canto superior esquerdo da área cliente do formulário
      Form3.Canvas.Draw(0, 0, bmp);
      bmp.Free;
    end
  else
    ShowMessage('Não foi possível obter o Bitmap');
end;

Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009.


Delphi ::: Dicas & Truques ::: Matemática e Estatística

Como gerar um número aleatório de 0 a 10 em Delphi usando a função Random()

Quantidade de visualizações: 27809 vezes
Em algumas situações precisamos gerar números randômicos. Em Delphi isso pode ser feito com o auxílio da função Random(). Esta função aceita um valor inteiro e retorna um número aleatório maior ou igual a 0 e menor que o valor fornecido. Assim, se quisermos obter um número randômico na faixa de 0 a 10, só precisamos fornecer o valor 11 para a função Random(). Note ainda a chamada à função Randomize(), usada para iniciar o gerador de números randômicos.

Veja um exemplo no qual geramos um número aleatório na faixa de 0 a 10:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure TForm1.Button1Click(Sender: TObject);
var
  numero: integer;
begin
  // vamos iniciar o gerador de números randômicos
  Randomize;

  // vamos gerar um número aleatório entre 0 e 10
  numero := Random(11);

  // exibe o resultado
  ShowMessage('Número gerado: ' + IntToStr(numero));
end;

Para questões de compatibilidade, esta dica foi escrita usando Delphi 2009.


Vamos testar seus conhecimentos em

Características do concreto armado

No campo da engenharia, a reologia desempenha um papel crucial no estudo do comportamento de materiais, especialmente quando submetidos a forças ou tensões. Ela investiga como os materiais reagem a essas forças e como suas propriedades podem variar de acordo com fatores como taxa de deformação, temperatura e pressão.

No contexto do concreto armado, um fenômeno reológico em particular ocorre quando a deformação do material aumenta com o tempo sob carregamento constante em comparação com a deformação inicial.

Como esse fenômeno é classificado na reologia do concreto armado?

A) Retração.

B) Expansão.

C) Fluência.

D) Variação de temperatura.

E) Deformações excessivas.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em JavaScript

Qual é a forma correta de se invocar uma função JavaScript chamada "calcular"?

A) call function calcular();

B) calcular();

C) def call calcular();

D) call calcular();
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Ética e Legislação Profissional

Postura ética profissional

A ética na engenharia envolve muitas questões, entre elas o estudo das decisões, das políticas e dos valores que são moralmente desejáveis na prática dessa profissão.

Sendo assim, estudar ética na engenharia tem como objetivo:

A) Capacitar os engenheiros a identificarem oportunidades para que seus projetos sejam aceitos.

B) Capacitar os engenheiros a enfrentarem a complexidade moral envolvida nas decisões e ações do exercício.

C) Priorizar a conformidade com normas técnicas em detrimento de considerações éticas mais amplas.

D) Minimizar a importância do consentimento informado em projetos que impactam comunidades locais.

E) Priorizar sempre o lucro das empresas sobre os valores éticos na execução de projetos.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Ética e Legislação Profissional

Responsabilidade civil no código de defesa do consumidor

O fornecedor e o prestador de serviço estarão livres do dever de indenizar caso não haja dano reparável e ficar comprovado que:

A) a culpa foi exclusiva do consumidor ou de terceiro.

B) a culpa foi do fornecedor.

C) ninguém teve culpa.

D) todos tiveram culpa.

E) não importa quem teve culpa.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Python

Analise o seguinte código Python

a = {5, 8, 2, 1}
b = {1, 4, 5, 3}
c = a.intersection(b)
print(c)

Qual é o resultado de sua execução?

A) {1, 5}

B) Um erro de execução na linha 2

C) {5, 5, 1, 1}

D) {5, 8, 2, 1, 1, 4, 5, 3}
Verificar Resposta Estudar Cards Todas as Questões

Desafios, Exercícios e Algoritmos Resolvidos de Delphi

Veja mais Dicas e truques de Delphi

Dicas e truques de outras linguagens

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: Delphi
6º lugar: C
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2024 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 46 usuários muito felizes estudando em nosso site.