Arquivo de março, 2014

ListBox

Em computação, uma caixa de combinação é um elemento de interface gráfica. Um ListBox em Abap é chamado de ComboBox em outras linguagens de programação e permite ao usuário escolher uma das várias opções, pode ter duas formas muito diferentes. A forma padrão é a caixa de combinação não editável, que conta com um botão e uma lista suspensa de valores. A segunda forma, chamada de caixa de combinação editável, possui um campo de texto com um pequeno botão confinando-o. O usuário pode digitar um valor no campo de texto ou clique no botão para exibir uma lista drop-down.

VRM_Set_Value

É um modulo de função Abap que adiciona dois valores a uma variável tipo tabela, esta tabela possui dois campos o primeiro chamado KEY do tipo inteiro e o segundo chamado TEXT do tipo string, esta função vincula-se a um componente através de seu parâmetro ID e adiciona os valores através do parâmetro Values .

VRM_Get_Value

É a mesma função acima, apenas ao invés de adicionar, retorna os valores  atrelados a um ID de um componente.

Vrm_VAlue

É um tipo associado a estrutura de chave e valores.

Screen Painter

Para criar uma tela visual para o programa relacionado ao código abaixo siga os seguintes passos:

List_design

  1. Crie um programa chamado ZCOMBO.
  2. Na transação SE51, relacione o programa e insira o numero dela igual a 100.
  3. Na aba Flow Logic , tire o comentário da linha “MODULE STATUS_0100.” e de um duplo clique na variável: “STATUS_0100“.
  4. Crie o modulo PBO  selecionando a opção MAIN PROGRAM.
  5. Salve o programa e volte para a transação SE51.
  6. Clique no botão Layout e desenhe uma tela como na imagem acima.
  7. No componente ListBox coloque seu nome de COMBO, seu Fct_Code de F_CODE e sua propriedade DropDown de LISTBOX.
  8. No componente Pushbutton coloque seu nome de SAIR e seu Fct_Code de F_SAIR.
  9. Salve e Ative as telas.
  10. Na transação SE38 chame o programa ZCOMBO e insira o código abaixo, você deve obter um programa como na figura a seguir.

List_programa

Exemplo:

No programa a seguir criamos um ListBox e o populamos com nomes de musicas da banda Rolling Stones, e usamos código Abap para  capturar o evento SelectedChange através de atributos do R/3.

Abap

*&---------------------------------------------------------------------*
*& Report  ZCOMBO
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& ComboBox
*&---------------------------------------------------------------------*

REPORT  ZCOMBO.

* Cria um Pool tipo VRM
TYPE-POOLS vrm.

* Declara Variaveis
DATA: LISTBOX TYPE vrm_value OCCURS 0,
COMBO TYPE SY-UCOMM,
retorno TYPE VRM_VALUES,
texto TYPE string,
LCOMBO TYPE vrm_value,
TNOME TYPE vrm_value.

* Carrega Itens temporariamente
LOAD-OF-PROGRAM.

  LCOMBO-KEY = '1'.
  LCOMBO-TEXT = 'Satisfaction'.
  APPEND LCOMBO TO LISTBOX.

  LCOMBO-KEY = '2'.
  LCOMBO-TEXT = 'Paint it Black'.
  APPEND LCOMBO TO LISTBOX.

  LCOMBO-KEY = '3'.
  LCOMBO-TEXT = 'Wild Horses'.
  APPEND LCOMBO TO LISTBOX.

  LCOMBO-KEY = '4'.
  LCOMBO-TEXT = 'Brown Sugar'.
  APPEND LCOMBO TO LISTBOX.

  LCOMBO-KEY = '5'.
  LCOMBO-TEXT = 'Sympathy for the Devil'.
  APPEND LCOMBO TO LISTBOX.

  LCOMBO-KEY = '6'.
  LCOMBO-TEXT = 'Start Me Up'.
  APPEND LCOMBO TO LISTBOX.

START-OF-SELECTION.

* Chama a tela
CALL SCREEN 100.

* Inicio do Modulo 100
MODULE STATUS_0100 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.
*  SET TITLEBAR 'xxx'.

* Popula o componente ListBox

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'COMBO'
      values = LISTBOX[].

* Verifica ações dos componentes
  CASE SY-UCOMM.
    " Deixa o programa
    WHEN 'F_SAIR'.
      LEAVE PROGRAM.

    " Captura Item Selecionado
    WHEN 'F_COMBO'.

      " Retorna os valores dos componentes
      CALL FUNCTION 'VRM_GET_VALUES'
        EXPORTING
          ID     = 'COMBO'
        IMPORTING
          VALUES = RETORNO.

      " Lê variavel dentro do retorno tipo tabela pelo ID.
      READ TABLE RETORNO WITH KEY KEY = COMBO INTO TEXTO.

      " Adiciona item selecionado ao componente textbox
      TNOME = TEXTO.

  ENDCASE.

ENDMODULE.                 " STATUS_0100  OUTPUT

ComboBox

