![]() |
|
|
Planilha de Dimensionamento de Tubulações
Hidráulicas Água Fria e Água Quente CompletaNossa planilha automática de dimensionamento de tubulações de água fria e quente é uma ferramenta desenvolvida para auxiliar engenheiros e projetistas no cálculo rápido e preciso das redes hidráulicas de edificaçoes. Por meio da inserçao de dados como vazao, diâmetro da tubulaçao, comprimento da rede, material do tubo e coeficientes hidráulicos, a planilha realiza automaticamente os cálculos necessários para verificar velocidade da água, perda de carga e dimensionamento adequado das tubulaçoes. |
||
Você está aqui: Cards de Ética e Legislação Profissional |
||
|
||
|
|
||
C# ::: Dicas & Truques ::: Strings e Caracteres |
Como substituir todas as ocorrências de caracteres ou substrings em uma string C# usando o método Replace() da classe StringQuantidade de visualizações: 11159 vezes |
|
Em várias situações nós precisamos substituir as ocorrências de uma letra ou parte de palavras ou frases. Para isso nós podemos usar o método Replace() da classe String da linguagem C#. Este método recebe o caractere ou substring a ser substituído e o novo caractere ou substring, e retorna uma nova String. Veja um trecho de código C# que mostra como substituir todas as ocorrências de caracteres ou substrings em uma string:
using System;
namespace Estudos {
class Program {
static void Main(string[] args) {
// uma frase
string frase = "Gosto muito de C# pois C# é bom demais";
// substitui "C#" por "VB.NET"
string frase2 = frase.Replace("C#", "VB.NET");
// mostra o resultado
Console.WriteLine("Frase original: " + frase);
Console.WriteLine("Com substituições: " + frase2);
Console.WriteLine("\n\nPressione uma tecla para sair...");
Console.ReadKey();
}
}
}
Ao executar este código C# nós teremos o seguinte resultado: Frase original: Gosto muito de C# pois C# é bom demais Com substituições: Gosto muito de VB.NET pois VB.NET é bom demais |
C ::: Dicas & Truques ::: Data e Hora |
Como formatar datas e horas em C usando a função strftime() da linguagem CQuantidade de visualizações: 9312 vezes |
A função strftime() pode ser usada quando queremos formatar valores de datas e horas em C. Esta função, presente no header <time.h>, possui a seguinte assinatura:size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr); O parâmetro strDest é um ponteiro para uma matriz de caracteres que receberá uma string contendo a data e/ou hora formatada. O parâmetro maxsize é a quantidade de caracteres que serão copiados para a matriz de caracteres alvo da operação. O parâmetro format contém os especificadores que serão substituídos durante a formatação. Finalmente, timeptr é um ponteiro para uma estrutura tm contendo as informações de data e hora. O retorno da função é a quantidade de caracteres copiados para a matriz strDest. Veja um trecho de código no qual formatamos e exibimos a data atual no formato longo e de acordo com as configurações regionais para o Português Brasileiro:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
int main(int argc, char *argv[]){
// vamos definir a localização para o Português do Brasil
setlocale(LC_ALL, "Portuguese_Brazil");
time_t data_hora_segundos; // guarda os segundos deste 01/01/1970
struct tm *timeinfo; // declara uma estrutura tm
time(&data_hora_segundos); // preenche a variável data_hora_segundos
// preenche a estrutura timeinfo
timeinfo = localtime(&data_hora_segundos);
// um buffer para receber a data formatada
char data_formatada[80];
// vamos formatar
strftime(data_formatada, 80, "%A, %d de %B de %Y", timeinfo);
// vamos exibir o resultado
printf("Resultado da formatação: %s\n\n", data_formatada);
system("PAUSE");
return 0;
}
O resultado da execução deste código será algo como: Resultado da formatação: segunda-feira, 23 de abril de 2011 Veja abaixo os especificadores de formatação usadas pela função strftime(): %a - Nome do dia da semana na forma abreviada. Ex: seg. %A - Nome completo do dia da semana. Ex: terça-feira. %b - Nome do mês abreviado. Ex: abr. %B - Nome completo do dia do mês. Ex: abril %c - Representação de data e hora. Ex: 23/4/2011 23:00:37. %d - Dia do mês (01-31). %H - Hora no formato 24 horas (00-23). %I - Hora no formato 12 horas (01-12). %j - Dia do ano (001-366). %m - Mês como um número decimal (01-12). %M - Minutos (00-59). %p - AM ou PM. %S - Segundos (00-61). %U - Número da semana tendo o primeiro domingo como o primeiro dia da primeira semana do ano (00-53). %w - Dia da semana como um número decimal tendo o domingo como 0 (0-6). %W - Número da semana tendo a primeira segunda-feira como o primeiro dia da primeira semana do ano (00-53). %x - Representação de data. Ex: 23/4/2011. %X - Representação de horas. Ex: 23:00:37. %y - Ano de dois dígitos (00-99). %Y - Ano com quatro dígitos. %Z - Nome ou abreviação do fuso horário. %% - Um sinal de porcentagem. |
Java ::: Tratamento de Erros ::: Erros de Tempo de Execução |
Como tratar o erro IndexOutOfBoundsException do Java - A exceção IndexOutOfBoundsException da linguagem JavaQuantidade de visualizações: 18156 vezes |
|
A exceção IndexOutOfBoundsException é uma exceção (erro) que acontece quando fornecemos um índice fora dos limites permitidos para o acesso de elementos em um vetor, matriz, string ou demais coleções. Lembre-se de que os índices em Java começam em 0 e vão até a quantidade de elementos menos 1. Antes de vermos os exemplos, observe a posição da classe pública IndexOutOfBoundsException na hierarquia de classes da plataforma Java:
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
java.lang.IndexOutOfBoundsException
Esta classe implementa a interface Serializable e possui duas sub-classes conhecidas: ArrayIndexOutOfBoundsException e StringIndexOutOfBoundsException. Veja um exemplo no qual tentamos acessar um elemento de um vetor usando um índice inválido:
public class Estudos{
public static void main(String args[]){
// um array de quatro elementos
int[] valores = {5, 23, 76, 3};
// vamos fornecer um índice inválido
System.out.println(valores[4]);
System.exit(0);
}
}
Este código compila normalmente. Porém, ao tentarmos executá-lo, temos a seguinte mensagem de erro: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4 at Estudos.main(Estudos.java:7) A forma mais adequada de corrigir este erro é fornecendo um valor de índice que realmente esteja na faixa permitida. Veja agora o mesmo trecho de código usando uma string:
public class Estudos{
public static void main(String args[]){
String nome = "Java";
// vamos fornecer um índice inválido
System.out.println(nome.charAt(4));
System.exit(0);
}
}
Compile este código e execute-o. Você verá a seguinte mensagem de erro: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 at java.lang.String.charAt(Unknown Source) at Estudos.main(Estudos.java:6) Vamos fazer o mesmo usando uma ArrayList:
import java.util.ArrayList;
public class Estudos{
public static void main(String[] args){
// cria uma ArrayList que conterá strings
ArrayList<String> nomes = new ArrayList<String>();
// adiciona itens na lista
nomes.add("Carlos");
nomes.add("Maria");
nomes.add("Fernanda");
nomes.add("Osmar");
// fornecemos um índica inválido
String nome = nomes.get(4);
System.out.println("O valor obtido foi: " + nome);
System.exit(0);
}
}
Compile, execute e veja a mensagem de erro: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4 at java.util.ArrayList.RangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) at Estudos.main(Estudos.java:15) Veja que no caso do vetor, a exceção lançada foi ArrayIndexOutOfBoundsException, no caso da string a exceção foi StringIndexOutOfBoundsException e no caso do ArrayList tivemos IndexOutOfBoundsException. Resolvemos abordar estas três exceções em apenas uma anotação para que você perceba a semelhança entre elas. |
C++ ::: Win32 API (Windows API) ::: Arquivos e Diretórios |
C++ Windows API - Como ler o conteúdo de um arquivo usando a função ReadFile() da Win32 APIQuantidade de visualizações: 9309 vezes |
|
A função ReadFile() é usada quando queremos ler o conteúdo de um arquivo. A leitura se inicia na posição zero do arquivo e mantém um ponteiro de arquivo, a partir do qual as leituras subsequentes ocorrerão. Esta função pode ser usada para leituras síncronas e assíncronas. Para leituras apenas assíncronas devemos usar ReadFileEx(). Veja seu protótipo na documentação da API do Windows: BOOL WINAPI ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ); Antes de vermos um exemplo de como usar a função ReadFile(), vamos dar uma olhada em seus parâmetros: a) HANDLE hFile - Este é o handle para o arquivo a partir do qual queremos ler. Tal handle deve ser criado com o direito de acesso GENERIC_READ. b) LPVOID lpBuffer - Um ponteiro para o buffer que receberá os dados lidos do arquivo. c) DWORD nNumberOfBytesToRead - O número máximo de bytes a serem lidos de cada vez. Geralmente este número está relacionado à quantidade de bytes dos elementos do buffer. d) LPDWORD lpNumberOfBytesRead - Um ponteiro para uma variável que receberá o número de bytes lidos. A função ReadFile() define o valor desta variável como 0 antes de cada leitura e verificação de erros. e) LPOVERLAPPED lpOverlapped - Um ponteiro para um estrutura OVERLAPPED. Esta estrutura é exigida se o handle para o arquivo for obtido usando FILE_FLAG_OVERLAPPED para o parâmetro dwFlagsAndAttributes da função CreateFile(). Geralmente usamos NULL para este parâmetro. A função ReadFile() retorna quando um erro ocorre ou a quantidade de bytes solicitados é alcançada. Veja um trecho de código no qual lemos o conteúdo de um arquivo chamado testes.txt:
#include <cstdlib>
#include <iostream>
#include <windows.h>
#define TAM_BUFFER 256 // tamanho do buffer em bytes
using namespace std;
int main(int argc, char *argv[]){
// nome do arquivo
CHAR arquivo[] = "C:\\testes.txt";
CHAR buffer[TAM_BUFFER]; // buffer para o conteúdo do arquivo
DWORD nIn; // bytes lidos
// vamos abrir o arquivo para leitura.
// se o arquivo não existir uma mensagem de erro é exibida.
HANDLE hArquivo = CreateFile(arquivo, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hArquivo == INVALID_HANDLE_VALUE){
cout << "Erro ao abrir o arquivo: " << GetLastError() << endl;
}
else{
// arquivo aberto com sucesso. Vamos ler
while(ReadFile(hArquivo, buffer, TAM_BUFFER, &nIn, NULL) && nIn > 0){
cout << "Efetuei a leitura de " << nIn << " bytes." << endl;
// vamos adicionar o caractere de final de linha
// caso os bytes lidos não preencham todo o buffer
buffer[nIn] = 0;
cout << "Conteudo da leitura: " << buffer << endl;
}
}
// vamos fechar o handle
CloseHandle(hArquivo);
system("PAUSE");
return EXIT_SUCCESS;
}
|
Delphi ::: Data Access Controls (Controles de Acesso a Dados) ::: TClientDataSet |
Como usar o componente TClientDataSet do Delphi em suas aplicações de banco de dadosQuantidade de visualizações: 16427 vezes |
|
Um objeto da classe TClientDataSet implementa um conjunto de dados independente de banco de dados. Este controle representa um conjunto de dados em memória (in-memory). Antes de prosseguirmos, veja a posição desta classe na hierarquia de classes do Delphi:
System.TObject
Classes.TPersistent
Classes.TComponent
DB.TDataSet
DBClient.TCustomClientDataSet
DBClient.TClientDataSet
Um controle TClientDataSet pode ser usado das seguintes formas: a) Um conjunto de dados baseado em arquivo, único e totalmente funcional direcionado a aplicações compostas de apenas uma camada. Quando usado desta forma, o client dataset representa os dados armazenados em um arquivo dedicado na máquina do usuário. b) Um buffer em memória local dos registros de um outro conjunto de dados. O outro conjunto de dados (a fonte dos dados) pode residir no mesmo formulário ou data module que o client dataset (por exemplo, quando o client dataset fornece navegação e edição para os dados de um conjunto de dados unidirecional). O conjunto de dados fonte pode também residir em um sistema separado quando o client dataset apoia a parte cliente de uma aplicação de bancos de dados de múltiplas camadas. A forma mais comum de se usar um controle TClientDataSet é acessando a aba Data Acccess da Tool Palette (Paleta de Ferramentas) e arrastando-o para o seu formulário. Em seguida ajustamos algumas de suas propriedades em tempo de design e pronto. Veja o passo-a-passo para configurar um TClientDataSet para representar uma tabela no banco de dados MySQL (outras dicas minhas mostram como efetuar a conexão com outros bancos de dados): 1) Certifique-se de que o banco de dados MySQL está devidamente configurado e funcionando. Inicie-o, anote o nome de usuário e senha e vamos começar. 2) Vá até a aba de componentes dbExpress e arraste um componente TSQLConnection para o formulário. Este é o componente responsável pela conexão com o banco de dados. Selecione o componente no formulário de forma a acessar suas propriedades no Object Inspector. Em seguida siga atentamente as observações a seguir: a) Vá na propriedade ConnectioName e selecione MySQLConnection. Automaticamente a propriedade Driver é definida como MySQL. A propriedade LibrayName será definida como dbxmys.dll. O mesmo acontece com a propriedade VendorLib, que é definida como libmysql.dll. dbxmys.dll é fornecida com o Delphi enquanto libmysql.dll vem com a instalação do MySQL e deverá estar em C:\Windows\System para que sua aplicação seja executada com sucesso. b) O simples fato de definirmos o valor MySQL para a propriedade ConnectionName faz com que os parâmetros de conexão sejam criados com os valores padrões e guardados na propriedade Params. O próximo passo é alterar estes valores de forma a refletir a realidade do banco de dados que vamos usar. Vá em Params e acione o editor Value List Editor. Em HostName você deverá informar o nome ou IP do servidor MySQL. Se estiver rodando localmente use apenas "localhost". Em Database informe o nome da base de dados, por exemplo, "estoque". Em User_Name informe o usuário do banco de dados. Geralmente é "root". Em Password informe a senha do banco de dados. Pressione OK. c) Vá na propriedade LoginPrompt e altere seu valor para False. Isso evita que a tela de login seja exibida quando tentarmos efetuar a conexão. Agora vá na propriedade Connected e altere seu valor para True. Se correr tudo bem você já estará conectado ao banco de dados MySQL. 3) Agora coloque um componente TSQLDataSet no formulário e defina sua propriedade SQLConnection para o componente TSQLConnection que representa a conexão com o banco de dados. Em seguida defina o valor "ctTable" para a propriedade CommandType. Na propriedade CommandText você deverá informar o nome da tabela que será representada por este TSQLDataSet. Finalmente ajuste a propriedade Active para True. 4) O próximo passo é colocar no formulário um componente TDataSetProvider (na aba Data Access). Este componente é responsável por fazer a conexão com o conjunto de dados (dataset), extrair os dados do SQLDataSet e gerar os comandos de atualização SQL adequados. Assim, informe o valor "SQLDataSet1" para a sua propriedade DataSet. 5) Finalmente chegamos ao componente TClientDataSet. Vá na aba Data Acccess e arraste um TClientDataSet para o formulário. Em seguida informe o valor "DataSetProvider1" para sua propriedade ProviderName. Ajuste sua propriedade Active para True. 6) Hora de exibir e manipular os dados. Vá na aba Data Access e arraste um controle TDataSource para o formulário. Aponte sua propriedade DataSet para "ClientDataSet1". Agora vá na aba Data Controls e arraste um TDBGrid para o formulário. Ajuste sua propriedade DataSource para "DataSource1". Se tudo correu bem, você já verá os registros da tabela serem exibidos no DBGrid. 7) Hora de executar a aplicação. Pressione F9 e vamos ao resultado. Experimente navegar e editar os registros no DBGrid. A aplicação permitirá que você faça isso. No entanto, ao fechar a aplicação e abrí-la novamente você perceberá que as alterações não foram refletidas no banco de dados. Para que isso aconteça, coloque o código abaixo no evento Click de um botão:
procedure TForm3.Button1Click(Sender: TObject);
begin
if (ClientDataSet1.ChangeCount > 0) then
ClientDataSet1.ApplyUpdates(-1);
end;
Pronto. Execute a aplicação novamente e faça modificações nos dados exibidos no DBGrid (é preciso sair da linha de edição para que os dados sejam atualizados no DBGrid). Clique no botão para atualizar os dados na tabela do banco de dados. Feche a aplicação a abra-a novamente. Note que agora os dados foram atualizados com sucesso. Esta dica foi escrita e testada no Delphi 2009. |
Desafios, Exercícios e Algoritmos Resolvidos de Delphi |
Veja mais Dicas e truques de Delphi |
Dicas e truques de outras linguagens |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |




