Struct – Estrututas – C++ e C#

Publicado: 14 de março de 2014 em C#, C/C++

Na Ciência da computação, uma estrutura de dados é um modo particular de armazenamento e organização de dados em um computador de modo que possam ser usados eficientemente.

Diferentes tipos de estrutura de dados são adequadas a diferentes tipos de aplicação e algumas são altamente especializadas, destinando-se a algumas tarefas específicas.

Struct

A palavra-chave estrutura define um tipo de estrutura e / ou de uma variável de um tipo de estrutura. Um tipo struct é um tipo de valor que normalmente é usado para encapsular pequenos grupos de variáveis ​​relacionadas, tais como as coordenadas de um retângulo ou as características de um item em um inventário.

É uma declaração que define uma lista de variáveis ​​a serem colocados sob o mesmo nome em um bloco de memória, permitindo que as diferentes variáveis ​​possam ser acessadas através de um único ponteiro.

O struct é uma palavra chave derivada da linguagem C, e não possui seu equivalente em Java, mas possui seu equivalente em ABAP e Python.

Abap : https://desenvolvimentoaberto.wordpress.com/2014/02/20/tipos-complexos-structures-abap/

Em Python um tuplas também pode armazenar diferentes tipos dentro de uma estrutura: https://desenvolvimentoaberto.wordpress.com/2014/02/22/tuples-tuplas-python-linux/

Exemplo:

Neste programa criamos uma estrutura de clientes.

C++

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

struct Cliente
{
	string nome;
	string logradouro;
	string endereco;
	int numero;
	string complemento;
	string bairro;
	string cidade;
	string contato;
	string cargo;
	int cep;
	long RG;
	long cpf;

};

int _tmain(int argc, _TCHAR* argv[])
{
	Cliente dados;

		dados.nome = "Instituto Brasileiro de Geografia e Estatística";
		dados.logradouro = "Avenida";
		dados.endereco = "Beira Mar";
		dados.numero = 436;
		dados.complemento = "13o Andar";
		dados.bairro = "Castelo";
		dados.cep = 20021060;
		dados.cidade = "Rio de Janeiro";
		dados.contato = "Mario de Oliveira Aguiar";
		dados.cargo = "Gerente";
		dados.RG = 999999999;
		dados.cpf = 99999999999;

		cout << "Empresa: " << dados.nome << endl;
		cout << dados.logradouro << " " << dados.endereco << " " <<
			dados.numero << " " << dados.complemento << endl;
		cout << "Cep: " << dados.cep << " " << dados.bairro << " " << dados.cidade << endl;
		cout << endl;
		cout << "Contato: " << dados.contato << " - " << dados.cargo << endl;
		cout << "Rg: " << dados.RG << " - Cpf: " << dados.cpf << endl;

		cout << endl;
		system("pause");

	return 0;
}

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
{
    class Program
    {
         struct Cliente
        {
            public string nome;
            public string logradouro;
            public string endereco;
            public int numero;
            public string complemento;
            public string bairro;
            public string cidade;
            public string contato;
            public string cargo;
            public int cep;
            public long RG;
            public long cpf;
        }
        static void Main(string[] args)
        {
            Cliente dados = new Cliente();

            dados.nome = "Instituto Brasileiro de Geografia e Estatística";
            dados.logradouro = "Avenida";
            dados.endereco = "Beira Mar";
            dados.numero = 436;
            dados.complemento = "13o Andar";
            dados.bairro = "Castelo";
            dados.cep = 20021060;
            dados.cidade = "Rio de Janeiro";
            dados.contato = "Mario de Oliveira Aguiar";
            dados.cargo = "Gerente";
            dados.RG = 999999999;
            dados.cpf = 99999999999;

            Console.WriteLine( "Empresa: " + dados.nome);
            Console.WriteLine( dados.logradouro + " " + dados.endereco + " " +
                dados.numero + " " + dados.complemento);
            Console.WriteLine( "Cep: " + dados.cep + " " + dados.bairro + " " + dados.cidade );
            Console.WriteLine();
            Console.WriteLine( "Contato: " + dados.contato + " - " + dados.cargo);
            Console.WriteLine( "Rg: " + dados.RG + " - Cpf: " + dados.cpf );

            Console.WriteLine( );
            Console.ReadKey();
        }

    }
}

RadioButton

Em computação, um botão de opção ou botão de rádio (Radiobutton) é um elemento de interface gráfica (isto é um componente widget) com dois estados: selecionado (ativado) e não-selecionado (desativado), quando o usuário pressiona um botão do mouse ou uma tecla como Espaço. Botões de opção são usados num grupo para apresentar um conjunto limitado de escolhas (duas ou mais) que são mutuamente exclusivas. Deste maneira, quando o usuário seleciona um outro botão no mesmo conjunto, o outro botão já selecionado torna-se automaticamente desativado.

Grid

É o gerente de geometria de grade coloca os widgets em uma tabela bi-dimensional. O Widget mestre é dividido em um número de linhas e colunas, e cada “célula” na tabela resultante pode conter um widget.

Utilizar o gerenciador de grade é fácil. Basta criar os widgets, e usar o método grade para dizer ao gerente em que linha e coluna quer os colocar. Você não tem que especificar o tamanho da grade de antemão, o gerente determina automaticamente que a partir dos widgets na mesma. Linhas e colunas vazias são ignoradas.

Sticky

Os widgets são centrados em suas células. Você pode usar a opção Sticky para mudar isso, esta opção tem um ou mais valores do conjunto N, S, E, W. Para alinhar os rótulos para a borda esquerda, direita, cima e baixo.

ColumnSpan e  Rowspan

Os widgets podem abranger mais de um célula. A opção ColumnSpan é usada para permitir que um Widget alcance mais de uma coluna, e a opção rowspan deixa abranger mais de uma linha.

radiobutton

Exemplo:

Neste exemplo criamos um grupo de botões de radio que efetua as 4 operações básicas da matemática, usando o evento de item e a verificação do seu estado. Você deve obter um programa Linux como na imagem acima.

Python

#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Desenvolvimento Aberto
# Radiobutton.py

# importa modulo
from Tkinter import *

# Cria formulario
formulario = Tk()
formulario.title = "Desenvolvimento Aberto"

# Evento CB on click
def evento1():
    if (r1.get() == 1):
         texto.insert(END,"Somar:\n")

def evento2():
    if (r1.get() == 2):
         texto.insert(END,"Subtrair:\n")

def evento3():
    if (r1.get() == 3):
         texto.insert(END,"Multiplicar:\n")

def evento4():
    if (r1.get() == 4):
         texto.insert(END,"Dividir:\n")

