Arquivos do Blog

Abrindo arquivos com os aplicativos associados e tratando exceções

Fala galera, beleza?

Trazendo hoje uma função para abrir arquivos com os aplicativos padrões associados e tratar exceções caso dê algum problema na abertura do arquivo.


// Esta procedure requer a unit ShellApi declarada na cláusula Uses da unit.
// Declare a procedure na cláusula private da unit e coloque-a após a cláusula
// implementation, assim: procedure Tform1.ExecFile(F: String);
// use-a assim: ExecFile('c:\windows\Ladrilhos.bmp')
procedure ExecFile(F: String);
var
  r: String;
begin
  case ShellExecute(Handle, nil, PChar(F), nil, nil, SW_SHOWNORMAL) of
    ERROR_FILE_NOT_FOUND:   r := 'O arquivo especificado não foi encontrado ou não existe!';
    ERROR_PATH_NOT_FOUND:   r := 'O Caminho é inválido ou não existe!'; 
    ERROR_BAD_FORMAT:       r := 'O Aplicativo está corrompido ou não é um Aplicativo Win32 valido!';
    SE_ERR_ACCESSDENIED:    r := 'O sistema negou acesso a este arquivo por algum motivo desconhecido!';
    SE_ERR_ASSOCINCOMPLETE: r := 'Este arquivo tem uma associação inválida ou incompleta a ele!';
    SE_ERR_DDEBUSY:         r := 'A transação DDE não pode ser efetuada por já haver outra Transação DDE em andamento';
    SE_ERR_DDEFAIL:         r := 'Não foi possível efetuar a transação DDE!'; 
    SE_ERR_DDETIMEOUT:      r := 'A transação DDE não pode ser efetuada porque o tempo requerido expirou!';
    SE_ERR_DLLNOTFOUND:     r := 'Uma Biblioteca DLL necessária ao aplicativo associado não foi encontrada!';
    SE_ERR_NOASSOC:         r := 'Este arquivo não tem nenhum aplicativo associado à ele!';
    SE_ERR_OOM:             r := 'memória insuficiente para prosseguir com esta operação!';
    SE_ERR_SHARE:           r := 'Ocorreu uma violação de compartilhamento ao efetuar esta operação!';
  else
    exit;
  end;
  
  ShowMessage(r);
end;

Tratando Incremento e Decremento de Campos Data/Hora

Fala galera, beleza?

Para efetuarmos o incremento ou decremento em valores de Data/Hora, utilizaremos algumas propriedades que explicaremos um pouco melhor abaixo, as funções são encontradas na Unit DateUtils, que será necessário ser declarada para que o Delphi encontre as funções.

Não existe as funções DecMillisecond, DecSecond, DecMinute, DecDay, DecMonth, DecYear. Para esses casos, utilizaremos as respectivas funções passando como parâmetro um valor negativo.


  • Incrementos de Milisegundos (IncMillisecond)
var
  minhaData : TDateTime;
begin

    // Configure nossa data para o início de 2020
    minhaData := EncodeDateTime(2020, 1, 1, 0, 0, 0, 0);
    ShowMessage('Data = '+DateTimeToStr(minhaData));

    // Adicionar 5000 milisegundos na data/hora
    minhaData := IncMillisecond(minhaData, 5000);
    ShowMessage('Data + 5000 milisegundos = ' + DateTimeToStr(minhaData));

    // Subtrair 1000 milisegundos na data/hora
    minhaData := IncMillisecond(minhaData, -1000);
    ShowMessage('Data - 1000 milisegundos = '+ DateTimeToStr(minhaData));
end;

Teremos como resultado das funções acima 3 mensagens, sendo:
A 1º mensagem: ‘Data = 01/01/2020’
A 2º mensagem: ‘Data + 5000 milisegundos = 01/01/2020 00:00:05’
A 3º mensagem: ‘Data – 1000 milisegundos = 01/01/2020 00:00:04’


  • Incremento de Segundos (IncSecond)
var
   minhaData : TDateTime;
 begin
   // Configure nossa data para o fim de 2020
   minhaData := EncodeDateTime(2005, 12, 31, 23, 59, 0, 0);
   ShowMessage('Data = '+ DateTimeToStr(minhaData));

   // Adicionar 60 segundos na data/hora
   myDate := IncSecond(myDate, 60);
   ShowMessage('Data +  60 segundos = '+DateTimeToStr(minhaData));

   // Subtrair 120 segundos na data/hora
   minhaData := IncSecond(minhaData, -120);
   ShowMessage('Data - 120 segundos = '+DateTimeToStr(minhaData));
 end;

Teremos como resultado das funções acima 3 mensagens, sendo:
A 1º mensagem: ‘Data = 31/12/2020 23:59:00’
A 2º mensagem: ‘Data + 60 segundos = 01/01/2021’
A 3º mensagem: ‘Data – 120 segundos = 31/12/2020 23:58:00’


  • Incremento de Minutos(IncMinute)
var
   minhaData : TDateTime;
 begin
   // Defina nossa data antes do final do ano 2020
   minhaData := EncodeDateTime(2020, 12, 31, 23, 0, 0, 0);
   ShowMessage('Data = '+DateTimeToStr(minhaData));

   // Adicionar 100 minutos na data
   minhaData := IncMinute(minhaData, 100);
   ShowMessage('Data + 100 minutos = '+DateTimeToStr(minhaData));

   // Subtrair 40 minutes na data
   minhaData := IncMinute(minhaData, -40);
   ShowMessage('Data -  40 minutos = '+DateTimeToStr(minhaData));
 end;

