C# ::: Dicas & Truques ::: Gráficos

Como desenhar gráficos em C# usando GDI+ - Computação gráfica em C# - Passos inicias

Quantidade de visualizações: 17256 vezes
Qualquer um que queira iniciar os estudos e desenhos de gráficos em C# usando Windows Forms deve obrigatoriamente entender um pouco de GDI e GDI+. GDI é o acrônimo de Graphics Device Interface e GDI+ é o seu sucessor em versões mais recentes do Microsoft Windows. Com a indepedência do GDI+ podemos desenhar em um formulário, na tela ou impressora sem qualquer modificação no código. O próprio GDI+ se encarrega dos detalhes da implementação de cada um destes diferentes dispositivos.

O GDI+ é uma interface de programação de aplicações (API) que forma o sub-sistema do sistema operacional Microsoft Windows XP. Esta API é a responsável pela exibição de informações na tela e impressoras. O GDI+ é uma DLL Win32 chamada de gdiplus.dll que é distribuída com o Windows XP e versões mais recentes do Windows. Esta DLL está também disponível para uso em versões do Windows anteriores ao XP.

A plataforma .NET encapsula as funcionalidades do GDI+ nos seguintes namespaces: System.Drawing, System.Drawing.Drawing2D, System.Drawing.Imaging, System.Drawing.Text e System.Drawing.Printing.

Antes de iniciar seus desenhos em C# e Windows Forms, é importante entender o sistema de coordenadas do GDI+. Este sistema usa a medida de pixels ("picture elements"), que é a menor unidade de resolução no display de um monitor. Assim, o canto superior esquerdo de um controle GUI (um formulário, um painel, botão, etc) tem as coordenadas (0, 0), ou seja, x = 0 e y = 0. Lembre-se de que x é o eixo horizontal e y é o eixo vertical.

A classe Graphics, do pacote System.Drawing, é quem fornece boa parte dos métodos que usamos para desenhar em C# e Windows Forms. Veja sua posição na hierarquia de classes da plataforma .NET:

System.Object 
  System.MarshalByRefObject 
    System.Drawing.Graphics

Um objeto desta classe pode ser obtido com uma chamada ao método CreateGraphics() a partir de um objeto que herda de System.Windows.Forms.Control ou gerenciando o evento Paint do controle e acessando a propriedade Graphics da classe System.Windows.Forms.PaintEventArgs.

Veja um trecho de código no qual desenhamos uma linha horizontal no formulário a partir do clique de um botão:

private void button1_Click(object sender, EventArgs e){
  // vamos obter o Graphics do formulário
  Graphics g = this.CreateGraphics();

  // vamos desenhar uma linha horizontal de 300 pixels na
  // cor preta e espessura de 1 pixel
  g.DrawLine(new Pen(Color.Black, 1), new Point(20, 80), 
    new Point(320, 80));

  // vamos liberar o objeto Graphics
  g.Dispose();
}



Java ::: Desafios e Lista de Exercícios Resolvidos ::: Métodos, Procedimentos e Funções

Exercícios Resolvidos de Java - Métodos - Um método estático que recebe um vetor de inteiros e o exibe

Quantidade de visualizações: 2490 vezes
Exercício Resolvido de Java - Métodos - Um método estático que recebe um vetor de inteiros e o exibe

Pergunta/Tarefa:

Escreva um método Java que recebe um vetor de inteiros e o exibe. Este método deverá ter a seguinte assinatura:

public static void exibirVetor(int[] vetor){
  // sua implementação aqui
}
Este método deverá, obrigatoriamente, estar na classe principal (aquela que contém o método main()). Para testar o método, declare e construa um vetor de 5 inteiros. Em seguida peça ao usuário para informar os valores do vetor e o passe para o método exibirVetor().

Sua saída deverá ser parecida com:



Resposta/Solução:

Veja a resolução comentada deste exercício usando Java console:

package estudos;

import java.util.Scanner;

public class Estudos {
  public static void main(String[] args) {
    Scanner entrada = new Scanner(System.in);
    
    // vamos declarar e construir um vetor de 5 inteiros
    int valores[] = new int[5];
    
    // agora vamos pedir que o usuário informe os valores
    for(int i = 0; i < valores.length; i++){
      System.out.print("Informe o valor para o " + (i + 1) + " elemento: ");
      valores[i] = Integer.parseInt(entrada.nextLine());
    }
    
    // e agora vamos passar o vetor para o método exibirVetor()
    System.out.println("\nOs elementos do vetor são:\n");
    exibirVetor(valores);
    
    System.out.println("\n");
  }
  