# Evento do botão
def callback():
    if (r1.get() == 1):
        n1 = float(campo1.get())
        n2 = float(campo2.get())
        total =  n1 + n2
        texto.insert(END, campo1.get() + " + " + campo2.get() + " = " + str(total) + "\n")

    if (r1.get() == 2):
        n1 = float(campo1.get())
        n2 = float(campo2.get())
        total =  n1 - n2
        texto.insert(END, campo1.get() + " - " + campo2.get() + " = " + str(total) + "\n")

    if (r1.get() == 3):
        n1 = float(campo1.get())
        n2 = float(campo2.get())
        total =  n1 * n2
        texto.insert(END, campo1.get() + " * " + campo2.get() + " = " + str(total) + "\n")

    if (r1.get() == 4):
        n1 = float(campo1.get())
        n2 = float(campo2.get())
        total =  n1 / n2
        texto.insert(END, campo1.get() + " / " + campo2.get() + " = " + str(total) + "\n")

# Define variavel para status do RadioButton
r1 = IntVar()

# Cria um novo label
rotulo = Label(formulario, text = "Escolha uma Opcao")

# Identa linhas usando o caracter continuacao de linua

# Cria os Componentes
opc1 = Radiobutton(formulario, text = "Somar", variable = r1, value =1, command = evento1)

opc2 = Radiobutton(formulario, text = "Subtrair", variable = r1, value = 2, command = evento2)

opc3 = Radiobutton(formulario, text = "Multiplicar", variable = r1, value =3, command = evento3)

opc4 = Radiobutton(formulario, text = "Dividir", variable = r1, value = 4, command = evento4)

rotulo1 = Label(formulario, text = "Numero 1:")

rotulo2 = Label(formulario, text = "Numero 2:")

campo1 = Entry(formulario)

campo2 = Entry(formulario)

botao = Button(formulario, text="Ok", command = callback)
texto = Text(formulario, height = 10, width = 50)

# Adiciona Componentes no Grid
rotulo.grid(sticky=W)

opc1.grid(row=1, sticky=W)
opc2.grid(row=2, sticky=W)
opc3.grid(row=3, sticky=W)
opc4.grid(row=4, sticky=W)

rotulo1.grid(row=5,sticky=W)
campo1.grid(row=5, columnspan=2)
rotulo2.grid(row=6,sticky=W)
campo2.grid(row=6, columnspan =2)

botao.grid(row=6, columnspan= 3, sticky=E)

texto.grid(row=7)

# Roda o loop principal do tcl
mainloop()

Diferentemente das linguagens baseadas no Microsoft Framework, o MFC utiliza C++ nativo e trabalha direto no conceito do sistema operacional Windows manipulando mensagens diretamente das APIs do Windows, portanto o que é muito simples como  programar em uma linguagem de alto nível, aqui fica um pouco diferente e um pouco mais complicado, é o caso de verificar o simples status de um Checkbox ou um Radiobutton.

RadioButton

Em computação, um botão de opção ou botão de rádio (Radiobutton) é um elemento de interface gráfica (isto é um componente widget) com dois estados: selecionado (ativado) e não-selecionado (desativado), quando o usuário pressiona um botão do mouse ou uma tecla como Espaço. Botões de opção são usados num grupo para apresentar um conjunto limitado de escolhas (duas ou mais) que são mutuamente exclusivas. Deste maneira, quando o usuário seleciona um outro botão no mesmo conjunto, o outro botão já selecionado torna-se automaticamente desativado.

GetCheckedRadioButton

É uma função que retorna um valor equivalente ao Checked (marcado) em linguagens de alto nível, neste caso recupera o ID do botão de opção atualmente verificado no grupo especificado e retorna o ID do botão de opção marcada, ou 0 se nenhum for selecionado.

Visual Studio

Escolha um novo projeto MFC Application, e marque Dialog Based, em Design Time, apague os componentes default e coloque um 3 StaticTexts, 4 Radiobuttons, 3 EditsControl e um botão. Mude as propriedades de um EditControl para Multiline = true, Read Only = true e Vertical Scroll = true. Use a imagem abaixo para referencia do design.

radiobutton_design

Aqui levamos em consideração que você já sabe como usar as variáveis para os componentes e como criar seus respectivos eventos, caso ainda não saiba veja nosso primeiro post MFC. Crie as variáveis como na imagem abaixo:

radiobutton_var

Crie os eventos BN_CLICKED para cada RadioButton e  para o botão. Use o código abaixo para completar o código gerado automaticamente, seu programa deve apresentar o seguinte resultado:

radiobutton_exe

Exemplo:

Neste exemplo criamos um grupo de botões de radio que efetua as 4 operações básicas da matemática, usando o evento de item e a verificação do seu estado.

C++


// RadioBDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RadioB.h"
#include "RadioBDlg.h"
#include "afxdialogex.h"
#include "Windowsx.h"
#include <assert.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// Dialog Data
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()

// CRadioBDlg dialog

CRadioBDlg::CRadioBDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CRadioBDlg::IDD, pParent)

{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CRadioBDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT1, campo1);
	DDX_Control(pDX, IDC_EDIT2, campo2);
	DDX_Control(pDX, IDC_BUTTON1, botao);
	DDX_Control(pDX, IDC_EDIT3, texto);
}

BEGIN_MESSAGE_MAP(CRadioBDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_RADIO1, &CRadioBDlg::OnBnClickedRadio1)
ON_BN_CLICKED(IDC_RADIO2, &CRadioBDlg::OnBnClickedRadio2)
ON_BN_CLICKED(IDC_RADIO3, &CRadioBDlg::OnBnClickedRadio3)
ON_BN_CLICKED(IDC_RADIO4, &CRadioBDlg::OnBnClickedRadio4)
ON_BN_CLICKED(IDC_BUTTON1, &CRadioBDlg::OnBnClickedButton1)
END_MESSAGE_MAP()

// CRadioBDlg message handlers

BOOL CRadioBDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CRadioBDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CRadioBDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CRadioBDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

/**

  Nosso Código começa Aqui

  **/

// Evento on click do RadioButton - Append menssagem

void CRadioBDlg::OnBnClickedRadio1()
{

		int tam = texto.GetWindowTextLengthW();
		texto.SetSel(tam, tam);
		texto.ReplaceSel(L"Somar:\n");

}

void CRadioBDlg::OnBnClickedRadio2()
{

	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Subtrair:\n");
}

void CRadioBDlg::OnBnClickedRadio3()
{

	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Multiplicar:\n");
}

void CRadioBDlg::OnBnClickedRadio4()
{

	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Dividir:\n");
}

// Evento On Click do Botão -- Efetua o calculo

