Mostrando postagens com marcador wxWidgets - Dicas. Mostrar todas as postagens
Mostrando postagens com marcador wxWidgets - Dicas. Mostrar todas as postagens

terça-feira, 30 de agosto de 2011

wxWidgets – Usando argc e argv em wxApp

Continuando com o tutorial básico de wxWidgets, hoje vou explicar como utilizar argc e argv de wxApp.

São valores que são passados na inicialização de programas, onde argc me retorna o número de argumentos passados e argv os valores dos argumentos.

Utilizando o mesmo código anterior de wxApp, vamos ver como funciona:

Vou criar um novo projeto, onde o executável está em /home/alex/Documentos/wxapp_tuto/tuto_wxapp/bin/Debug

Vamos ao código:

//main.h
#include <wx/wx.h>

class wxAppTuto: public wxApp
{
    public:
        bool OnInit(void);
};

//main.cpp
#include “main.h”
bool wxAppTuto::OnInit()
{
    //Aqui eu pego o valor de argc e argv...
    //Lembre-se que eles são membros de wxApp
    int get_argc = argc;
    wxString get_argv = *argv;

    //Aqui mostro estes valores em um wxMessageBox
    wxMessageBox(wxString::Format(wxT("Números de parâmetros - %d \n\n Valores - "), get_argc) + get_argv);
    return false;
}

IMPLEMENT_APP(wxAppTuto)

O resultado da execução do programa será o seguinte:


Vejam que mesmo eu não tendo passado nenhum valor na inicialização ele me retornou um valor, que é o caminho completo para o executável, este valor sempre será apresentado no primeiro valor...

Agora vamos alterar um pouco o código para pegarmos todos os argumentos que possam ser passados:

//main.cpp
#include “main.h”
bool wxAppTuto::OnInit()
{
    int get_argc = argc;

    wxString get_argv;

    //Aqui eu pego o número de argumentos e vou adicionando
    //cada um deles a wxString get_argv...
    for(int i = 0; i < argc; i++)
    {
        get_argv += wxString::Format(wxT("%s\n"), argv[i]);
    }

    wxMessageBox(wxString::Format(wxT("Números de parâmetros - %d \n\n Valores - "), get_argc) + get_argv);
    return false;
}

Agora vou reabrir o programa pela linha de comando da seguinte maneira.

//tuto_wxapp é o nome do executável...
./tuto_wxapp teste1 teste2 teste3

O resultado será o seguinte:


Veja que ele pegou cada um dos valores em um argumento, se fossemos passar uma string com espaços precisaríamos apenas passar este valor entre aspas como em “teste tutorial wxApp”.

./tuto_wxapp “teste tutorial wxApp”


Uma aplicação prática, seria quando abrimos um arquivo usando o “Abrir com...” diretamente pelo nosso programa, quando fazemos isto, o caminho para este arquivo é passado no argumento, se tentarmos abrir vários arquivos de uma vez serão passados vários argumentos, pegaríamos cada um deles e passaríamos para o sistema, isto é útil se tivermos criando um programa para exibir imagens ou um editor de textos por exemplo.

Espero que aproveitem a explicação e até a próxima.

segunda-feira, 29 de agosto de 2011

wxWidgets – Pegando o diretório da aplicação em wxWidgets


Um erro comum em wxWidgets é usar wxGetCwd() para pegar o diretório da aplicação, este comando retorna o diretório de trabalho atual, em alguns casos, onde nenhum arquivo fora do diretório da aplicação é acessado, este comando pode até funcionar, mas quando saímos do diretório da aplicação este comando retorna um valor diferente do esperado.

Vejam por exemplo o que este comando retorna quando eu tento abrir um arquivo que está no meu Desktop diretamente em um sistema que está em /home/alex/Documentos/gerbsox/bin/Debug

E se eu tentar executar o mesmo pelo Code::Blocks o resultado será o seguinte:


Para contornar esta situação eu uso uma função bem simples que segue a baixo:


//Primeiro adiciono o arquivo de cabeçalho que contém wxStandardPaths
#include <wx/stdpaths.h>

//Aqui implemento um função chamada GetExecPath() que me retornará uma wxString...

wxString GetExecPath()
{
    //Esta função wxStandardPaths::Get().GetExecutablePath()
    //me retorna um caminho completo para o executável
    //incluindo o nome do executável, o que não é o que nós queremos...
    wxString path_c = wxStandardPaths::Get().GetExecutablePath();

    //Resolvemos o problema usando wxPathOnly(...)
    //que vai retornar apenas o valor do diretório removendo o nome do arquivo...
    wxString path_ok = wxPathOnly(path_c);

    //Agora é só eu retornar o valor correto do diretório da aplicação...
   return path_ok;

    //poderíamos economizar código escrevendo a função inteira assim:
    //return wxPathOnly(wxStandardPaths::Get().GetExecutablePath());
}


Vejam que se eu não usar o wxPathOnly(...), o nome do executável também aparecerá na string
Onde /home/alex/Documentos/gerbsox/bin/Debug é o diretório da minha aplicação e gerbsox é o meu executável...

Vamos repetir o que foi feito anteriormente para ver o que o comando vai nos retornar.

Aqui executando o aplicativo pelo CodeBlocks...


...e aqui abrindo o arquivo que estava na área de trabalho...


Espero ter ajudado em alguma coisa.

Até a próxima...