O Widget ttk.Combobox combina um campo de texto com uma lista drop-down de valores. Esse widget é uma subclasse do Widget Entry. A caixa de escolha fornece ao usuário um conjunto de opções comuns para uma opção, mas, opcionalmente, permiti adicionar em sua própria escolha que não está na lista.

ListBox

O Widget Listbox é um widget Tkinter padrão usado para exibir uma lista de alternativas. A caixa de listagem só pode conter itens de texto, e todos os itens devem ter o mesmo tipo de letra e cor. Dependendo da configuração do widget, o usuário pode escolher uma ou mais alternativas a partir da lista.

Bind

Vincula métodos ou eventos a um componentes.

<<ComboboxSelected>>

Evento que ocorre quando o estado de um Combobox sofre uma mudança.

<Double-Button-1>

Evento que ocorre quando um componente sofre um duplo clique.

Exemplo:

Neste exemplo criamos um ComboBox e um ListBox que interagem entre si, usando seus respectivos eventos.

Python

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

# importa modulo
import ttk
from Tkinter import *

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

# Limpa Label
def limpa():
    limpa = chr(32)
    for i in range(1,18):
          limpa = limpa + chr(32)
    return limpa

# Evento ocorre quando muda a seleção do combo
def evento(*args):
    txt = combo.get() + limpa()
    tmusica = Label(formulario, text = txt)
    tmusica.grid(row=1, sticky=W)
    lista.selection_set(combo.current())

# Evento ocorre quando há um duplo clique na lista
def duplo_clique(*args):
    txt = lista.selection_get() + limpa()
    tmusica = Label(formulario, text = txt)
    tmusica.grid(row=1, sticky=W)
    combo.current(lista.curselection())

# Cria itens
itens = ["Satisfaction" , "Paint it Black" , "Wild Horses", "Brown Sugar",
                          "Sympathy for the Devil", "Start Me Up"]

# Cria Labels
titulo = Label(formulario, text ="Roling Stones:")
tmusica = Label(formulario, text = "Musica")
tlista = Label(formulario, text = "ListBox - Duplo click em uma Opcao")
tcombo = Label(formulario, text = "Combobox - Escolha uma Opcao")

# Cria um ListBox - e adicona prorpriedades e eventos
lista = Listbox(formulario)
for item in itens:
    lista.insert(END,item)
lista.selection_set(0)
lista.bind("<Double-Button-1>", duplo_clique)

# Cria um ComboBox - e adicona prorpriedades e eventos
combo = ttk.Combobox(formulario)
combo["values"] = itens
combo.current(0)
combo.bind("<<ComboboxSelected>>", evento)

# Posiciona componentes na tela
titulo.grid(row=0, sticky=W)
tmusica.grid(row=1, sticky=W, pady=10)
tlista.grid(row=4, sticky=W, pady=5)
lista.grid(row=5, sticky= W)
tcombo.grid(row=6, sticky=W, pady=5)
combo.grid(row=7, sticky=W)

# Roda o loop principal do tcl
mainloop()

ComboBox

Em computação, uma caixa de combinação é um elemento de interface gráfica. Um ComboBox, que permite ao usuário escolher uma das várias opções, pode ter duas formas muito diferentes. A forma padrão é a caixa de combinação não editável, que conta com um botão e uma lista suspensa de valores. A segunda forma, chamada de caixa de combinação editável, possui um campo de texto com um pequeno botão confinando-o. O usuário pode digitar um valor no campo de texto ou clique no botão para exibir uma lista drop-down.

ListBox

Em computação, uma caixa de listagem é um elemento de interface gráfica. Uma ListBox apresenta ao usuário um grupo de itens, exibidos em uma ou mais colunas. As listas podem ter muitos itens, por isso eles são muitas vezes colocados em painéis de rolagem.

OnShowWindow

É o evento que ocorre quando a o dialogo da aplicação é exibido.

Lbn_SelChange

É o evento que ocorre quando um estado de seleção é modificado.

Lbn_DblClk

É o evento que ocorre quando um duplo clique é efetuado no componente.

GetCurSel

Retorna o índice do item selecionado.

SetCurSel

Designa um item para ser selecionado.

Visual Studio

Para criar uma aplicação MFC siga os passos abaixo e use a imagem abaixo como referencia para o design do dialogo:

ComboList

  1. Crie um novo projeto de aplicação MFC C++ do tipo Dialog Based.
  2. Arraste no dialogo um GroupBox e modifique sua altura e largura para que caiba todos os componentes dentro dele, modifique sua propriedade Caption para: “ListBox e ComboBox”.
  3. Arraste um StaticText e mude sua propriedade Caption para: “Rolling Stones:”.
  4. Arraste um EditText e o posicione na frente do StaticText, mude suas propriedades  Border = False, Read Only = True e crie uma variável para ele chamada tmusica.
  5. Arraste um StaticText e mude seu Caption para: “ListBox –  Duplo clique nesta opção”.
  6. Arrate um ListBox e crie uma variável para ele chamada lista.
  7. Arraste um StaticText e mude seu Caption para: “Combobox – Escolha uma opção”.
  8. Arraste um ComboBox e crie uma variável para ele chamada combo.
  9. Crie um evento LBN_SELCHANGE para o componente combo e um outro LBN_DBLCLK para o componente lista.
  10. Complete seu código gerado automaticamente, com o código abaixo.