Teremos como resultado das funções acima 3 mensagens, sendo:
A 1º mensagem: ‘Data = 31/12/2020 23:00:00’
A 2º mensagem: ‘Data + 100 minutos = 01/01/2021 00:40:00’
A 3º mensagem: ‘Data – 40 minutos = 01/01/2021’


  • Incremento de Dias(IncDay)
var
   MinhaData : TDateTime;
 begin
   // Defina nossa data antes do final do ano 2020
   MinhaData := EncodeDate(2020, 12, 30);
   ShowMessage('Data = '+DateToStr(MinhaData));

   // Adicinar 10 dias na data
   MinhaData := incDay(MinhaData, 10);
   ShowMessage('Data + 10 Dias = '+DateToStr(MinhaData));

   // Subtrair 12 dias na data
   MinhaData := incDay(MinhaData, -12);
   ShowMessage('Data - 12 Dias = '+DateToStr(MinhaData));
 end;

Teremos como resultado das funções acima 3 mensagens, sendo:
A 1º mensagem: ‘Data = 30/12/2020’
A 2º mensagem: ‘Data + 10 dias = 09/01/2021’
A 3º mensagem: ‘Data – 12 dias = 29/12/2020’


  • Incremento de Meses(IncMonth)
var
   minhaData : TDateTime;
 begin
   minhaData := StrToDate('31/01/2000');   //Fim de Janeiro em ano bissexto
   ShowMessage('Data = ' + DateToStr(minhaData)); 

   // Incrementar em 1 (padrão)
   // 31/Janeiro/2000 ==> 31/Fevereiro/2000 (ilegal) ==> 29/Fevereiro/2000
   minhaData := IncMonth(minhaData);
   ShowMessage('Data + 1 mês = ' + DateToStr(minhaData));

   // Incrementar em 12 meses
   // 29/Fevereiro/2000 ==> 29/Fevereiro/2000 (ilegal) ==> 28/Fevereiro/2001
   minhaData := IncMonth(minhaData, 12);      // Incrementar em 12 meses
   ShowMessage('Data + 12 meses = ' + DateToStr(minhaData));
 end;

Teremos como resultado das funções acima 3 mensagens, sendo:
A 1º mensagem: ‘Data = 31/01/2000’
A 2º mensagem: ‘Data + 1 mês = 29/02/2000’
A 3º mensagem: ‘Data + 12 meses = 28/02/2001’


  • Incremento de Ano(IncYear)
var
   minhaData : TDateTime;
 begin
   // Configure nossa data para um dia especial de ano bissexto
   minhaData := EncodeDate(2000, 02, 29);
   ShowMessage('Data = '+DateToStr(minhaData));

   // Adicionar 2 anos na data
   minhaData := IncYear(minhaData, 2);
   ShowMessage('Data + 2 Anos = '+DateToStr(minhaData));

   // Subtrair 2 anos na data
   minhaData := IncYear(minhaData, -2);
   ShowMessage('Data - 2 Anos = '+DateToStr(minhaData));
 end;

Teremos como resultado das funções acima 3 mensagens, sendo:
A 1º mensagem: ‘Data = 29/02/2000’
A 2º mensagem: ‘Data + 2 Anos = 28/02/2002’
A 3º mensagem: ‘Data – 2 Anos = 28/02/2000’

Copiar parte de string (LeftStr ou RightStr)

Fala galera beleza ?

To passando hoje pra deixar mais uma dica de função do Delphi para copiar parte de uma string a partir do seu início ou do seu fim, sabendo apenas a quantidade de caracteres que devem ser copiados.

Vou deixar abaixo um exemplo e o vídeo de como trabalhar com a função. (Post e vídeo utilizando o mesmo exemplo)

No exemplo a função será implementada no evento OnClick do botão, mas fica a critério do desenvolvedor escolher onde melhor ela se encaixa no seu código.

Para trabalharmos com as funções LeftStr e RightStr, devemos declarar a Unit System.StrUtils, no nosso form.

procedure TForm.Button1Click(Sender : TObject);
var
AuxStr, AuxLeft, AuxRight: string;
begin
AuxStr := ‘Canal Desenvolvedor Delphi’;
AuxLeft := LeftStr(AuxStr, 5); //Copiará 5 caracteres da Esquerda pra direita da string, ou seja, a palavra Canal’
AuxRight := RightStr(AuxStr, 6); // Copiará 6 caracteres da Direita pra esquerda da string, ou seja, a palavra Delphi

Showmessage(‘Left: ‘ + AuxLeft + sLineBreak + ‘Right: ‘ + AuxRight);
end;

Fixar ano em campo TMaskEdit

Fala galera, beleza?

Estamos de volta, agora sem deixar o blog sem atualizações 😉

No post de hoje, vamos tratar de uma funcionalidade para quem deseja criar um maskedit para data, mas quer manter o ano fixo, sem que o usuário possa alterar.

Para casos de sistemas que tenham o ano fixo ou que seja controlado por algum outro local.

Abaixo segue a função que permite isso.

O FOR é utilizado para colocar a “\” antes dos caracteres que serão fixos e não podem ser alterados, no caso o ano presente na data.

var
    sAno: string;
    I: Integer;
    CompMascara: string;
begin
    MaskEdit1.Clear;
    MaskEdit1.EditMask := EmptyStr;
    sAno := Edit1.Text;

    for I := 1 to Length(sAno) do
        CompMascara := CompMascara + '\' + sAno[I];

    MaskEdit1.EditMask := '99/99/' + CompMascara + ';0;_';
end;