  // um método estático que recebe um vetor de inteiros e o exibe
  public static void exibirVetor(int[] vetor){
    // vamos percorrer os elementos do vetor e exibir cada um
    for(int i = 0; i < vetor.length; i++){
      System.out.print(vetor[i] + "   ");
    }
  }
}



C ::: Desafios e Lista de Exercícios Resolvidos ::: Strings e Caracteres

Exercícios Resolvidos de C - Como retornar o código ASCII associado a um caractere em C - Ler um caractere e retornar o código ASCII correspondente

Quantidade de visualizações: 593 vezes
Pergunta/Tarefa:

Escreva um programa C que pede para o usuário informar um caractere (letra ou número) e mostre o código ASCII correspondente.

Sua saída deverá ser parecida com:

Informe um caractere: A
Você informou o caractere: A
O código ASCII correspondente é: 65
Resposta/Solução:

Veja a resolução comentada deste exercício em C:

#include <stdio.h>
#include <stdlib.h>

// função principal do programa
int main(int argc, char *argv[]){
  // variáveis usadas na resolução do problema
  char caractere;
  int codigo;
  
  // vamos pedir para o usuário informar uma letra, símbolo ou pontuação
  printf("Informe um caractere: ");
    
  // vamos ler o caractere informado
  scanf("%c", &caractere);
    
  // agora vamos obter o código ASCII correspondente
  codigo = (int)caractere;
    
  // e mostramos o resultado
  printf("Você informou o caractere: %c", caractere);
  printf("\nO código ASCII correspondente é: %d", codigo);
  
  printf("\n\n");
  system("PAUSE");
  return 0;
}

O Código Padrão Americano para o Intercâmbio de Informação (do inglês American Standard Code for Information Interchange - ASCII, pronunciado [áski]) é um sistema de representação de letras, algarismos e sinais de pontuação e de controle, através de um sinal codificado em forma de código binário (cadeias de bits formada por vários 0 e 1), desenvolvido a partir de 1960, que representa um conjunto de 128 sinais: 95 sinais gráficos (letras do alfabeto latino, algarismos arábicos, sinais de pontuação e sinais matemáticos) e 33 sinais de controle, utilizando 7 bits para representar todos os seus símbolos.


Delphi ::: Data Access Controls (Controles de Acesso a Dados) ::: TClientDataSet

Como tornar o TClientDataSet do Delphi somente leitura usando a propriedade ReadOnly

Quantidade de visualizações: 11772 vezes
Em algumas situações gostaríamos que um TClientDataSet fosse somente leitura, ou seja, não queremos permitir inserção, atualização ou exclusão dos dados do dataset. Para isso podemos usar a propriedade ReadOnly. Se seu valor for True, os dados do TClientDataSet serão apenas para leitura. Se o valor for False, os dados podem ser modificados e/ou novos dados podem ser inseridos no dataset. O valor padrão é False.

Em tempo de design a propriedade ReadOnly do TClientDataSet pode ser ajustada selecionando-se o componente no formulário e acessando o Object Inspector. Em tempo de execução esta propriedade pode ser ajustada por meio do seguinte trecho de código:

procedure TForm3.Button3Click(Sender: TObject);
begin
  // vamos tornar o TClientDataSet somente leitura
  ClientDataSet1.ReadOnly := True;
end;

Se necessário, podemos obter o valor desta propriedade em tempo de execução da seguinte forma:

procedure TForm3.Button3Click(Sender: TObject);
begin
  // vamos verificar se o TClientDataSet é somente leitura
  if ClientDataSet1.ReadOnly then
    ShowMessage('O ClientDataSet é somente leitura')
  else
    ShowMessage('O ClientDataSet NÃO é somente leitura')
end;

Ao executarmos este código e clicarmos no botão teremos uma mensagem parecida com:

"O ClientDataSet NÃO é somente leitura".

É importante observar que se tentarmos efetuar alguma operação que modifica o conteúdo de um TClientDataSet somente leitura nós teremos uma exceção do tipo:

Project Project2.exe raised exception class EDatabaseError with message 'ClientDataSet1': Cannot modify a read-only dataset'.

Quando ajustamos o valor da propriedade ReadOnly para True, automaticamente a propriedade CanModify do dataset é ajustada para False.

Importante: Mesmo que o valor da propriedade ReadOnly seja False, os usuários ainda podem ser impedidos de modificar os dados de um client dataset se este obtém seus dados a partir de um provider (por exemplo: TDataSetProvider). A propriedade Options do provider pode limitar se os dados podem ser editados e, se puderem, os tipos de alterações permitidos.

Esta dica foi escrita e testada no Delphi 2009.


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

Como testar se um número é primo em C

Quantidade de visualizações: 2651 vezes
O Número Primo é o número maior que 1 e que só pode ser dividido por 1 e por ele mesmo, ou seja, números primos não podem ser divididos por outros números, a não ser por ele mesmo e pelo número 1. Dessa forma, 2, 3, 5, 7, 11, 13, 17, etc, são todos números primos.

É importante observar que 0 e 1 não são números primos, e que o número 2 é o único número primo par.

Veja agora um código C completo que pede para o usuário informar um número inteiro positivo e mostra uma mensagem indicando se o número informado é primo ou não:

#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[]){
  int numero, i;
  int primo = 1; // verdadeiro, true
	
  // vamos solicitar um número inteiro positivo
  printf("Informe um número inteiro positivo: ");
  scanf("%d", &numero);
    
  // o número é negativo?
  if(numero < 0){
    printf("Número inválido.\n\n");
  }
  // é 0 ou 1?
  else if((numero == 0) || (numero == 1)){
    printf("Número válido, mas não é primo.\n\n");
  }
  // passou até aqui. Vamos testar se o número é primo
  else{
    for (i = 2; i <= (numero / 2); i++){
      // se passar no teste, não é primo
      if (numero % i == 0) {
        primo = 0; // recebe false
        break;
      }
    }
      
    if(primo){
      printf("O número informado é primo\n\n");
    }
    else{
      printf("O número informado não é primo\n\n");
    }
  }
  
  printf("\n\n");
  system("PAUSE");
  return 0;
}

Ao executar este código C nós teremos o seguinte resultado:

Informe um número inteiro positivo: 9
O número informado não é primo


Java ::: Estruturas de Dados ::: Lista Ligada Simples

Estruturas de Dados em Java - Como inserir nós no final de uma lista singularmente ligada em Java

Quantidade de visualizações: 8153 vezes
Esta dica mostra como inserir nós no final de uma lista singularmente ligada. A classe usada para representar cada nó é a seguinte (No.java):

// classe No
public class No{
  public int valor;
  public No proximo;
}
// fim da classe No

Note que cada nó contém apenas um valor inteiro e um ponteiro para o próximo nó. Ao analisar o código você perceberá que tanto a inserção no final quanto a exibição dos nós são feitas usando métodos. Isso permitirá o reaproveitamento deste código em suas próprias implementações. Vamos ao código para a lista singularmente ligada (Lista.java):

public class Lista {
    No inicio, fim; // início e fim da lista

    // método que permite exibir os valores de
    // todos os nós da lista
    public void exibir() {
        // vamos obter uma referência ao início da lista
        No no = inicio;

        if (no != null) { // a lista não está vazia
            while (no != null) { // enquanto a lista não estiver vazia
                System.out.println(no.valor);
                no = no.proximo; // pula para o nó seguinte
            }
        } 
        else {
            System.out.println("A lista está vazia\n\n");
        }
    }

    // método que permite inserir nós no
    // final da lista.
    // veja que o método recebe o valor a ser
    // armazenado em cada nó
    public void inserirFinal(int v) {
        No novo = new No(); // cria um novo nó
        novo.valor = v;
        // é o nó no final, portanto não deverá apontar para nenhum
        // outro nó
        novo.proximo = null;

        // verifica se a lista está vazia
        if (inicio == null) {
            // novo aponta para o novo nó
            inicio = novo;
            // final deve apontar para o novo nó também
            fim = novo;
        } 
        else { // não está vazia....vamos inserir o nó no final da lista
            // o campo próximo do último nó aponta para o nó recém-criado
            fim.proximo = novo;
            // o campo fim aponta para o novo nó...o campo inicio permanece igual
            fim = novo;
        }
    }
}

Compile as classes No.java e Lista.java e vamos escrever um aplicativo de teste (Main.java):

public class Main {
    public static void main(String[] args) {
        // vamos criar uma nova lista
        Lista lista = new Lista();

        // vamos inserir quatro valores no
        // finalo da lista
        lista.inserirFinal(45);
        lista.inserirFinal(3);
        lista.inserirFinal(98);
        lista.inserirFinal(17);

        // exibe os valores na lista
        lista.exibir();
    }
}