Exemplo:

Neste exemplo usamos um ComboBox e um ListBox para criar um programa C++ MFC e os eventos de cada um para interligar suas ações.

C++

// Código gerado automaticamente
// MFCApplication1Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "MFCApplication1.h"
#include "MFCApplication1Dlg.h"
#include "afxdialogex.h"
#include "Windowsx.h"
#include <string>

#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()

// CMFCApplication1Dlg dialog

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

void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, lista);
	DDX_Control(pDX, IDC_COMBO1, combo);
	DDX_Control(pDX, IDC_EDIT2, tmusica);
}

BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_SHOWWINDOW()
	ON_CBN_SELCHANGE(IDC_COMBO1, &CMFCApplication1Dlg::OnCbnSelchangeCombo1)
	ON_LBN_DBLCLK(IDC_LIST1, &CMFCApplication1Dlg::OnLbnDblclkList1)
END_MESSAGE_MAP()

// CMFCApplication1Dlg message handlers

BOOL CMFCApplication1Dlg::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 CMFCApplication1Dlg::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 CMFCApplication1Dlg::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 CMFCApplication1Dlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

// **************************
// * Desenvolvimento Aberto *
// **************************
//
// Nosso código começa Aqui

// Evento ocorre quando o dialogo é iniciado
void CMFCApplication1Dlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
	CDialogEx::OnShowWindow(bShow, nStatus);

	// Declara uma Array de itens
	CString itens[] = { L"Satisfaction", L"Paint it Black", L"Wild Horses", L"Brown Sugar",
		L"Sympathy for the Devil", L"Start Me Up" };

	// Adiciona os itens aos componentes
	for (int i = 0; i < 6; i++)
	{
		lista.AddString(itens[i]);
	}

	for (int i = 0; i < 6; i++)
	{
		combo.AddString(itens[i]);
	}

	// Indica qual item sera selecionado
	lista.SetCurSel(0);
	combo.SetCurSel(0);

}

// Evento ocorre na mudança de estado do item
void CMFCApplication1Dlg::OnCbnSelchangeCombo1()
{
	CString texto;
	combo.GetLBText(combo.GetCurSel(), texto);
	tmusica.SetWindowTextW(texto);
	lista.SetCurSel(combo.GetCurSel());
}

// Evento Ocorre no duplo clique do mouse
void CMFCApplication1Dlg::OnLbnDblclkList1()
{
	CString texto;
	lista.GetText(lista.GetCurSel(), texto);
	tmusica.SetWindowTextW(texto);
	combo.SetCurSel(lista.GetCurSel());
}

Combo Box

Em computação, uma caixa de combinação é um elemento de interface gráfica. Um ComboBox, que permite ao usuário escolher uma das várias opções, pode ter duas formas muito diferentes. A forma padrão é a caixa de combinação não editável, que conta com um botão e uma lista suspensa de valores. A segunda forma, chamada de caixa de combinação editável, possui um campo de texto com um pequeno botão confinando-o. O usuário pode digitar um valor no campo de texto ou clique no botão para exibir uma lista drop-down.

List Box

Em computação, uma caixa de listagem é um elemento de interface gráfica. Uma ListBox apresenta ao usuário um grupo de itens, exibidos em uma ou mais colunas. As listas podem ter muitos itens, por isso eles são muitas vezes colocados em painéis de rolagem.

Selected Index Changed

É um evento que ocorre quando um item é alterado.

Mouse Double Click

É um evento no qual é disparado quando o usuário efetua um duplo click no componente;

Exemplo:

Neste exemplo escrevemos um combobox e um listbox que interagem entre si por seus eventos. Lembre-se que não utilizamos em nosso curso o método Design First Code Later, escrevemos o programa usando código dinâmico. Após abrir o projeto no Visual Studio para abrir a unidade de código csharp clique no form,  na janela de propriedades, no botão de eventos e de um duplo clique na opção Shown.

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 Combobox
{
    public partial class Form1 : Form
    {
        // Declara os componentes
        Label titulo;
        Label tmusica;
        Label tcombo;
        Label tlista;
        ComboBox combo;
        ListBox lista;

        // Declara uma Array de itens
        string[] itens = {"Satisfaction" , "Paint it Black" , "Wild Horses", "Brown Sugar",
                          "Sympathy for the Devil", "Start Me Up"} ;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Adiciona propriedade ao formulario
            Form1.ActiveForm.Text = "Desenvolvimento Aberto - ComboList";

            // Cria componentes
            titulo = new Label();
            tmusica = new Label();
            tcombo = new Label();
            tlista = new Label();
            combo = new ComboBox();
            lista = new ListBox();

            // Adiciona propriedades ao componentes
            titulo.Text = "Rolling Stones : ";
            tmusica.Text = "Música";
            tcombo.Text = "Combobox - Escolha uma Opção";
            tlista.Text = "ListBox - Duplo click em uma Opção";

            combo.Items.AddRange(itens);
            lista.Items.AddRange(itens);

            combo.SelectedIndex = 0;
            lista.SelectedIndex = 0;

            titulo.Size = new Size (90, 20);
            tmusica.Size = new Size (200, 20);
            tcombo.Size = new Size (200, 20);
            combo.Size = new Size (160, 20);
            tlista.Size = new Size (200, 20);
            lista.Size = new Size (160, 90);

            // Posiciona componentes no formulario
            titulo.Location = new Point (5, 10);
            tmusica.Location = new Point (100, 10);
            tlista.Location = new Point(5, 50);
            lista.Location = new Point(5, 70);
            tcombo.Location = new Point(5, 170);
            combo.Location = new Point(5, 190);

            // Cria eventos
            lista.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.lista_MouseDoubleClick);
            combo.SelectedIndexChanged += new System.EventHandler(this.combo_SelectedIndexChanged);

            // Adiciona componentes ao formulario
            Form1.ActiveForm.Controls.Add(titulo);
            Form1.ActiveForm.Controls.Add(tmusica);
            Form1.ActiveForm.Controls.Add(tlista);
            Form1.ActiveForm.Controls.Add(lista);
            Form1.ActiveForm.Controls.Add(tcombo);
            Form1.ActiveForm.Controls.Add(combo);

        }

        // Evento ocorre quando seleciona um item
        private void combo_SelectedIndexChanged(object sender, EventArgs e)
        {
            Object item = combo.SelectedItem;
            tmusica.Text = item.ToString();
            lista.SelectedIndex = combo.SelectedIndex;
        }

        // Evento ocorre quando um duplo click é efetuado
        private void lista_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Object item = lista.SelectedItem;
            tmusica.Text = item.ToString();
            combo.SelectedIndex = lista.SelectedIndex;
        }

    }
}

Combo Box

Em computação, uma caixa de combinação é um elemento de interface gráfica. Um JComboBox, que permite ao usuário escolher uma das várias opções, pode ter duas formas muito diferentes. A forma padrão é a caixa de combinação não editável, que conta com um botão e uma lista suspensa de valores. A segunda forma, chamada de caixa de combinação editável, possui um campo de texto com um pequeno botão confinando-o. O usuário pode digitar um valor no campo de texto ou clique no botão para exibir uma lista drop-down.

List Box

Em computação, uma caixa de listagem é um elemento de interface gráfica. Uma JList apresenta ao usuário um grupo de itens, exibidos em uma ou mais colunas. As listas podem ter muitos itens, por isso eles são muitas vezes colocados em painéis de rolagem.

MouseListener

A interface do ouvinte para receber eventos do mouse (pressionando , soltando, clique, entrada e saída) em um componente.

Mouse Adapter

É uma classe abstrata no qual o adaptador é usado para receber eventos de mouse. Os métodos dessa classe estão vazios. Esta classe existe como conveniência para a criação de objetos do ouvinte.

Mouse Clicked

É uma void da classe  Mouse Adapter chamada quando o botão do mouse foi clicado (pressionado e liberado) em um componente.

Exemplo:

Neste exemplo escrevemos um combobox e um listbox que interagem entre si por seus eventos.

Java

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;

public class ComboList extends JPanel implements ActionListener
{
	// Declara componentes
	JLabel titulo;
	JLabel tmusica;
	JLabel tcombo;
	JLabel tlista;
	JComboBox combo;
	JList lista;

	// Construtor da classe
	public ComboList()
	{

		// Declara uma array com o conteudo da lista
		String[] itens = { "Satisfaction" , "Paint it Black" , "Wild Horses", "Brown Sugar",
				           "Sympathy for the Devil", "Start Me Up"} ;

		// Cria componentes
		titulo =  new JLabel("Rolling Stones :");
		tmusica = new JLabel("Musica");
		tcombo = new JLabel("Combobox - Escolha uma Opção");
		tlista = new JLabel("ListBox - Duplo click em uma Opção");

		// Adiciona propriedades ao componentes
		combo = new JComboBox<>(itens);
		combo.setSelectedIndex(0);
		combo.addActionListener(this);

		lista = new JList<>(itens);
		lista.setSelectedIndex(0);

		// Cria um ouvinte do mouse para o componente
		lista.addMouseListener(new MouseAdapter()
		{
			// declara o evento para o click do mouse
			public void mouseClicked(MouseEvent e)
			{
				if (e.getClickCount() == 2)
				{
					int indice = lista.getSelectedIndex();
					combo.setSelectedIndex(indice);
				}
			}
		});

		// declara o layout da tela
		setLayout(new BoxLayout(this , BoxLayout.Y_AXIS));

		// adiciona componentes ao painel
		add(titulo);
		add(tmusica);
		add(Box.createRigidArea(new Dimension(0,10)));
		add(tlista);
		add(Box.createRigidArea(new Dimension(0,5)));
		add(lista);
		add(Box.createRigidArea(new Dimension(0,10)));
		add(tcombo);
		add(Box.createRigidArea(new Dimension(0,5)));
		add(combo);
		setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

	}