void CRadioBDlg::OnBnClickedButton1()
{

	CString valor1;
	CString valor2;
	CString dTOstr;
	double total;

	//Captura valor dos TextControls
	campo1.GetWindowTextW(valor1);
	campo2.GetWindowTextW(valor2);

	// Verifica qual RadioButton esta checado
	int RadioStatus = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO4);

		switch (RadioStatus)
		{
		case IDC_RADIO1:
			{

				total = _wtof(valor1) + _wtof(valor2);
				dTOstr.Format(_T("%2.f"), total);
				int tam = texto.GetWindowTextLengthW();
				texto.SetSel(tam, tam);
				texto.ReplaceSel(valor1 + L" + " + valor2 + L" = " + dTOstr + L"\n");
			}
			break;

			case IDC_RADIO2:
			{

				total = _wtof(valor1) - _wtof(valor2);
				dTOstr.Format(_T("%2.f"), total);
				int tam = texto.GetWindowTextLengthW();
				texto.SetSel(tam, tam);
				texto.ReplaceSel(valor1 + L" - " + valor2 + L" = " + dTOstr + L"\n");
			}
				break;

			case IDC_RADIO3:
			{

				total = _wtof(valor1) * _wtof(valor2);
				dTOstr.Format(_T("%2.f"), total);
				int tam = texto.GetWindowTextLengthW();
				texto.SetSel(tam, tam);
				texto.ReplaceSel(valor1 + L" * " + valor2 + L" = " + dTOstr + L"\n");
			}
				break;

			case IDC_RADIO4:
			{

				total = _wtof(valor1) / _wtof(valor2);
				dTOstr.Format(_T("%2.f"), total);
				int tam = texto.GetWindowTextLengthW();
				texto.SetSel(tam, tam);
				texto.ReplaceSel(valor1 + L" / " + valor2 + L" = " + dTOstr + L"\n");
			}
				break;
		}

}

RadioButton

Em computação, um botão de opção ou botão de rádio (radio button) é um elemento de interface gráfica (isto é um componente widget) com dois estados: selecionado (ativado) e não-selecionado (desativado), quando o usuário pressiona um botão do mouse ou uma tecla como Espaço. Botões de opção são usados num grupo para apresentar um conjunto limitado de escolhas (duas ou mais) que são mutuamente exclusivas. Deste maneira, quando o usuário seleciona um outro botão no mesmo conjunto, o outro botão já selecionado torna-se automaticamente desativado.

EventHandler

O conceito do Sistema operacional Windows é baseado no envio e recebimento de mensagens e este procedimento é chamado de Windows Messages , na verdade  o sistema em baixo nível é composto de vários tipos de mensagens que contém  múltiplos eventos. Eventos em um aplicativo do Windows são ocorrências como ao usuário clicar com o mouse ou pressionando uma tecla ou se um temporizador atingir zero

O sistema operacional Windows registra cada evento em uma mensagem e coloca a mensagem em uma fila de mensagens para o programa para o qual a mensagem se destina. Assim uma mensagem do Windows é simplesmente um registro dos dados relativos a um evento, e a fila de mensagens para uma aplicação é apenas uma sequência de tais mensagens aguardando para serem processados pela aplicação, por envio de uma mensagem, o Windows pode dizer ao seu programa de que algo precisa ser feito, ou que algum informação tornou-se disponível, ou que um evento como um clique do mouse ocorreu. Se o seu programa está devidamente organizado, ele vai responder de forma adequada à mensagem. Tem muitos tipos diferentes de mensagens e elas podem ocorrer com muita frequência, muitas vezes até por segundo quando o mouse está sendo arrastado, por exemplo.

Quando você programa em C# você esta utilizando estas mensagens em um alto nível e pode programar eventos predefinifos que são interpretados pelo framework  e suas classes,  compilando o seu código para uma língua intermediária chamada MSIL (Microsoft Intermediate Language) e transformado em código de maquina pelo componente Just in time (JIT), assim que o seu programa é executado.

No código abaixo nosso programa esta completamente dentro de eventos, o evento Form_Shown é executado assim que o form é exibido, o evento Button_Click, é executado assim que o usuário clica no botão, o  evento RadioButton_CheckedChanged é executado quando há uma mudança no estado de cheque de um botão de radio e o evento Form_KeyDown é executado quando uma tecla é pressionada.

Código Dinâmico

Lembre-se que o C# no Visual Studio usa o conceito Design First, Code Later, nosso exemplo é um programa dinâmico ou seja todo escrito em tempo de execução e não em Design Time, quando criar o novo projeto click no form, na janela propriedades, no botão eventos, escolha o evento Shown e de um duplo click para acessar a unidade de código csharp. Para ilustrar esta explicação veja a imagem abaixo, onde você vê o form em Design Time e ao lado o programa em Run Time.

Radiobutton

Exemplo:

Neste exemplo criamos um grupo de botões de radio que efetua as 4 operações básicas da matemática, usando o evento de item e a verificação do seu estado.

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DesenvolvimentoAberto
{

    public partial class Form1 : Form
    {
        // Define componentes
        Label rotulo;
        RadioButton soma;
        RadioButton subtrai;
        RadioButton multiplica;
        RadioButton divide;
        Label rotulo1;
        TextBox campo1;
        Label rotulo2;
        TextBox campo2;
        Button botao;
        TextBox texto;
        double total;




        // Construtor
        public Form1()
        {
            InitializeComponent();
        }


        // Evento Shown é executado quando o form é exibido
        private void Form1_Shown(object sender, EventArgs e)
        {
            // Cria componentes dinamicamente no evento form shown
            rotulo = new Label();
            soma = new RadioButton();
            subtrai = new RadioButton();
            multiplica = new RadioButton();
            divide = new RadioButton();
            rotulo1 = new Label();
            campo1 = new TextBox();
            rotulo2 = new Label();
            campo2 = new TextBox();
            botao = new Button();
            texto = new TextBox();

            // posiciona componentes no form
            rotulo.Location = new Point (5, 10);
            soma.Location = new Point (5, 30);
            subtrai.Location = new Point(5, 50);
            multiplica.Location = new Point(5, 70);
            divide.Location = new Point(5, 90);
            rotulo1.Location = new Point(5, 120);
            campo1.Location = new Point(60, 120);
            rotulo2.Location = new Point(170, 120);
            campo2.Location = new Point(220, 120);
            botao.Location = new Point(330, 120);
            texto.Location = new Point(5, 150);

            // adiciona a propriedade de texto nos componentes
            rotulo.Text = "Escolha um RadioButton ou pressione (A, B, C ou D) ou (Alt + A, B, C ou D)";
            soma.Text = "Som&a";
            subtrai.Text = "Su&btrai";
            multiplica.Text = "Multipli&ca";
            divide.Text = "&Divide";
            rotulo1.Text = "Numero:";
            rotulo2.Text = "Numero:";
            botao.Text = "OK";

            // seta a propriedades para a caixa de texto
            texto.Multiline = true;
            texto.ScrollBars = ScrollBars.Vertical;
            texto.ReadOnly = true;

            // Define o tamanho dos objetos no form
            Form1.ActiveForm.Size = new Size(500, 300);
            rotulo.Size = new Size(450, 20);
            soma.Size = new Size(130, 20);
            subtrai.Size = new Size(130, 20);
            multiplica.Size = new Size(130, 20);
            divide.Size = new Size(130, 20);
            texto.Size = new Size(410, 100);
            rotulo1.Size = new Size(50, 20);
            rotulo2.Size = new Size(50, 20);

            // Define eventos para o checkbox
            soma.CheckedChanged += new System.EventHandler(soma_CheckedChanged);
            subtrai.CheckedChanged += new System.EventHandler(subtrai_CheckedChanged);
            multiplica.CheckedChanged += new System.EventHandler(multiplica_CheckedChanged);
            divide.CheckedChanged += new System.EventHandler(divide_CheckedChanged);
            botao.Click += new System.EventHandler(botao_Click);

            // Ativa a previsão de teclas do form
            Form1.ActiveForm.KeyPreview = true;

            // Nome do form
            Form1.ActiveForm.Text = "Desenvolvimento Aberto";
            // Adiciona componentes ao form
            Form1.ActiveForm.Controls.Add(rotulo);
            Form1.ActiveForm.Controls.Add(soma);
            Form1.ActiveForm.Controls.Add(subtrai);
            Form1.ActiveForm.Controls.Add(multiplica);
            Form1.ActiveForm.Controls.Add(divide);
            Form1.ActiveForm.Controls.Add(rotulo1);
            Form1.ActiveForm.Controls.Add(campo1);
            Form1.ActiveForm.Controls.Add(rotulo2);
            Form1.ActiveForm.Controls.Add(campo2);
            Form1.ActiveForm.Controls.Add(botao);
            Form1.ActiveForm.Controls.Add(texto);

        }

        // Evento On Click do botão
        private void botao_Click(object sender, EventArgs e)
        {
           if (soma.Checked)
           {
               total = Convert.ToDouble(campo1.Text) + Convert.ToDouble(campo2.Text);
               texto.AppendText(campo1.Text + " + " + campo2.Text + " = " + total + "\n");
           }

           if (subtrai.Checked)
           {
               total = Convert.ToDouble(campo1.Text) - Convert.ToDouble(campo2.Text);
               texto.AppendText(campo1.Text + " - " + campo2.Text + " = " + total + "\n");
           }

           if (multiplica.Checked)
           {
               total = Convert.ToDouble(campo1.Text) * Convert.ToDouble(campo2.Text);
               texto.AppendText(campo1.Text + " * " + campo2.Text + " = " + total + "\n");
           }

            if (divide.Checked)
           {
               total = Convert.ToDouble(campo1.Text) / Convert.ToDouble(campo2.Text);
               texto.AppendText(campo1.Text + " / " + campo2.Text + " = " + total + "\n");
           }
        }

        // Evento do RadioButton de mudança de estado
        // Verifica o estado pois este evento executa duas vezes
        // Quando o botão é selecionado e deselecionado
        // Duplicanto o texto enviado a caixa de texto.
        private void soma_CheckedChanged(object sender, EventArgs e)
        {
            if (soma.Checked)
            {
                texto.AppendText("Soma:\n");
            }
        }

        private void subtrai_CheckedChanged(object sender, EventArgs e)
        {
            if (subtrai.Checked)
            {
                texto.AppendText("Subtração:\n");
            }
        }
        private void multiplica_CheckedChanged(object sender, EventArgs e)
        {
            if (multiplica.Checked)
            {
                texto.AppendText("Multiplicação:\n");
            }
        }

        private void divide_CheckedChanged(object sender, EventArgs e)
        {
            if (divide.Checked)
            {
                texto.AppendText("Divisão:\n");
            }
        }

        // Evento de tecla pressionada
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {

            if  (e.KeyCode == Keys.A)
            {

                    if (soma.Checked == true)
                    {
                        soma.Checked = false;
                    }
                    else
                    {
                        soma.Checked = true;
                    }

            }
            if (e.KeyCode == Keys.B)
            {

                if (subtrai.Checked == true)
                {
                    subtrai.Checked = false;
                }
                else
                {
                    subtrai.Checked = true;
                }

            }

            if (e.KeyCode == Keys.C)
            {

                if (multiplica.Checked == true)
                {
                    multiplica.Checked = false;
                }
                else
                {
                    multiplica.Checked = true;
                }

            }

            if (e.KeyCode == Keys.D)
            {

                if (divide.Checked == true)
                {
                    divide.Checked = false;
                }
                else
                {
                    divide.Checked = true;
                }

            }

        }
    }
}

Checkbutton

O Widget checkbutton é um widget Tkinter padrão usados ​​para implementar seleções on-off. Checkbuttons podem conter texto ou imagens, e você pode associar uma função Python ou método para cada botão. Quando o botão é pressionado, Tkinter chama essa função ou método.

Text

O Text é um Widget de texto que fornece exibição de texto formatado. Ele permite que você para exibir e editar texto com vários estilos e atributos. O widget também suporta imagens e Windows Embedded.

Line Continue

O caractere \ (barra invertida) é usado para dizer ao interpretador Python que você esta continuando uma linha de código em um nova linha, evitando assim que o interpretador acuse um erro de identação.

Exemplo:

Neste exemplo criamos três checkbuttons usando o evento ONCLICK através do comando command, onde verificamos se o status do checkbutton foi checado ou não.

#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Desenvolvimento Aberto
# checkbox.py

# importa modulo
from Tkinter import *

# Cria formulario
formulario = Tk()
formulario.title = "Desenvolvimento Aberto"

# Evento CB on click
def evento1():
    if (c1.get() == 1):
         texto.insert(END,"Voce selecionou no Checkbox 1\n")
    else:
         texto.insert(END,"Voce deselecionou no Checkbox 1\n")

def evento2():
    if (c2.get() == 1):
         texto.insert(END,"Voce selecionou no Checkbox 2\n")
    else:
         texto.insert(END,"Voce deselecionou no Checkbox 2\n")

def evento3():
    if (c3.get() == 1):
         texto.insert(END,"Voce selecionou no Checkbox 3\n")
    else:
         texto.insert(END,"Voce deselecionou no Checkbox 3\n")

# Define variavel para status do checkbox
c1 = IntVar()
c2 = IntVar()
c3 = IntVar()

# Cria um novo label
rotulo = Label(formulario, text = "Concatena Strings")

# Identa linhas usando o caracter continuacao de linua

# Cria os checkbox
opc1 = Checkbutton(formulario, text = "Opcao1", \
                   variable =c1, \
                   command = evento1)

opc2 = Checkbutton(formulario, text = "Opcao2", \
                   variable =c2, \
                   command = evento2)

opc3 = Checkbutton(formulario, text = "Opcao3", \
                   variable =c3, \
                   command = evento3)

texto = Text(formulario, height = 10, width = 50)

