Crie uma UI de classe personalizada no VBA

0

No VBA, um UserForm é apenas uma classe personalizada (com alguns eventos e propriedades) e com uma interface de usuário incorporada. Eu também gostaria de fazer uma classe personalizada com uma interface de usuário embutida, só que não é a mesma usada pelos userforms.

Por exemplo, digamos que eu queira fazer uma interface com o usuário da calculadora. Vou precisar de alguns elementos de imagem para o plano de fundo da calculadora e os botões, alguma caixa de texto para a tela e, em seguida, alguns elementos de botão para ouvir os cliques do usuário. Em seguida, vinculo tudo de alguma forma a uma classe que contém todos os ouvintes de eventos e o código de inicialização / fechamento para fazer com que a GUI realmente apareça

Minha pergunta é onde eu começo se eu quero projetar algo assim?

Método

Uma maneira de pensar é assim (no Excel):

  • Projetar a aparência da interface em um editor de imagens
  • Exporte os vários elementos como arquivos de imagem individuais e salve-os em um local / em uma planilha oculta
  • Crie uma classe no VBA que tenha código para agrupar os vários elementos da imagem, ou seja, para colocar cada um em um local pré-especificado em relação um ao outro
  • Cobble todas as partes restantes interativas (botões, caixa de texto de saída etc.) usando controles activeX, que são invisíveis e posicionados sobre seus respectivos elementos de imagem
  • Inicialize esses controles com os ouvintes de eventos da minha turma

Isso eu posso fazer de forma relativamente fácil. Mas tem as seguintes limitações principais que posso pensar:

Problemas *

  1. Em termos de eventos, estou restrito a qualquer que seja o controle activeX por padrão

Como minha abordagem constrói a interface a partir de elementos de imagem, do ponto de vista do VBA , estes seriam Shape objects (para suportar transparência - bordas arredondadas - como controles de imagem activeX não suportam isso ). Isso não gera nenhum evento, por isso, se eu quiser detectar, digamos, quando o usuário passar o mouse sobre o quadro da calculadora, eu cobrirei com rótulos ActiveX invisíveis ou fazer chamadas de API para ver o que o mouse está fazendo. O primeiro é inviável para formas complexas, o último adiciona toda uma carga de complexidade adicional. O ideal é que eu gostaria de especificar quais elementos levantariam quais eventos de uma lista daqueles disponíveis para mim.

  1. Redimensionando / reprojetando em tempo de execução

Se minha interface for criada a partir de elementos de imagem, não será possível alterar facilmente o design no tempo de execução. Se quiser, quero redimensionar o elemento de quadro da minha GUI, depois as imagens de formato raster padrão (png, jpeg etc.) ficarão borradas, imagens vetoriais (que o Excel agora fornece suporte limitado) não têm, por padrão, regras como %código%. Alterar a cor dos elementos é algo que eu gostaria de apoiar também, mas isso é muito difícil de fazer com imagens, If the frame height is changed, stretch the sides but do not stretch the toolbar at the top é uma opção, mas apenas disponível para o MSPublisher.

  1. Memória / tamanho do arquivo

A maioria dos elementos gráficos da minha interface provavelmente seriam designs bem simples. No modo Filesizewise, isso é muito melhor para um formato de imagem vetorial do que um formato raster, mas os controles activeX não suportam isso como plano de fundo. Então, o tamanho do arquivo sobe, e provavelmente algum atraso é apresentado, em relação a um simples botão adicionado a um formulário de usuário.

* nb estes são apenas para contexto, então podem ser ignorados se você quiser, ou eu posso elaborar mais sobre eles se for necessário

Conclusão

Eu não quero usar userforms porque eles já têm alguma interface definida em concreto - o quadro, a forma retangular, os ouvintes de eventos específicos para elementos específicos. Eu poderia projetar o que eu quero dentro de uma forma de usuário, mas eu gostaria de uma tela em branco em termos de aparência. Tenho certeza de que deve haver uma maneira melhor de projetar interfaces personalizadas para serem controladas com a classe VBA, como um userform pode?

Eu tenho uma vaga idéia de que o Visual Studio pode ser útil, mas eu nem sei quais tutoriais procurar. Eu só posso até agora encontrar instruções sobre o Windows Forms (que eu não quero pelas mesmas razões que eu não quero um userform), ou addins do Excel (que interagem com o Excel, mas não parecem ter sua própria interface personalizável ). Nem é bem o que eu estou procurando, então eu acho que preciso começar com um ser humano para entender o problema e me apontar na direção certa.

    
por Greedo 05.08.2017 / 19:59

0 respostas