	// Evento do clique do combobox
	public void actionPerformed(ActionEvent e)
	{
		JComboBox escolha = (JComboBox)e.getSource();
		int indice = (int)escolha.getSelectedIndex();
		String texto = (String)escolha.getSelectedItem();
		lista.setSelectedIndex(indice);
		tmusica.setText( texto );
	}

	// Monta a interface grafica
	private static void mostraGui()
	{
		JFrame formulario = new JFrame("Lista de Música");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JComponent painel = new ComboList();
		painel.setOpaque(true);

		formulario.setContentPane(painel);
		formulario.pack();
		formulario.setVisible(true);
	}

	public static void main(String[] args)
	{
		//  inicializa a tela
		javax.swing.SwingUtilities.invokeLater(new  Runnable()
		{

			@Override
			public void run()
			{
				mostraGui();

			}
		});
	}
}

Unmanaged Dll

É uma dll criada com código C/C++ nativo ou seja é desenvolvida com código não gerenciado e será compilada em linguagem de máquina para executar diretamente no hardware.

DA_WifiPerfilEx.dll

É uma dll desenvolvida em C++ escrita em código nativo (unmanaged), gerando uma interface com a API Wifi do Windows onde é possível manipular o perfil de rede sem fio, sem precisar utilizar todos os requisitos necessários para isto, tais como elevação de direitos, contexto de usuário local, cripotografia e etc.

A dll possui seis funções Export em português Brasil para fácil entendimento, para saber mais sobre o funcionamento do código que manipula a API Wifi leia nosso post sobre como capturar senhas de rede sem fio nesta mesma categoria.

static  DAWIFIPERFILEX_API std::wstring Perfil();
static  DAWIFIPERFILEX_API std::wstring Ssid();
static  DAWIFIPERFILEX_API std::wstring Tipo();
static  DAWIFIPERFILEX_API std::wstring Seguranca();
static  DAWIFIPERFILEX_API std::wstring Senha();
static  DAWIFIPERFILEX_API bool Conectado();

Código Aberto

Disponibilizamos esta dll em uma solução Open Source desenvolvida no Microsoft Visual Studio, escrita em C++   e dividida em dois projetos o primeiro, o DA_APP é um projeto C++ MFC visual de onde efetuamos a chamada da dll e testamos seus retornos, o segundo é o wawifiperilex.dll e que gera a dll que controla e retorna todo o gerenciamento da API Wifi .

Uso

A Dll pode ser usada por outras linguagens de programação para chamar funções diretamente da API Wifi do Windows sem precisar se preocupar todos os complexos detalhes de como manipular código em um nível mais baixo. Na imagem abaixo temos o resultado da compilação em C++, mas você pode usar esta dll de qualquer linguagem que suporte código unmanaged.

dawifiperfilex-dll

Exemplo:

Este código é usado para chamar a dll nativa de uma linguagem baseada no Windows Framework, onde não é permitido o uso por referencia de uma dll que não seja criada para código CLR. No exemplo abaixo é possível chamar a senha wireless descriptografada diretamente do C#.

Visual Studio

Por Exemplo, no visual Studio para poder compilar código unmanaged é necessário alterar as propriedades do projeto. Na janela de propriedades do projeto, na opção Debug, Enable Debug, clique em: Enable Native Code Debugging.

C#

[DllImport("dawifiperfiex.dll", EntryPoint = "#4",
            CallingConvention = CallingConvention.Cdecl,
            CharSet = CharSet.Unicode)]

        [return: MarshalAs(UnmanagedType.LPTStr)]
        public static extern string Senha ();

Download

Desenvolvimento Aberto Tools : http://desenvolvimentoabertotools.wordpress.com/

Abrimos um novo espaço para as ferramentas e utilitários desenvolvidos pelo blog Desenvolvimento Aberto. Nossa ferramenta de estreia é um pequeno utilitário chamado DA_wireless.

DA_Wireless

Extrai o perfil da rede Wifi armazenado no seu computador exibindo todos dados inclusive a senha. Este programa é ideal para recuperar as senhas wireless armazenada em um computador.

Conheça o novo espaço de ferramentas Desenvolvimento Aberto: http://desenvolvimentoabertotools.wordpress.com/

Menu Painter

É uma ferramenta com a qual você cria interfaces de usuário para seus programas ABAP. Os programas ABAP contem uma grande variedade de funções, que se enquadram em diferentes categorias dentro da interface do usuário. É importante que os usuários sejam capazes de diferenciar entre essas categorias para escolher a função certa facilmente. No sistema R/3, você organiza as funções usando o Painter Menu.

