Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Atrum

#1
.NET (C#, VB.NET, ASP) / Re: UAC en VB.NET
9 Marzo 2012, 17:24 PM
Podrías generar otro proceso que ejecute la acción con privilegios, y al presionar el boton lo mandas a llamar, para iniciar un proceso con privilegios usa System.Diagnostics.Process

aquí esta un ejemplo donde fileName es el nombre de la aplicación que realiza la acción elevada

Código (vbnet) [Seleccionar]

    ProcessStartInfo processInfo = new ProcessStartInfo()
    processInfo.Verb = "runas"
    processInfo.FileName = fileName
    Process.Start(processInfo)

#2
Estas creando los objetos desde tu Main thread y estas tratando de accederlos desde el thread que tu creaste, esto podría ser el error, que Framework utilizas??
#3
Bueno, al parecer el error esta aqui:

Al crear una nueva instancia de la clase Interfaz_NuevoEmail, myListBox esta con valor null, entonces en esta parte del codigo no le asignas nada a myListBox

Código (csharp) [Seleccionar]


        private void button_AañadirEmail_Click(object sender, EventArgs e)
        {
            Interfaz_NuevoEmail interfazNuevoEmail = new Interfaz_NuevoEmail();
            'Aqui faltaria interfazNuevoEmail.myListBox = listBox_Email
            interfazNuevoEmail.Show();
        }



Por curiosidad por que creas una instancia del Interfaz_NuevoEmail en el constructor?
#4
Asi tal y como lo puso D4N93R, declaras tu miembro privado y accedes a el desde la propiedad:

Código (csharp) [Seleccionar]

private Listbox m_myListBox;

public ListBox MyListBox
{
     set { m_myListBox = value; }
     get { return m_myListBox; }

}


lo de la referencia nula te lo marca por que MyListBox tiene el valor Null y no esta asociada con ninguna instancia, pero no se exactamente donde este el problema recien lo probe y me funciono bien, tal ves si pones la parte de tu codigo para checarlo podemos verificar que esta mal.

Por que no colocas un punto de interrupcion en donde asignas el Listbox al miembro publico o a la propiedad, y checas los valores de las variables hasta ese momento y vas ejecutando paso por paso para ver por que se queda tu objeto como null.

#5
Bueno pues volviendo un poco al tema, con respecto a el problema de Hartigan parece que lo que se necesita es una variable publica en el formulario 2 para que haga referencia al listbox del formulario 1

Bueno yo lo haria asi:

Dentro de la clase de mi formulario 2 se declara una variable publica del tipo ListBox:

Código (csharp) [Seleccionar]

public ListBox MyList;


Despues al instanciar el formulario 2 desde el formulario 1 hacemos esto para asignarla:

Código (csharp) [Seleccionar]

Form2 frmNombres = new Form2();
frmNombres.MyList = listBox1;
frmNombres.Show();


Donde el ListBox1 es donde se quieren agregar los nombres.

Y ya en el codigo del boton que agrega el nombre en el formulario 2 hacemos esto:

Código (csharp) [Seleccionar]

        private void button1_Click(object sender, EventArgs e)
        {
            MyList.Items.Add(textBox1.Text);
        }



En teoria debe de funcionar, lo que se hace es pasar el objeto listbox del form 1 como referencia al  form 2 mediante una variable publica, al momento de asignarlo son 2 variables de distintas clases que hacen referencia al mismo objeto, ya que jamas creas la instancia nueva con "new", al agregar los nombres desde el form2 debera aparecer en el listbox del form 1.

Nota: Si nunca haces la asignacion frmNombres.MyList = listBox1 tendras un error de referencia nula.

Saludos.
#6
A ver si esto te sirve:

Código (vbnet) [Seleccionar]

        TextBox2.SelectionStart = TextBox2.Text.Length - 1
        TextBox2.Focus()
        TextBox2.ScrollToCaret()


Suerte!!
#7
Una de las opciones es utilizar un timer para verificar el proceso cada determinado tiempo, yo personalmente lo haria haciendo uso del Process y generar un evento para cuando el programa termine,  todo esto dentro de un threadPool para verificar multiples procesos si es necesario, en este codigo solo utilizo la primera coincidencia de la matriz GetProcessByName, pero si haces un foreach y con el treadPool puedes verificar todos los procesos del mismo nombre y aplicar el "Monitor" a cada uno de ellos.

Espero te funcione correctamente (yo lo corri sin problemas ;-) ).

Solo tengo un form un textbox y un button, hay que agregar las referencias System.Threading y System.Diagnostics.

