none
Acceso a los objetos de un diagrama Visio RRS feed

  • Pregunta

  • Hola a todos:

     

    Gracias por vuestro tiempo de antemano.

     

    Vereis estoy haciendo un add-ins para Visio, el cual me esta dando bastantes dolores de cabeza, ya que desconozco bastante el tema, mi problema es el siguiente:

     

    Estoy siguiendo toda la ayuda que encuentro referente al programador en el propio Visio, pero yo no sé si es que soy medio tonto o es que hay veces que te enziscas en una cosa y no ves el fallo que tienes delante de tus narices, caso que no será la primera vez que me ocurra la verdad.

     

    Bien mi Add-ins debe ser capaz de acceder a toda la información de los objeto que aparezcan el diagrama del documento Visio y resulta que me creo el objeto activeWindows de la aplicación Visio, y con el cojo la página y tal, ....... siento no poneros código pero es que lo tengo en otro ordenador que ahora mismo es inaccesible.

     

    Despues de la página, las formas con el objeto Shapes, y el caso es que no consigo ni siquiera coger el nombre del objeto del diagrama del documento Visio, ..... es como si estubiera vacío el array Shapes, no sé mañana cuando tenga acceso al otro ordenador os pongo código, pero si alguien tiene algún ejemplo de como hacerlo o algo se lo agradeceré y no sabe cuanto.

    martes, 24 de abril de 2007 22:27

Respuestas

  • Hola:

     

    Ya he resuleto todos mis problemas con el Add-in para Visio, os cuento:

     

    1º. El problema al que hacia mención un poco más arriba sobre que una vez abierto el documento visio o creado uno nuevo el boton no funcionaba, es decir que no ejecutaba el evento programado, la solución es sencilla, me he creado mi propio manejador de eventos, el cual soporta la apertura y creación de un documento, así como el clic del propio ratón, (esta no es la solución al problema, pero los eventos están centralizados en la misma clase y se entiende mejor), la verdadera solución al problema es la propiedad Tag del botón que por lo visto hay que inicializarla a una cadena cual seá, adjunto el código del botón para que lo veais.

     

    Code Snippet

    try

    {

    CommandBars cmdBars = (CommandBars)AplicacionVisio.CommandBars;

    CommandBar cmdBar = null;

    try

    {

    cmdBar = cmdBars.Add("Exportar Informaci¢n", MsoBarPosition.msoBarTop, Missing.Value, true);

    MiBoton = (CommandBarButton)cmdBar.Controls.Add(MsoControlType.msoControlButton, Missing.Value, Missing.Value, Missing.Value, true);

    MiBoton.Caption = "Exportar Informaci¢n";

    MiBoton.Tag = "Felipe";

    MiBoton.Style = MsoButtonStyle.msoButtonIconAndCaption;

    MiBoton.Click += new _CommandBarButtonEvents_ClickEventHandler(Manejador.ClickBoton);

    MiBoton.TooltipText = "Se Exportar  toda la informaci¢n del diagrama actual a un archivo XML";

    MiBoton.Picture = getImage();

    cmdBar.Visible = true;

    }

    catch

    {

    cmdBar = cmdBars["Exportar Informaci¢n"];

    }

    }

    catch (Exception ex)

    {

    MessageBox.Show("Error mientras se creaba la barra de Herramientas:" + ex.ToString());

    }

     

    Como veis pongo MiBoton.Tag = "Felipe"; y todo funciona correctamente.

     

    Por otro lado al otro problema al que hacia mención en las primeras partes del hilo, está correctamente, no existe tal problema, se accede a los objetos del diagrama, el problema era otro, con esas instrucciones se accede a cada unos de los objetos sin problema.

     

     

    Un Saludo

    martes, 15 de mayo de 2007 9:56