Uma instância da interface do usuário, que consiste em uma barra de menu, uma barra de ferramentas padrão, uma barra de ferramentas do aplicativo, e uma configuração de tecla de função, é chamada de GUI Status. O  GUI Status e GUI Title definem como a interface do usuário irá parecer e se comportar em um programa ABAP.

O objeto principal de uma interface de usuário é o GUI Status. Isso pode ser atribuído a qualquer tela (tela, tela de seleção, ou lista). Tecnicamente, trata-se de uma referência a uma barra de menu, uma barra de ferramentas padrão, e uma configuração de teclas de função.

mpainter_menu_title

GUI Status / GUI Title

Para  criar um Status e Title do GUI, siga os passos abaixo:

  1. Entre na transação SE41
  2. Entre com o nome do programa ZDESIGNFIRST e clique em Create.
  3. Digite no campo STATUS, ZMENU.
  4. No campo Short Text digite, Meu primeiro menu e clique OK.
  5. Na tela Maintain Status, em Menu Bar, clique no primeiro icone com o sinal de mais.
  6. Após expandir, em Display Standard, preencha o primeiro campo com a palavra: Reservas.
  7. De um duplo clique no seu campo Reservas.
  8. Apos expandir, em Code digite: F_Mostrar e em Text digite Mostrar.
  9. Faça o mesmo procedimento acima adicionando os itens Limpar e Sair.
  10. Salve e ative o Menu.
  11. Digite /nse41 para voltar a tela inicial do  Menu Painter.
  12. Selecione o programa ZDESIGNFIRST, o Status ZMENU, clique no botão de radio Title List e clique no botão Create.
  13. Em Title Code digite o mesmo nome do programa e em Title digite: “Flight Model – Reservas de Voo.” e clique OK.
  14. Para testar ative e pressione F8, coloque o status = ZMENU, Screen = 100, Title = ZDESIGNFIRST e clique em OK.
  15. Entre na transação SE38 e modifique o programa ZDESIGNFIRST como mostra o código abaixo.

Exemplo:

Neste exemplo criamos um Menu Painter para um objeto de GUI Status e um Objeto GUI Title e o anexamos ao programa ZDESIGNFIRST que fizemos anteriormente no Screen Painter com o editor gráfico.

Abap

*&---------------------------------------------------------------------*
*& Report  ZDESIGNFIRST
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Screen Painter
*&---------------------------------------------------------------------*

REPORT  ZDESIGNFIRST.

TABLES SPFLI.

DATA  OK_CODE LIKE SY-UCOMM.

CALL SCREEN 100.

MODULE STATUS_0100 OUTPUT.

* Adiciona o Menu e Titulo criados no Menu Painter
SET PF-STATUS 'ZMENU'.
SET TITLEBAR 'ZDESIGNFIRST'.

  CASE SY-UCOMM.
    WHEN 'F_SAIR'.
      LEAVE PROGRAM.

    WHEN 'F_MOSTRAR'.
      SELECT SINGLE *  FROM spfli INTO
             CORRESPONDING FIELDS OF spfli
      WHERE
             carrid = spfli-CARRID AND
             CONNID = spfli-CONNID.

    WHEN 'F_LIMPAR'.
      CLEAR SPFLI.

    WHEN 'F_GRAVAR'.
      INSERT INTO SPFLI VALUES SPFLI.
      MESSAGE 'Registro gravado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

    WHEN 'F_EXCLUIR'.
      DELETE FROM SPFLI CLIENT SPECIFIED
      WHERE
              mandt =  spfli-MANDT  AND
              carrid = spfli-CARRID AND
              CONNID = spfli-CONNID.
      MESSAGE 'Registro deletado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

  ENDCASE.
ENDMODULE.

Screen Painter Alphanumeric

O editor alfanumérico gráfico proporciona um ambiente amigável para projetar telas em todas as plataformas. Você pode iniciar o editor alfanumérico a partir da tela inicial do Screen Painter ou a partir do Navegador do repositório.

O editor alfanumérico contém as mesmas funções que o  editor gráfico. A diferença entre os dois está na maneira de criar elementos gráficos e como eles são exibidos na tela.

O sistema utiliza caracteres alfanuméricos para exibir elementos gráficos. O sistema distingue todos os elementos gráficos com cor.  Para garantir que você não possa substituir um, todos eles são protegidos contra gravação. Para alterar um elemento, você deve selecioná-lo e, em seguida, escolher uma função apropriada. Ao contrário do editor gráfico, você não pode escolher os elementos da paleta  de elemento. Em vez disso, você usa os menus.

spainter_alpha

 Aphanumeric Editor