Código (csharp) [Seleccionar]

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    //Declaramos el delegado para nuestro evento
    public delegate void ProccesClosed(string ProcName);

    public partial class Form1 : Form
    {
        //Declaro una variable global para el nombre del proceso
        public string ProcName;

        //Declaro mi evento nuevo, verifica que el IDE te asocie el
        //evento con el delegado (Aparece coloreado en azul claro)
        //lo digo por que no se que hice mal que a mi no me lo asocio a la primera
        public  event ProccesClosed  ProcClosed;

        public Form1()
        {
            InitializeComponent();
            //Agregamos el handler del evento
            this.ProcClosed += new ProccesClosed(ProcesoTerminado);
        }

        //Aqui la funcion que cargaremos en el hilo(thread) para verificar
        //Que el proceso termine, todos los parametros deben ser del tipo Object
        public void VerificarProceso(object  NombreProceso)
        {
            //Declaro la matriz de procesos y la lleno con los procesos que
            //tengan el nombre casteando mi objeto como string
            Process[] Proc;
            Proc = Process.GetProcessesByName((string)NombreProceso);
            //Verificamos que exista al menos una coincidencia, si no
            //obtendriamos exepcion de referencia nula
            if (Proc.Length != 0)
            {
                //Solo verifico la primera coincidencia
                Proc[0].WaitForExit();
                //Verificamos que el evento contenga el handler
                if (ProcClosed != null)
                    //se desencadena el evento
                    ProcClosed((string)NombreProceso);
            }
            else
                //En caso de que no exista dicho proceso
                MessageBox.Show("No existe el proceso " + (string)NombreProceso);
                       
        }

        //Esta es la funcion que llama el evento ProcClosed
        public void ProcesoTerminado(string NombreProcesso)
        {
            MessageBox.Show("Se ha terminado el proceso " + NombreProcesso);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ProcName = textBox1.Text;
            //Agregamos La funcion al ThreadPool, podemos agregar cuantas
            //queramos monitoreando procesos distintos
            ThreadPool.QueueUserWorkItem(VerificarProceso, ProcName );
        }
       
    }
}


Solo bastaria ejecutar y colocar en el textbox el nombre de un proceso sin la extension, como por ejemplo "notepad" o "calc", y cada thread desencadenara el evento cuando termine el proceso.

Cualquier error haganmelo saber

Suerte
#8
Hace poco tuve que hacer algo semejante, sinceramente este es un tema que me falta dominar, no es exactamente lo que necesitas , pero tal vez te sirva de algo como ejemplo, la intencion cuando hice esto fue tener controles personalizados con una funcion en especifico, como establecer automaticamente un papel tapiz de acuerdo a la hora, otro control que accesara a datos y presentara un registro de varios usuarios, etc... la especificacion para este proyecto fue que fuera posible que la aplicacion una vez ya implementada fuera posible actualizar las librerias que contienen los controles y agregar mas, asi que utilize este codigo, el cual ya lo tengo publicado en un blog, no se que tan correcto sea hacerlo asi, ya que he leido que lo mejor es cargar los ensamblados en nuevos dominios de aplicacion, pero asi resolvi esto en su momento, espero te sirva de algo.

Para empezar cree un nuevo proyecto de libreria de clases y como medida para estandarizar los nombres de los controles y los nombres de archivo sor los mismos, esto es por que hay que especificar el nombre de la clase que esta dentro del ensamblado (dll) de la cual deseas intanciar un objeto, y pues aqui como todo es dinamico, el intellisense no ayuda.

Asi que cree mi control y posteriormente lo genere, puse esta dll en el mismo directorio de mi aplicacion principal.

Entonces en mi aplicacion principal que seria la que carga los "plug-ins" le agrege esta funcion, si no me equivoco es necesaria la referencia System.Reflection

Código (vbnet) [Seleccionar]

Public Sub AddAssembly(ByVal Path As String)

'Declaro mi objeto del tipo Assembly, y cargo el fichero
'El cual es el path donde se ubica mi dll
Dim MyAssembly As Assembly = Assembly.LoadFile(Path)

'Como el nombre de mi control, mi ensamblado y mi clase son iguales
'la referencia para un control instanciado de la clase MyControl seria
'MyControl.MyControl asi que aqui simplemente extraigo el nombre de mi
'archivo sin la extension, se vera algo rudimentario pero funciona :)
Dim sClase As String = MyAssembly.ManifestModule.Name.Split(CChar("."))(0)

'Aqui obtengo la definicion del tipo de dato que tengo en mi Dll
Dim MyExtType As Type = MyAssembly.GetType(sClase & "." & sClase)

'Entonces creo la instancia nueva de acuerdo al tipo de dato obtenido
'la almaceno en mi objeto tipo object
Dim MyExtObj As Object = Activator.CreateInstance(MyExtType)

'Creo mi tabPage
Dim NewTabPage As New TabPage

'Aqui convierto mi objeto a control, probablemente esto deberia ir en
'un try catch para obtener alguna exepcion, por ejemplo que la DLL no contenga
'controles, entonces mi objeto no seria "casteable" a "control"
Dim MyControl As Control = CType(MyExtObj, Control)

'Agrego el nuevo control creado a mi TabPage
NewTabPage.Controls.Add(MyControl)

'Agrego el nuevo TabPage a mi TabControl
form.TabControl1.TabPages.Add(NewTabPage)

End Sub


Entonces con un for each  obtuve cada dll de un directorio e intente convertirlo a "control" para agregar cada dll en un tab page nuevo.

El unico problema de esto es que una vez cargado un ensamblado no se puede descargar a menos de que crees un AppDomain para cargarlo ahi y despues descargar el AppDomain. 

Espero esto te de un idea de como hacer tu sistema, y si algo esta mal acepto criticas.

Saludos
#9
Que extraño que no te abra, ya lo cheque y esta correcto (tal vez con click derecho y luego "guardar enlace como"), te dejo un enlace de easy share, ojala este si sirva:

http://www.easy-share.com/1908108750/Tutorial-Enlazar-Bases-de-datos-desde-Cero-3-capas.pdf