# Adiciona Componentes no Grid
rotulo.grid(row=0, column=1)
opc1.grid(row=1, column=1)
opc2.grid(row=2, column=1)
opc3.grid(row=3, column=1)
texto.grid(row=4, column=1)

# Roda o loop principal do tcl
mainloop()

RadioButton

Em computação, um botão de opção ou botão de rádio (radio button) é um elemento de interface gráfica (isto é um componente widget) com dois estados: selecionado (ativado) e não-selecionado (desativado), quando o usuário pressiona um botão do mouse ou uma tecla como Espaço. Botões de opção são usados num grupo para apresentar um conjunto limitado de escolhas (duas ou mais) que são mutuamente exclusivas. Deste maneira, quando o usuário seleciona um outro botão no mesmo conjunto, o outro botão já selecionado torna-se automaticamente desativado.

Exemplo:

Neste exemplo criamos um grupo de botões de radio que efetua as 4 operações básicas da matemática, usando o evento de item e a verificação do seu estado.

Java

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Radio extends JPanel implements ItemListener, ActionListener {

	// Declara Objetos
	JLabel rotulo;

	JRadioButton soma;
	JRadioButton subtrai;
	JRadioButton multiplica;
	JRadioButton divide;

	JLabel rotulo1;
	JLabel rotulo2;

	JTextField campo1;
	JTextField campo2;

	JButton botao;

	JTextArea texto;

	double total;

	public Radio() {

		// Cria novos Objetos

		rotulo = new JLabel("Escolha um RadioButton ou Alt + A, B, C ou C:");

		soma = new JRadioButton("Soma");
		subtrai = new JRadioButton("Subtrai");
		multiplica = new JRadioButton("Multiplica");
		divide = new JRadioButton("Divide");

		rotulo1 = new JLabel("Numero");
		campo1 = new JTextField("0,00");
		rotulo2 = new JLabel("Numero");
		campo2 = new JTextField("0,00");

		botao = new JButton("OK");

		texto = new JTextArea(5, 20);

		ButtonGroup grupo = new ButtonGroup();

		grupo.add(soma);
		grupo.add(subtrai);
		grupo.add(multiplica);
		grupo.add(divide);

		// Seta atalho do teclado ex: ALT + A ou B ou C
		soma.setMnemonic(KeyEvent.VK_A);
		subtrai.setMnemonic(KeyEvent.VK_B);
		multiplica.setMnemonic(KeyEvent.VK_C);
		divide.setMnemonic(KeyEvent.VK_D);

		// Seta Evento
		soma.addItemListener(this);
		subtrai.addItemListener(this);
		multiplica.addItemListener(this);
		divide.addItemListener(this);
		botao.addActionListener(this);

		// Seta texto não editavel
		texto.setEditable(false);

		// Cria barras de rolagem
		JScrollPane barra = new JScrollPane(texto);

		// Seta restrições para barra de rolagem
		GridBagConstraints c = new GridBagConstraints();
		c.gridwidth = GridBagConstraints.REMAINDER;

		// Seta tamanho do preenchimento para as barras
		c.fill = GridBagConstraints.BOTH;
		c.weightx = 1.0;
		c.weighty = 1.0;

		// cria paineis
		JPanel painel1 = new JPanel();
		JPanel painel2 = new JPanel();
		JPanel painel3 = new JPanel();
		JPanel painel4 = new JPanel();

		// adiciona componentes nos paineis
		painel1.add(rotulo);
		painel2.add(soma);
		painel2.add(subtrai);
		painel2.add(multiplica);
		painel2.add(divide);

		painel3.add(rotulo1);
		painel3.add(campo1);
		painel3.add(rotulo2);
		painel3.add(campo2);
		painel3.add(botao);

		painel4.add(barra, c);

		// adiciona painel e centraliza
		add(painel1, BorderLayout.CENTER);
		add(painel2, BorderLayout.CENTER);
		add(painel3, BorderLayout.CENTER);
		add(painel4, BorderLayout.CENTER);

	}

	public void itemStateChanged(ItemEvent e)

	{
		// Evento de mudança de estado do checkbox

		// captura item celecionado
		Object fonte = e.getItemSelectable();
		int estado = e.getStateChange();

		// coloca o cursor no final do texto para efeito de rolagem
		texto.setCaretPosition(texto.getDocument().getLength());

		// Seleciona o estado sem esta condição o a rotina executa duas vezes
		// A primeira quando o item é selecionado a segunda quando é deselecionado
		// estados: Selected = selecionado - Deselected - deselecionado
		if (estado == ItemEvent.SELECTED) {

			// Define click no checkbox
			if (fonte == soma) {
				texto.append("Soma:" + "\n");
			}

			if (fonte == subtrai) {
				texto.append("Subtração:" + "\n");
			}

			if (fonte == multiplica) {
				texto.append("Multiplicação:" + "\n");
			}

			if (fonte == divide) {
				texto.append("Divisão:" + "\n");
			}

		}

	}

	public static void main(String[] args) {

		// adicona thread do swing
		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {

				// cria formulario
				JFrame formulario = new JFrame("Desenvolvimento Aberto");
				formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

				// monta paineis de componetes no frame
				JComponent componentes = new Radio();
				componentes.setOpaque(true);

				// Seta propriedades do frame
				formulario.setContentPane(componentes);
				formulario.setSize(400, 250);
				formulario.setVisible(true);
			}
		});
	}

	// Evento do botão - OnClick
	public void actionPerformed(ActionEvent e) {

		// coloca o cursor no final do texto para efeito de rolagem
		texto.setCaretPosition(texto.getDocument().getLength());

        // Verifica o objeto selecionado e efetua a operação correspondente

		//Soma
		if (soma.getSelectedObjects() != null) {
			total = Double.parseDouble(campo1.getText())
					+ Double.parseDouble(campo2.getText());
			texto.append(campo1.getText() + " + " + campo2.getText() + " = "
					+ String.valueOf(total) + "\n");
		}

		// Subtração
		if (subtrai.getSelectedObjects() != null) {
			total = Double.parseDouble(campo1.getText())
					- Double.parseDouble(campo2.getText());
			texto.append(campo1.getText() + " - " + campo2.getText() + " = "
					+ String.valueOf(total) + "\n");
		}

		// Multiplicação
		if (multiplica.getSelectedObjects() != null) {
			total = Double.parseDouble(campo1.getText())
					* Double.parseDouble(campo2.getText());
			texto.append(campo1.getText() + " * " + campo2.getText() + " = "
					+ String.valueOf(total) + "\n");
		}

		// Divisão
		if (divide.getSelectedObjects() != null) {
			total = Double.parseDouble(campo1.getText())
					/ Double.parseDouble(campo2.getText());
			texto.append(campo1.getText() + " / " + campo2.getText() + " = "
					+ String.valueOf(total) + "\n");
		}
	}

}