Para criar uma tela no editor alfanumérico siga os seguintes passos:

  1. Crie um programa chamado ZDF_Alpha.
  2. Entre na transação SE51.
  3. Crie uma Screen Painter para seu programa com o Screen Number 100.
  4. Na aba Flow Logic, tire o comentario da linha: MODULE STATUS_0100.
  5. Dê um duplo clique na variavel STATUS_0100 e crie um PBO Module, selecionando o programa MAIN e salve o ZDF_Alpha.
  6. Volte para a transação SE51 e abra para modificação o seu Screen Painter ZDF_Alpha.
  7. Clique no menu Utilities e em Settings.
  8. Na aba Screen Painter, desmarque o Graphical Layout Editor e clique OK.
  9. Clique em Layout para abrir o editor gráfico alfanumérico.
  10. No Editor alfanumérico você pode usar os menus para criar componentes.
  11. Posicione o cursos na primeira linha, clique no menu Edit, Create Element, Text Field e preencha a propriedade Text para: Reserva de Voo e clique em Transfer.
  12. Posicione o cursor duas linha abaixo.
  13. No menu Goto, Dictionary/Program Fields ou CTRL + F6.
  14. Em Table/Field Name coloque SPFLI e clique em Get from Dict.
  15. Selecione todos os campos e clique em Transfer.
  16. No menu Edit clique em Select Block.
  17. Clique no menu Edit, Create Element, Pushbutton e crie um botão chamado Mostrar com a propriedade Fct_CODE = F_MOSTRAR.
  18. Crie mais 4 botões com o mesmo procedimento acima para SAIR, LIMPAR, GRAVAR e EXCLUIR.
  19. Na aba Element List va para o elemento Tipo OK e o nomeie para OK_CODE.
  20. Salve sua tela e clique em Activate.
  21. volte para o progama ZDF_Alpha e escreva o codigo abaixo.

Para usar este programa, caso você não tenha usado o post anterior  você precisa rodar o programa ZDADOS para preencher as tabelas auxiliares para o Flight Model. Você obterá uma tela igual a figura abaixo:

spainter_alpha_programa

Exemplo:

Neste programa usamos a tabela de reserva de  voo, SPFLI do Flight Model que não possui uma GUI de entrada de dados. O que vamos fazer é criar a GUI de entrada de dados apenas para esta tabela usando o Screen Painter e OPEN SQL, visto que temos que respeitar as Foreing Keys das tabelas transparentes,  é necessário rodar primeiramente o programa ZDADOS para preencher manualmente as tabelas auxiliares para nosso programa.

Abap

*&---------------------------------------------------------------------*
*& Report  ZDF_ALPHA
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Screen Painter - Alphanumeric
*&---------------------------------------------------------------------*

REPORT  ZDF_ALPHA.
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*

TABLES SPFLI.

DATA OK_CODE LIKE SY-UCOMM.
DATA PROG LIKE SY-REPID.
PROG = 'ZDF_ALPHA'.

CALL SCREEN 100.

MODULE STATUS_0100 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.

 SET TITLEBAR 'Screen Painter Alpha - Reserva de Voo' OF PROGRAM PROG.

  CASE SY-UCOMM.
    WHEN 'F_SAIR'.
      LEAVE PROGRAM.

    WHEN 'F_MOSTRAR'.
      SELECT SINGLE *  FROM spfli INTO
             CORRESPONDING FIELDS OF spfli
      WHERE
             carrid = spfli-CARRID AND
             CONNID = spfli-CONNID.

    WHEN 'F_LIMPAR'.
      CLEAR SPFLI.

    WHEN 'F_GRAVAR'.
      INSERT INTO SPFLI VALUES SPFLI.
      MESSAGE 'Registro gravado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

    WHEN 'F_EXCLUIR'.
      DELETE FROM SPFLI CLIENT SPECIFIED
      WHERE
              mandt =  spfli-MANDT  AND
              carrid = spfli-CARRID AND
              CONNID = spfli-CONNID.
      MESSAGE 'Registro deletado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

  ENDCASE.

ENDMODULE.                 " STATUS_0100  OUTPUT

Screen Painter

É uma ferramenta do ABAP Workbench que permite a criação de telas para suas transações. Você pode usá-lo tanto para criar a própria tela, com campos e outros elementos gráficos, e para escrever a lógica do fluxo atrás da tela.

O Screen Painter tem um editor de layout que você usa para criar seu layout de tela. Ele funciona no modo gráfico e  no modo alfanumérico.  Ambos os modos oferecem as mesmas funções, mas usam diferentes interfaces. No modo gráfico, você usa uma interface de arrastar semelhante a uma ferramenta de desenho. No modo alfanumérico, você usa seu teclado e menus.

Design First, Code Later

O editor de layout gráfico fornece um ambiente amigável para projetar telas. Você pode iniciar o editor de layout a partir da tela inicial do Screen Painter ou a partir do Navegador do repositório. O editor de layout possui dependências com o SAP GUI e você precisa estar usando versões compatíveis com o Graphical Layout Editor.

Depois de adicionar um elemento na sua tela, você pode convertê-lo para um outro tipo de elemento usando o menu Editar. Você também pode usar a paleta de elementos para selecionar e colocar os elementos da tela sem primeiro identificar seus campos ou você pode importar os campos e criar componentes automaticamente direto de uma tabela transparente.