Todas las respuestas

  • Queremos código!!!!
    miércoles, 25 de abril de 2007 6:40
  • Hola:

     

     

    Pues aqui pongo un trozo de código:

     

     

     

    aplicacion es un objeto del tipo  Visio.Application correctamente inicializado.

     

    Visio.Window VentanaActiva = aplicacion.ActiveWindow;

    Visio.Page Pagina = VentanaActiva.PageAsObj;

    foreach(Visio.Shape Forma in Formas)

    {

                  D.setMensaje("----------"+Forma.Name);

    }

     

     

    Gracias de antemano, por vuestro tiempo y ayuda.

     

     

    Un Saludo

    miércoles, 25 de abril de 2007 7:20
  • Si pones un breakpoint en el bucle no se detiene ni una sóla vez?

     

    Has probado de realizar el siguiente cambio?

     

    Code Snippet
    foreach(Visio.Shape Forma in Formas)

     

     

    Por

     

    Code Snippet
    foreach(Visio.Shape Forma in Pagina.Shapes)

     

     

    Es que tampoco sé como defines Formas, ni como la inicializas.

     

    Lo vamos comentando. 

    miércoles, 25 de abril de 2007 7:32
  • Hola Toni:

     

    Si, la verdad es que antes se me ha pasado una línea, la he borrado si darme cuenta o algo

    el código es así.

     

    Visio.Window VentanaActiva = aplicacion.ActiveWindow;

    Visio.Page Pagina = VentanaActiva.PageAsObj;

    Visio.Shapes Formas = Pagina.Shapes;

    foreach(Visio.Shape Forma in Formas)

    {

         D.setMensaje("----------" + Forma.Name);

    }

     

     

    En cuanto a hacer lo que tu me dices, tampoco funciona.

     

    Voy a comentar otra cosilla, que me parece curiosa, yo cargo la dll despues de compilar el proyecto en VS, abro el Visio al cual le tengo puesto que carge la dll del directorio del proyecto de VS y al pulsar en mi botón de la barra del Add-ins me sale el mensaje en un dialog que tengo puesto nada más pulsar el botón, ahora bien, si abro un documento visio de un diagrama cualquiera y pulso el botón del add-ins, el mensaje que antes salia ahora no aparece.

     

     

    Un Saludo y gracias

     

    miércoles, 25 de abril de 2007 7:40
  • SI haces debug, Formas es nothing, o tiene elementos?
    miércoles, 25 de abril de 2007 7:49
  • Ok gracias Toni de Nuevo:

     

    Mira te comento:

     

    1º reconocer que acabo de descubrir que VS se le puede asociar un proceso para depurar la dll que estaba haciendo, lo cual me llena de esperanza la verdad.

    2º Que el objeto página tienen un null como una casa de grande entonces normal que no haga nada,

     

     

     

    Seguiré investigando, pero primero, con lo que he comentado antes, porque cuando abro un documento vision el botón no saca en un dialog el mensaje que debería salir. Es como si despues de cargar el documento visio, el botón no funcionara.

     

     

    Seguiré investigando.

     

     

    Gracias por la ayuda

    miércoles, 25 de abril de 2007 8:03
  • A ver que puedes sacar en claro con el debug, y nos comentas.

     

    Un saludo!

    miércoles, 25 de abril de 2007 8:12
  • Hola a todos de nuevo:

     

    Vereís independientemente del problema que explico más arriba tengo uno que me preocupa más la verdad:

     

     

    El problema nuevo del cual ya hice mención es el siguiente:

     

    una vez compilado el addin ejecuto visio y el solo carga la dll y aparece la barra de tareas o addin que estoy haciendo, hasta aqui todo perfecto, ahora el problema es el siguiente:

     

    Sin realizar ninguna acción previa, pulso el botón que he programado y se ejecuta el evento tal y como lo tengo escrito en el código fuente, ahora bien si por ejemplo abro un documento visio guardado anteriormente o empiezo uno nuevo documento, el evento del click del botón no se ejecuta es como si al abrir o crear un nuevo documento visio el evento quedara inservible.

     

     

    pongo porciones de código por si alguien vé algo raro.

     

    Code Snippet

    try

    {

      CommandBars cmdBars = (CommandBars)aplicacion.CommandBars;

      CommandBar cmdBar = null;

      try

      {

        cmdBar = cmdBars.Add("Exportar Información", MsoBarPosition.msoBarTop, Missing.Value, true);

        CommandBarButton MiBoton = (CommandBarButton)cmdBar.Controls.Add(MsoControlType.msoControlButton, Missing.Value, Missing.Value, Missing.Value, true);

        MiBoton.Caption = "Exportar Información";

        MiBoton.Style = MsoButtonStyle.msoButtonIconAndCaption;

        MiBoton.Click += new _CommandBarButtonEvents_ClickEventHandler(MiBoton_Click);

        MiBoton.TooltipText = "Se Exportará toda la información del diagrama actual a un archivo XML";

        MiBoton.Picture = getImage();

        cmdBar.Visible = true;

      }

      catch

      {

        cmdBar = cmdBars["Exportar Información"];

      }

    }

    catch (Exception ex)

    {

      MessageBox.Show("Error mientras se creaba la barra de Herramientas:" + ex.ToString());

    }

     

     

    private void MiBoton_Click(CommandBarButton Ctrl, ref bool CancelDefault)

    {

      Dialog D = new Dialog();

      D.Show();

      D.setMensaje("Procesando Información");

      Diag = D;

    }

     

    lunes, 30 de abril de 2007 7:37
  • Hola de nuevo:

     

    Por si a sirve de ayuda, acabo de comprobar que pulsando la primera vez sobre el botón, tal y como tengo puesto se muestra el Dialog con el mensaje "Procesando información", cierro el dialog que se muestra y al volver a pulsar sobre el botón no muestra nada . No se que está pasando pero me tiene frito.

     

    Un saludo

    lunes, 30 de abril de 2007 8:04
  • Hola:

     

    Ya he resuleto todos mis problemas con el Add-in para Visio, os cuento:

     

    1º. El problema al que hacia mención un poco más arriba sobre que una vez abierto el documento visio o creado uno nuevo el boton no funcionaba, es decir que no ejecutaba el evento programado, la solución es sencilla, me he creado mi propio manejador de eventos, el cual soporta la apertura y creación de un documento, así como el clic del propio ratón, (esta no es la solución al problema, pero los eventos están centralizados en la misma clase y se entiende mejor), la verdadera solución al problema es la propiedad Tag del botón que por lo visto hay que inicializarla a una cadena cual seá, adjunto el código del botón para que lo veais.

     

    Code Snippet

    try

    {

    CommandBars cmdBars = (CommandBars)AplicacionVisio.CommandBars;

    CommandBar cmdBar = null;

    try

    {

    cmdBar = cmdBars.Add("Exportar Informaci¢n", MsoBarPosition.msoBarTop, Missing.Value, true);

    MiBoton = (CommandBarButton)cmdBar.Controls.Add(MsoControlType.msoControlButton, Missing.Value, Missing.Value, Missing.Value, true);

    MiBoton.Caption = "Exportar Informaci¢n";

    MiBoton.Tag = "Felipe";

    MiBoton.Style = MsoButtonStyle.msoButtonIconAndCaption;

    MiBoton.Click += new _CommandBarButtonEvents_ClickEventHandler(Manejador.ClickBoton);

    MiBoton.TooltipText = "Se Exportar  toda la informaci¢n del diagrama actual a un archivo XML";

    MiBoton.Picture = getImage();

    cmdBar.Visible = true;

    }

    catch

    {

    cmdBar = cmdBars["Exportar Informaci¢n"];

    }

    }

    catch (Exception ex)

    {

    MessageBox.Show("Error mientras se creaba la barra de Herramientas:" + ex.ToString());

    }

     

    Como veis pongo MiBoton.Tag = "Felipe"; y todo funciona correctamente.

     

    Por otro lado al otro problema al que hacia mención en las primeras partes del hilo, está correctamente, no existe tal problema, se accede a los objetos del diagrama, el problema era otro, con esas instrucciones se accede a cada unos de los objetos sin problema.

     

     

    Un Saludo

    martes, 15 de mayo de 2007 9:56
  • Gracias de nuevo!
    martes, 15 de mayo de 2007 10:24