No post anterior mostramos como criar um projeto MFC para usar C++ nativo direto das APIs do Windows, portanto não vamos entrar em detalhes agora sobre como criar os eventos e o DoDataExchange dos componentes. Crie um form de acordo com o design da imagem abaixo:

checkbox

Access Keys

Uma tecla de acesso é um caractere sublinhado no texto de um menu, item de menu, ou o rótulo de um controle como um botão. Ele permite o usuário “clicar” em um botão, pressionando a tecla ALT em combinação com a tecla de acesso predefinido. Por exemplo, se um botão executa um procedimento para imprimir um formulário, e, portanto, sua propriedade Text é definido como “Imprimir”, acrescentando um e comercial antes da letra “i” faz com que a letra “i”, seja sublinhada no texto do botão em tempo de execução tempo. O usuário pode executar o comando associado ao botão pressionando ALT + I. Você não pode ter uma chave de acesso para um controle que não pode receber o foco, por exemplo, um controle TabPage.

CheckBox

Representa um CheckBox do Windows

OnBnClicked

Ocorre quando o um botão recebe um click do mouse.

Visual Studio

  1. Abra um projeto MFC Application.
  2. Use a imagem acima para referencia.
  3. Coloque no form 1 componente Static text.
  4. Coloque no form 3 componentes CheckBox.
  5. Para todos os CheckBoxes a propriedade Caption precisa do Access Key &, exemplo: Opção 1 Alt + &X
  6. Coloque no form 1 componente EditControl.
  7. Mude as propriedade do EditControl: Multilines = True, Read Only = True, Vertical Scroll = True.
  8. Crie as variáveis para os CheckBox e para o EditControl.
  9. Crie um evento OnBnClicked para os 3 CheckBoxes.
  10. Use o código abaixo para completar o código gerado automaticamente.

Exemplo:

Neste exemplo mostramos como usar o componente checkbox seus eventos e como usar hotkeys para manipular o checkbox e imprimir o resultado criando um efeito do comando Append dentro de um componente EditControl Multiline.

C++


// CheckboxDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Checkbox.h"
#include "CheckboxDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CCheckboxDlg dialog

CCheckboxDlg::CCheckboxDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CCheckboxDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCheckboxDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CHECK1, opc1);
	DDX_Control(pDX, IDC_CHECK2, opc2);
	DDX_Control(pDX, IDC_CHECK3, opc3);
	DDX_Control(pDX, IDC_EDIT1, texto);
}

BEGIN_MESSAGE_MAP(CCheckboxDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_CHECK1, &CCheckboxDlg::OnBnClickedCheck1)
	ON_BN_CLICKED(IDC_CHECK2, &CCheckboxDlg::OnBnClickedCheck2)
	ON_BN_CLICKED(IDC_CHECK3, &CCheckboxDlg::OnBnClickedCheck3)

END_MESSAGE_MAP()

// CCheckboxDlg message handlers

BOOL CCheckboxDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CCheckboxDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CCheckboxDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

/** Nosso codigo começa aqui.

   O codigo abaixo mostra como criar o efeito da palavra chave
   APPEND em C++ em um EditControl Multiline.

   Para criar o efeito capturamos o tamanho do texto atual,
   criamos um ponto de selecão e
   trocamos a selecção pelo novo texto.

   **/

 void CCheckboxDlg::OnBnClickedCheck1()
{
	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Você clicou no Checkbox 1\n");
}

void CCheckboxDlg::OnBnClickedCheck2()
{
	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Você clicou no Checkbox 2\n");
}

void CCheckboxDlg::OnBnClickedCheck3()
{
	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Você clicou no Checkbox 3\n");
}

Access Keys

Uma tecla de acesso é um caractere sublinhado no texto de um menu, item de menu, ou o rótulo de um controle como um botão. Ele permite o usuário “clicar” em um botão, pressionando a tecla ALT em combinação com a tecla de acesso predefinido. Por exemplo, se um botão executa um procedimento para imprimir um formulário, e, portanto, sua propriedade Text é definido como “Imprimir”, acrescentando um e comercial antes da letra “i” faz com que a letra “i”, seja sublinhada no texto do botão em tempo de execução tempo. O usuário pode executar o comando associado ao botão pressionando ALT + I. Você não pode ter uma chave de acesso para um controle que não pode receber o foco, por exemplo, um controle TabPage.

CheckBox

Representa um CheckBox do Windows

CheckedChanged

Ocorre quando o valor da propriedade Checked muda entre postagens para o servidor.

TextBox

Representa um controle de caixa de texto do Windows.

KeyPreview

Obtém ou define um valor indicando se o formulário receberá eventos de teclas antes do evento ser passado para o controle que tem o foco.

HotKeys

É o termo utilizado para teclas de atalho em C#

Keys Enumeration

Esta enumeração tem um atributo FlagsAttribute que permite uma combinação bit a bit de seus valores de membro. Pode ser usado através da classe Keys.

KeyDown

É um evento que ocorre quando uma tecla é pressionada enquanto o controle tem foco.

Exemplo:

Neste exemplo mostramos como usar o componente checkbox seus eventos e como usar hotkeys para manipular o checkbox e imprimir o resultado dentro de um componente textbox.

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication14
{

    public partial class Form1 : Form
    {
        // Define componentes
        Label rotulo;
        CheckBox opc1;
        CheckBox opc2;
        CheckBox opc3;
        TextBox texto;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Cria componentes dinamicamente no evento form shown
            rotulo = new Label();
            opc1 = new CheckBox();
            opc2 = new CheckBox();
            opc3 = new CheckBox();
            texto = new TextBox();

            // posiciona componentes no form
            rotulo.Location = new Point (5, 10);
            opc1.Location = new Point (5, 30);
            opc2.Location = new Point(5, 50);
            opc3.Location = new Point(5, 70);
            texto.Location = new Point(5, 100);

            // adiciona a propriedade de texto nos componentes
            rotulo.Text = "Escolha um Checkbox ou pressione A, B ou C:";
            opc1.Text = "Opção 1 - Alt + &X";
            opc2.Text = "Opção 2 - Alt + &Y";
            opc3.Text = "Opção 3 - Alt + &Z";

            // seta a propriedades para a caixa de texto
            texto.Multiline = true;
            texto.ScrollBars = ScrollBars.Vertical;
            texto.ReadOnly = true;

            // Define o tamanho dos objetos no form
            rotulo.Size = new Size(250, 20);
            opc1.Size = new Size(130, 20);
            opc2.Size = new Size(130, 20);
            opc3.Size = new Size(130, 20);
            texto.Size = new Size(250, 100);

            // Define eventos para o checkbox
            opc1.CheckedChanged += new System.EventHandler(opc1_CheckedChanged);
            opc2.CheckedChanged += new System.EventHandler(opc2_CheckedChanged);
            opc3.CheckedChanged += new System.EventHandler(opc3_CheckedChanged);

            // Ativa a previsão de teclas do form
            Form1.ActiveForm.KeyPreview = true;

            // Nome do form
            Form1.ActiveForm.Text = "Desenvolvimento Aberto";
            // Adiciona componentes ao form
            Form1.ActiveForm.Controls.Add(rotulo);
            Form1.ActiveForm.Controls.Add(opc1);
            Form1.ActiveForm.Controls.Add(opc2);
            Form1.ActiveForm.Controls.Add(opc3);
            Form1.ActiveForm.Controls.Add(texto);

        }

        // Eventos do checkbox
        private void opc1_CheckedChanged(object sender, EventArgs e)
        {
            texto.AppendText("Você clicou no checkbox 1\n");
        }

        private void opc2_CheckedChanged(object sender, EventArgs e)
        {
            texto.AppendText("Você clicou no checkbox 2\n");
        }
        private void opc3_CheckedChanged(object sender, EventArgs e)
        {
            texto.AppendText("Você clicou no checkbox 3\n");
        }

        // Evento de tecla pressionada
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {

            if  (e.KeyCode == Keys.A)
            {

                    if (opc1.Checked == true)
                    {
                        opc1.Checked = false;
                    }
                    else
                    {
                        opc1.Checked = true;
                    }

            }

            if (e.KeyCode == Keys.B)
            {

                if (opc2.Checked == true)
                {
                    opc2.Checked = false;
                }
                else
                {
                    opc2.Checked = true;
                }

            }

            if (e.KeyCode == Keys.C)
            {

                if (opc3.Checked == true)
                {
                    opc3.Checked = false;
                }
                else
                {
                    opc3.Checked = true;
                }

            }

        }
    }
}