Screen Painter Layout Editor

  1. Entre na transação SE38 e crie um programa chamado ZDesignFirst.
  2. Entre na transação SE51
  3. Adicione no campo Program, o nome do programa criado anteriormente e no campo Screen Number escreva o numero: 100 e clique em Create.
  4. No campo Short Description coloque : Desenvolvimento Aberto.
  5. Na aba Flow Logic, apague o caractere de comentario “*”, deixando a linha: “MODULE STATUS_0100.” compilavel.
  6. De um duplo clique na variável “STATUS_0100“.
  7. Em Create PBO Module escolha: MAIN PROGRAM, clique em Ok e salve.spainter_pbo
  8. Digite a transação /nSE51, para voltar no Screen Painter, selecione modificar e clique em Layout.spainter_layout
  9. No editor de Layout clique no icone Dictionary ou aperte a tecla F6.
  10. Na tela seguinte, no campo Table/Field Name escolha a tabela SPFLI e clique no botão GET FROM DICTIONARY.spainter_dict
  11. Selecione todos os campos, clique em OK e solte os componentes na tela (não converta nenhum componente).
  12. Coloque um componente BOX na tela e de um duplo clique, na janela de propriedades, mude a  propriedade Text para: Reserva de Voo.
  13. Coloque um PushButton na tela e preencha as propriedades: Name = Mostrar, Text = Mostrar e FctCode = F_MOSTRAR.
  14. Crie mais quatro botões e repita os mesmos procedimentos acima, o primeiro com o nome de limpar e segundo com o nome de Sair, Gravar e Excluir.
  15. Alinhe o Desing da tela como na figura abaixo.spainter_design
  16. Clique em Save, Activate e pressione Flow Logic.
  17. Na aba Element List, no elemento tipo OK nomeie para OK_CODE.spainter_okcode
  18. Na aba Attributes em Cursor Position escolha: SPFLI_CARRID
  19. Clique em Activate e volte para a transação SE38  e abra o seu programa ZDesignFirst.
  20. Use os dois códigos abaixo.

Programa Abap

O programa com a tela totalmente funcional, deve ficar como na imagem abaixo, deve ser capaz de pesquisar, gravar e excluir uma tabela transparente:

spainter_programa

Exemplo:

Neste programa usamos a tabela de reserva de  voo, SPFLI do Flight Model que não possui uma GUI de entrada de dados. O que vamos fazer é criar a GUI de entrada de dados apenas para esta tabela usando o Screen Painter e OPEN SQL, visto que temos que respeitar as Foreing Keys das tabelas transparentes,  é necessário rodar primeiramente o programa Zdados para preencher manualmente as tabelas auxiliares para nosso programa. Vale ressaltar que neste ponto só nos interessa o Screen Painter e não como manipular dados consistentemente, o que veremos mais tarde.

Abap

Zdados -Rode este programa para gravar dados nas tabelas transparentes.

*&---------------------------------------------------------------------*
*& 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 LINNHAS AEREAS'.
MATRIZ1-CURRCODE = 'REAL'.
MATRIZ1-MANDT = '001'.
MATRIZ1-URL  = 'https://desenvolvimentoaberto.wordpress.com'.

INSERT INTO SCARR VALUES MATRIZ1.

MATRIZ2-CITY = 'SAO 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 = 'AERO PORTO 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 = 'SAO 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 = 'X'.
MATRIZ4-MANDT = '001'.
MATRIZ4-PERIOD = '1'.

INSERT INTO SPFLI VALUES MATRIZ4.

* Exibe imagem
WRITE : / 'Dados inseridos'.

ZDesignFirst – Screen Painter

*&---------------------------------------------------------------------*
*& Report  ZDESIGNFIRST
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Screen Painter
*&---------------------------------------------------------------------*

REPORT  ZDESIGNFIRST.

* Define tabela de Reserva de Voo
TABLES SPFLI.

* Define variaveis do programa
DATA : OK_CODE    LIKE   SY-UCOMM.

* chama tela numero 100
CALL SCREEN 100.

MODULE STATUS_0100 OUTPUT.

* verifica ação dos botões
  CASE SY-UCOMM.
    WHEN 'F_SAIR'.
      LEAVE PROGRAM.

    WHEN 'F_MOSTRAR'.
      SELECT SINGLE *  FROM spfli INTO
             CORRESPONDING FIELDS OF spfli
      WHERE
             carrid = spfli-CARRID AND
             CONNID = spfli-CONNID.

    WHEN 'F_LIMPAR'.
      CLEAR SPFLI.

    WHEN 'F_GRAVAR'.
      INSERT INTO SPFLI VALUES SPFLI.
      MESSAGE 'Registro gravado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

    WHEN 'F_EXCLUIR'.
      DELETE FROM SPFLI CLIENT SPECIFIED
      WHERE
              mandt =  spfli-MANDT  AND
              carrid = spfli-CARRID AND
              CONNID = spfli-CONNID.
      MESSAGE 'Registro deletado com Sucesso' TYPE 'S'.
      CLEAR SPFLI.

  ENDCASE.
ENDMODULE.