Ao executar o aplicativo teremos o seguinte resultado:

45
3
98
17



PHP ::: Sistemas Completos com Código Fonte ::: Contas a Pagar e a Receber

Software de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento

Quantidade de visualizações: 22866 vezes
Como criar um Sistema de Gestão Financeira em PHP e MySQL, com contas pagas, recebidas, a pagar e a receber.



Antes de adquirir este código-fonte você pode testar a demonstração online aqui: Clique aqui para visualizar a demonstração (Live Demo) desse sistema. O usuário é "admin" e a senha é "admin". Pode testar o sistema à vontade e ficaremos gratos se você nos informar sobre algum bug ou até mesmo alguma sugestão para melhoria.

Você ainda controla todos os seus gastos usando planilhas do Excel? Sua empresa usa um emaranhado de planilhas do Excel para o seu fluxo de contas a pagar e a receber, receitas e despesas, cadastro de clientes e fornecedores e históricos de atendimentos? Você não está sozinho!

Como desenvolvedor eu conheço várias empresas que ainda não possuem um Sistema de Gestão de Contas a Pagar e a Receber, ou seja, usam Planilha de Contas a Pagar e Receber em Excel. Nada contra as planilhas do Excel, mas chega um momento que as informações são tantas que nos perdemos no meio de tantas planilhas.

Assim, depois de atender vários clientes com esta demanda eu resolvi fazer um software financeiro e disponibilizar o código fonte de um sistema de contas a pagar e a receber para os visitantes do site.

Note que o visual é bem limpo e agradável. E o melhor: a facilidade de uso. Você pode usá-lo em sua empresa, nas empresas de seus clientes e até mesmo em casa, para controlar as suas finanças pessoais.

Quais recursos foram usados para o desenvolvimento do software?

O código fonte deste software de gestão de controle financeiro foi escrito em PHP e MySQL. Para os recursos visuais eu usei o Bootstrap, jQuery, CSS, jChart, Datatables e algumas outras ferramentas. Todo o código está comentado e não há nada de exibicionismo não, apenas código simples e funcionando 100%. Todas as bibliotecas acompanham o código, de forma que você não precisará baixar e instalar mais nada.

Posso testar o código fonte antes de comprar?

Sim, colocamos aqui no site uma demonstração do sistema em funcionamento. Você pode acessá-lo clicando no link Clique aqui para visualizar a demonstração (Live Demo) desse sistema. O usuário é "admin" e a senha é "admin". Pode testar o sistema à vontade e ficaremos gratos se você nos informar sobre algum bug ou até mesmo alguma sugestão para melhoria.

O sistema é fácil de instalar?

Sim, junto com o código fonte nós adicionamos instruções detalhadas de como criar a base de dados e as tabelas do MySQL. Em seguida você só precisa ajustar o servidor, usuário e senha do banco de dados no arquivo config.php, definir o caminho para os uploads das fotos dos usuários, clientes e fornecedores e anexos dos pagamentos e recebimentos e executar o index.php. E o melhor de tudo: com apenas alguns "copiar-colar" você adiciona mais funcionalidades ao sistema, tornando-o ainda mais útil.

Como posso obter este código fonte?

Para mais informações sobre como adquirir este código fonte, instruções para instalação e até mesmo solicitar alterações ou adições no sistema, basta me chamar no WhatsApp +55 (062) 98553-6711

Não se esqueça: Uma boa forma de estudar o código é fazendo pequenas alterações e rodando para ver os resultados. Outra opção é começar um projeto PHP do zero e ir adicionando trechos do código fonte para melhor entendimento de suas partes.


Ruby ::: Fundamentos da Linguagem ::: Passos Iniciais

Como retornar a versão do Ruby instalada na sua máquina usando ruby -v ou a constante RUBY_DESCRIPTION

Quantidade de visualizações: 9372 vezes
Se você quiser saber a versão do Ruby instalada em seu computador, ou a versão do interpretador sendo usado no momento, basta abrir uma janela de comando e disparar o comando:

ruby -v

Você terá um resultado parecido com o seguinte:

ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x64-mingw32]

Se você estiver na tela do Interactive Ruby, você pode simplesmente digitar RUBY_DESCRIPTION e pressionar Enter. O resultado será o mesmo exibido em uma janela de comando usando ruby -v.

Podemos também usar a constante RUBY_DESCRIPTION dentro de um script Ruby. Veja:

# Este exemplo mostra como obter a versão do Ruby
# usando a constante RUBY_DESCRIPTION
 
# guarda a versão em uma variável
versao = RUBY_DESCRIPTION

# mostra na tela
puts "A versão do Ruby é: #{versao}"

Ao executar este código Ruby nós teremos o seguinte resultado:

A versão do Ruby é: ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x64-mingw32]


C++ ::: Win32 API (Windows API) ::: Arquivos e Diretórios

Como renomear arquivos e diretórios em C++ usando a função MoveFile() da API do Windows

Quantidade de visualizações: 8781 vezes
A função MoveFile() da API do Windows pode ser usada quando precisamos renomear um arquivo ou diretório. Veja seu protótipo:

BOOL WINAPI MoveFile(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName
);


Note que só precisamos fornecer o nome atual e o novo nome do arquivo ou diretório que queremos renomear. Se houver algum erro ao renomear o arquivo ou diretório, a função MoveFile() retornará o valor 0 (zero). Se a operação for efetuada com sucesso, um valor diferente de 0 (zero) será retornado. É sempre uma boa idéia usar a função GetLastError() para retornar o código do erro em caso de falha.

Veja um trecho de código no qual renomeamos um arquivo:

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[]){
  // nome atual do arquivo
  CHAR nome_atual[] = "C:\\testes.txt";
  // novo nome do arquivo
  CHAR nome_novo[] = "C:\\novo.txt";
  
  // vamos renomear o arquivo
  if(MoveFile(nome_atual, nome_novo)){
    cout << "Arquivo renomeado com sucesso." << endl;                      
  }
  else{
    cout << "Erro ao renomear o arquivo: " << 
      GetLastError() << endl;     
  }
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Aqui nós estamos alterando o nome do arquivo testes.txt para novo.txt. Os possíveis erros nesta operação são:

a) ERROR_FILE_NOT_FOUND - Ocorre quando o arquivo fornecido como primeiro argumento para a função MoveFile() não existe. O código para este erro é 2 e a mensagem em português é "O sistema não pode encontrar o arquivo especificado (The system cannot find the file specified)".

b) ERROR_ALREADY_EXISTS - Ocorre quando o arquivo fornecido como segundo argumento para a função MoveFile() já existe. O código para este erro é 183 e a mensagem em português é "Não é possível criar um arquivo já existente (Cannot create a file when that file already exists)".

Veja agora um trecho de código no qual renomeamos um diretório:

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[]){
  // nome atual do diretório
  CHAR nome_atual[] = "C:\\imagens";
  // novo nome do diretório
  CHAR nome_novo[] = "C:\\imagens2";
  
  // vamos renomear o diretório
  if(MoveFile(nome_atual, nome_novo)){
    cout << "Diretório renomeado com sucesso." << endl;                      
  }
  else{
    cout << "Erro ao renomear o diretório: " << 
      GetLastError() << endl;     
  }
  
  system("PAUSE");
  return EXIT_SUCCESS;
}



Delphi ::: Dicas & Truques ::: Arquivos e Diretórios

Como renomear um arquivo em Delphi usando a função RenameFile()

Quantidade de visualizações: 21970 vezes
Em algumas situações nossas aplicações precisam renomear arquivos. Em Delphi isso pode ser feito com o auxílio da função RenameFile(), presente na unit SysUtils. Esta função requer o caminho e nome do arquivo a ser renomeado e o novo nome e caminho. O retorno será true se a operação for realizada com sucesso e false em caso contrário. Veja o exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
  arquivo_original, novo_arquivo: string;
begin
  // diretorio e nome do arquivo original
  arquivo_original := 'C:\arquivo de codigos\dados.txt';

  // diretorio e nome do novo arquivo
  novo_arquivo := 'C:\arquivo de codigos\dados2.txt';

  // vamos renomear o arquivo
  if RenameFile(arquivo_original, novo_arquivo) then
    ShowMessage('O arquivo foi renomeado com sucesso')
  else
    ShowMessage('Não foi possível renomear o arquivo');
end;

Observe que não é possível renomear um arquivo de forma que seu caminho possua drives diferentes. Para estes casos é recomendável que você copie o arquivo para o drive desejado e exclua o arquivo anterior.

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

Carregar Publicações Anteriores


Nossas 20 dicas & truques de programação mais populares

Você também poderá gostar das dicas e truques de programação abaixo

Nossas 20 dicas & truques de programação mais recentes

Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site

Últimos Exercícios Resolvidos

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

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



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