Checkbox

A classe JCheckBox fornece suporte para os botões da caixa de seleção.

TextArea

A classe JTextArea fornece um componente que exibe várias linhas de texto, permitindo opcionalmente o usuário editar o texto.

ScrollPane

A JScrollPane fornece uma visão de rolagem de um componente. Quando a tela é limitada, use um painel de rolagem para exibir um componente que é grande ou um cujo tamanho pode mudar dinamicamente. Outros recipientes utilizados para economizar espaço na tela incluem painéis divididos por abas e painéis.

KeyEvent (mnemônico)

Geralmente a letra sublinhada no texto de cada componente mostra o mnemônico – a alternativa de teclado – para cada componente. Na maioria das GUIs Fell and Look, o usuário pode clicar em um componente, pressionando a tecla Alt e o mnemônico. Por exemplo, Alt+M. O KeyEvent é responsável pela definição do atalho no teclado, exemplo, KeyEvent.VK_M

GridBagConstraints

Uma classe que simplesmente armazena as informações para cada componente adicionado.  A propriedade Fill determina como redimensionar o componente.

Exemplo:

Neste exemplo criamos três componentes checkbox e uma caixa de texto a cada mudança do estado de cada checkbox adicionamos o texto correspondente a caixa de texto, para outros detalhes leia os comentários no código

Java

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class MontaGUI extends JPanel implements  ItemListener
{
	// Declara Objetos
	JLabel rotulo;
	JCheckBox opc1;
	JCheckBox opc2;
	JCheckBox opc3;
	JTextArea texto;

	public MontaGUI()
	{
		// Cria novos Objetos
		rotulo = new JLabel("Escolha um Checkbox ou Alt + A, B ou C:");
		opc1 = new JCheckBox("Opção 1:");
		opc2 = new JCheckBox("Opção 2:");
		opc3 = new JCheckBox("Opção 3:");
		texto = new JTextArea(5,20);

		// Seta atalho do teclado ex: ALT + A ou B ou C
		opc1.setMnemonic(KeyEvent.VK_A);
		opc2.setMnemonic(KeyEvent.VK_B);
		opc3.setMnemonic(KeyEvent.VK_C);

		// Seta Evento
		opc1.addItemListener(this);
		opc2.addItemListener(this);
		opc3.addItemListener(this);

		// Seta texto não editavel
		texto.setEditable(false);

		// Cria barras de rolagem
		JScrollPane barra =  new JScrollPane(texto);

		// Seta restrições para barra de rolagem
		GridBagConstraints c = new GridBagConstraints();
        c.gridwidth = GridBagConstraints.REMAINDER;

        // Seta tamanho do preenchimento para as barras
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        c.weighty = 1.0;

        // cria paineis
		JPanel painel1 = new JPanel();
		JPanel painel2 = new JPanel();
		JPanel painel3 = new JPanel();

		// adiciona componentes nos paineis
		painel1.add(rotulo);
		painel2.add(opc1);
		painel2.add(opc2);
		painel2.add(opc3);
		painel3.add(barra,c );

		// adiciona painel e centraliza
		add(painel1,BorderLayout.CENTER);
		add(painel2,BorderLayout.CENTER);
		add(painel3,BorderLayout.CENTER);

	}

	public void itemStateChanged(ItemEvent e)
	{
		// Evento de mudança de estado do checkbox

		// captura item celecionado
		Object fonte = e.getItemSelectable();

		// coloca o cursor no final do texto para efeito de rolagem
		texto.setCaretPosition(texto.getDocument().getLength());

		// Define click no checkbox
		if (fonte == opc1)
		{
			texto.append("Você clicou no CheckBox 1" + "\n");
		}

		if (fonte == opc2)
		{
			texto.append("Você clicou no CheckBox 2" + "\n");
		}

		if (fonte == opc3)
		{
			texto.append("Você clicou no CheckBox 3" + "\n");
		}

	}

	public static void main(String[] args) {

		// adicona thread do swing
		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {

				// cria formulario
				JFrame formulario = new JFrame("Desenvolvimento Aberto");
				formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

				// monta paineis de componetes no frame
				JComponent componentes = new  MontaGUI();
				componentes.setOpaque(true);

				// Seta propriedades do frame
				formulario.setContentPane(componentes);
				formulario.setSize(400, 250);
                formulario.setVisible(true);
			}
		});
	}

}

No post anterior aprendemos como montar telas gráficas dinamicamente, continuaremos criando uma tela gráfica de seleção mesclando tabelas internas e o banco de dados SAP, usando comandos OPEN SQL, para preencher as tabelas transparentes do Flight Model. Para quem não se lembra, o Flight Model é o principal exemplo do NetWeavear 7  e suas tabelas transparentes por default no mandante 001 não possui dados, por isto vamos inserir os dados manualmente, temos que ter cuidado para não esquecer de preencher as outras tabelas que fazem referencia (Foreign Key) a nossa tabela de voo, veja a imagem abaixo:

Fmodel

Flight Model:

https://desenvolvimentoaberto.wordpress.com/2014/02/20/netweaver-flight-model-introducao-ao-database-mini-sap/

Foreign Key

Uma chave externa ou estrangeira é um atributo ou uma combinação de atributos numa relação, cujos valores são necessários para equivaler à chave primária de uma relação. O conceito de Chave estrangeira em uso de banco de dados se refere ao tipo de relacionamento entre distintas tabelas de dados do banco de dados. Uma chave estrangeira é chamada quando há o relacionamento entre duas tabelas. Sempre em chave estrangeira vai haver relacionamentos entre tabelas, por exemplo, uma tabela que possui relação com a chave primaria de outra tabela.

Validação de Parâmetros

A validação de entrada da tela pode ser feita no evento da instrução:

AT SELECTION-SCREEN

Útil se quiser exigir a entrada de dados do usuário antes de processamento principal.

Usando AT SELECTION-SCREEN ON nome do campo:

  • Disparado se nome do campo foi submetido.
  • Se um erro ou aviso é emitido, o campo é realçado.

EM AT SELECTION-SCREEN ON RADIOBUTTON GROUP nome do grupo:

  • Se um erro ou aviso é emitido, o grupo é realçado.

Range of Values

Permite que o usuário selecione um intervalo de valores, criando o componente na tela já com botões e tabelas relacionadas.

Sintaxe:

SELECT-OPTIONS itabname FOR dataobject.

Exemplo:

Neste exemplo temos dois programas distintos o primeiro preenche os dados do Flight Model, preenchendo a tabela de voo e as tabelas que fazem relação e possuem uma chave estrangeira na tabela voo. O segundo é nossa tela de seleção que busca todos os voos de uma agencia de viagem, também como fazer a validação em um campo de parâmetros.

Abap – Programa #1

*&---------------------------------------------------------------------*
*& Report  ZDADOS
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Insere Dados manualmente no Flight Model
*&---------------------------------------------------------------------*

REPORT  ZDADOS.

* Define tabelas do Banco de dados
TABLES SCARR.
TABLES SGEOCITY.
TABLES SAIRPORT.
TABLES SPFLI.

* Apaga dados existentes
DELETE FROM SCARR.
DELETE FROM SGEOCITY.
DELETE FROM SAIRPORT.
DELETE FROM SPFLI.

* Cria MATRIZs de dados (rows)
DATA MATRIZ1 TYPE SCARR.
DATA MATRIZ2 TYPE SGEOCITY.
DATA MATRIZ3 TYPE SAIRPORT.
DATA MATRIZ4 TYPE SPFLI.

* Insere dados.

MATRIZ1-CARRID = '001'.
MATRIZ1-CARRNAME = 'DA Airlines'.
MATRIZ1-CURRCODE = 'REAL'.
MATRIZ1-MANDT = '001'.
MATRIZ1-URL  = 'https://desenvolvimentoaberto.wordpress.com'.

INSERT INTO SCARR VALUES MATRIZ1.

MATRIZ2-CITY = 'São Paulo'.
MATRIZ2-COUNTRY = 'Bra'.
MATRIZ2-LATITUDE = '23'.
MATRIZ2-LONGITUDE = '46'.
MATRIZ2-MANDT = '001'.

INSERT INTO SGEOCITY VALUES MATRIZ2.

MATRIZ2-CITY = 'Rio de Janeiro'.
MATRIZ2-COUNTRY = 'Bra'.
MATRIZ2-LATITUDE = '22'.
MATRIZ2-LONGITUDE = '43'.
MATRIZ2-MANDT = '001'.

INSERT INTO SGEOCITY VALUES MATRIZ2.

MATRIZ3-ID ='001'.
MATRIZ3-MANDT ='001'.
MATRIZ3-NAME = 'Aeroporto de Congonhas'.
MATRIZ3-TIME_ZONE = 'GMT-3'.

INSERT INTO SAIRPORT VALUES MATRIZ3.

MATRIZ3-ID ='002'.
MATRIZ3-MANDT ='001'.
MATRIZ3-NAME = 'Aeroporto Santos Dumont'.
MATRIZ3-TIME_ZONE = 'GMT-3'.

INSERT INTO SAIRPORT VALUES MATRIZ3.

MATRIZ4-AIRPFROM = '001'.
MATRIZ4-AIRPTO = '002'.
MATRIZ4-ARRTIME = '170000'.
MATRIZ4-CARRID = '001'.
MATRIZ4-CITYFROM = 'São Paulo'.
MATRIZ4-CITYTO = 'Rio de Janeiro'.
MATRIZ4-CONNID = '001'.
MATRIZ4-COUNTRYFR = 'Bra'.
MATRIZ4-COUNTRYTO = 'Bra'.
MATRIZ4-DEPTIME = '181500'.
MATRIZ4-DISTANCE = '500'.
MATRIZ4-DISTID = 'KM'.
MATRIZ4-FLTIME = '75'.
MATRIZ4-FLTYPE = 'D'.
MATRIZ4-MANDT = '001'.
MATRIZ4-PERIOD = '1'.

INSERT INTO SPFLI VALUES MATRIZ4.

* Exibe imagem
WRITE : / 'Dados inseridos'.

Abap – Programa #2

*&---------------------------------------------------------------------*
*& Report  ZVISUAL_D
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Selection Screen - Database
*&---------------------------------------------------------------------*

REPORT  ZVISUAL_D.

* Define internal Table
DATA str TYPE spfli.

* Monta tela
SELECTION-SCREEN BEGIN OF BLOCK bloco1 WITH FRAME
  TITLE titulo.

   SELECTION-SCREEN BEGIN OF LINE.

      SELECTION-SCREEN COMMENT 1(22) com.
      SELECT-OPTIONS userair FOR str-carrid.

   SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK bloco1.

SELECTION-SCREEN BEGIN OF BLOCK bloco2 WITH FRAME
  TITLE titulo1.

    SELECTION-SCREEN COMMENT 1(40) com1.
    PARAMETER valor TYPE string.

SELECTION-SCREEN END OF BLOCK bloco2.

* Carrega rotulos da tela
LOAD-OF-PROGRAM.

Titulo = 'Modelo de Voo (Flight Model - NetWeaver 7'.
titulo1 = 'Evento de validação'.
com = 'Selecione Linha Aerea'.
com1 = 'Experimente digitar a palavra: VALIDA'.

* Evento de validação
AT SELECTION-SCREEN ON valor.
  IF valor = 'VALIDA'.
    MESSAGE 'Você digitou uma palavra Invalida' TYPE 'W'.
  ENDIF.

* Inicia o Programa
START-OF-SELECTION.

* Seleciona os dados do banco de dados e coloca na tabela interna
SELECT carrid connid countryfr cityfrom cityto arrtime deptime distance distid  FROM spfli INTO
CORRESPONDING FIELDS OF str WHERE carrid IN userair.

WRITE: / str-carrid, str-connid, str-countryfr, str-cityfrom, str-cityto,
         str-arrtime, str-deptime, str-distance, str-distid.

ENDSELECT.