jueves, 14 de abril de 2016

Cerrar una ventana desde un control hijo usando Event Handlers

Supongamos que creamos un widget de Gtk que deseamos poner en una ventana, pero que en algún evento del mismo se cierre la ventana madre.
En este caso usaremos un Event Handler para que la ventana madre se suscriba al mismo.



Para lograrlo se pueden seguir los siguientes pasos:


1.- Definimos el EventHandler en el control hijo.

    public event EventHandler Closing;


2.- La clase madre debe suscribirse al mismo.
 por ejemplo:
 

    MainWindow win = new MainWindow();
    win.Closing += new EventHandler(OnDeleteEvent);
 

pero como en nuestro caso es un widget omitiremos la parte de la creación del widget.
el código quedaría así:



    this.pdfviewerwidget2.Closing += new EventHandler(OnDeleteEvent);


4.-Al cerrar el widget revisar el evento y activarlo:
 

    private void btnClose_Clicked (object sender, EventArgs e)
       {
       if (Closing != null) {
           Closing (this, new EventArgs ());
       }
           this.Destroy();
       }



5.- Ahora; creamos el método que se activará al cerrar el control hijo en la clase madre:


    public void OnDeleteEvent(object sender, EventArgs args)
       {
           this.Destroy ();
       }


Y esto es todo lo necesario, ahora en cuanto cerremos en el botón hijo se active el botón Close, se activará el evento OnDeleteEvent en la clase madre.

martes, 5 de abril de 2016

Cambiar el ancho de las Scrollbars en Gtk

Para cambiar el ancho de las scrollbars de Gtk2 es necesario editar los archivos de configuración del tema actual; para esto es necesario editar el archive gtkrc localizado en el folder gtk-2.0 del tema usualmente localizado en /usr/share/themes.


La variable a cambiar es: GtkRange::slider_width


Si desea tambien cambiar el tamaño de las flechas en los extremos de la Scrollbar la variable es GtkRange::stepper_size

Comprimir y descomprimir archivos con el comando tar

Para comprimir archivos
tar zcvf <archivo> <Fuente(s)> 


Para descomprimir archivos
tar zxvf  <archivo>

Modificar el tamaño de un disco virtual fijo en virtualbox

Es posible modificar el tamaño de un disco virtual fijo clonando el disco a un disco de VirtualBox "estándar" siguiendo los siguientes pasos.
  • Clonar el disco actual a uno nuevo con el siguiente comando:
"c:\program files\oracle\virtualbox\VBoxManage.exe" clonehd <DiscoActual>.vdi <NuevoDisco>.vdi --variant Standard
  • Cambiar el tamaño del Nuevo disco con el siguiente comando:
"c:\program files\oracle\virtualbox\VBoxManage.exe" modifyhd <NuevoDisco>.vdi --resize 30000 (30GB)
  • Luego hay que modificar la definición de la máquina virtual para usar el Nuevo disco en lugar del primero.
  • Dependiendo del sistema operativo es necesario modificar la partición para usar el espacio agregado.
NOTA: Las rutas pueden cambiar dependiendo de la ruta de instalación de VirtualBox.

martes, 15 de marzo de 2016

Usar la ConnectionString en el archivo machine.config de mono

Para usar un archivo de configuración semejante al app.config o web.config de .NET en windows es posible agregarlo al archivo machine.config que existe en /etc/mono/<Version de Mono> de manera similar a como lo usamos en los archivos de configuración en Windows.

viernes, 12 de febrero de 2016

Como guardar información de configuración de una aplicación WinForms

Como guardar información de configuración de una aplicación WinForms
Cuando necesitamos guardar información de configuración de nuestra aplicación; ya sea de Windows o de Consola, podemos hacerlo en la configuración de la aplicación.

Visual Studio nos proporciona una manera muy fácil de hacerlo; para hacerlo es necesario ir a las propiedades de la aplicación, seleccionar la sección de Settings y agregar la información deseada.
Para leer este dato se puede hacer de la siguiente manera:


 myVariable = Properties.Settings.Default["MiPropiedad"].ToString();


Si deseamos actualizarla se hace de la siguiente manera:


 Properties.Settings.Default["MiPropiedad"] = "AlgunValor";
 Properties.Settings.Default.Save();


NOTA: Si en el alcance (scope) de la propiedad seleccionamos Application este valor será de solo lectura.

lunes, 1 de febrero de 2016

Extender una clase con c# 3.0

A veces es necesario agregar nueva funcionalidad a una clase y no deseamos modificar el código de esa clase; ya sea porque no tenemos acceso al código fuente o porque no deseamos tocar algo que ya funciona.
Con c# 3.0 estas clases se pueden extender; para hacerlo es necesario hacer lo siguiente:

-Agregar una clase estática con un método estático. El primer parámetro de la "nueva clase" se agrega automáticamente, pero es necesario marcarlo con la palabra this. cuando esta clase es creada dicho objeto es pasado automáticamente al método.
De esta manera el método agregado en la clase extensora aparece en el intellisense del objeto original.


Ejemplo:
Si tenemos una clase Customer y deseamos agregarle un método para renombrar el nombre del cliente la clase quedaría de la siguiente manera:

public static class CustomerExtender
{
 public static void ChangeName(this Customer cust, String newName)
 {
  cust.Name = newName;
 }
}


Donde el parámetro cust es el objeto Customer original. De esta manera podemos usar el siguiente código:

 Customer customer = new Customer("Smart");
 customer.ChangeName("Walmart");

 customer.Save();

¡Como si el método ChangeName existiera en la clase original!.

viernes, 15 de enero de 2016

Mostrar un Loading Panel al cargar y al procesar los datos que consuman mucho tiempo de proceso

Primero hay que crear el Panel como en el siguiente ejemplo:

<dx:ASPxLoadingPanel ID="loadingPanel" ClientInstanceName="loadingPanel" runat="server" Modal="true"
        Width="70%" Height="30px" Text="Se está procesando su petición; por favor no abandone la sesión porque podría tener inconsistencia en sus datos..." >
    </dx:ASPxLoadingPanel>

Crear una función con Javascript que muestre el panel :

 function showLoadingPanel() {
        loadingPanel.Show();
    }

Si se desea que solo muestre el panel encima de un control como el ASPxGridview se puede usar el método ShowInElementByID del Panel:

function showLoadingPanel() {
        loadingPanel.ShowInElementByID(grvHarnessItems.name);
    }

Crear una función con Javascript que esconda el panel:

 function OnControlsInitialized(s, e) {
        setTimeout(function () {
            loadingPanel.Hide();
        }, 1000);
    }


Mostrar el panel al inicio de la página si esta tiene que cargar muchos datos y se tardará más de 2 segundos. (Creo que es buena práctica hacer que las consultas a la base de datos consuman menos de 2 segundos, pero si esto no es posible recomiendo mostrar el panel):

<script type="text/javascript">
            showLoadingPanel();
    </script>

Mostrar el panel al presionar cada botón que vaya a efectuar una tarea que consuma más de 2 segundos, llamando al método que muestra el Panel, usando el método Click del lado del cliente:

<dx:ASPxButton ID="btnSave" runat="server" OnClick="btnSave_Click" 
        Text="Grabar" Width="120px" style="display:inline-block;">
        <ClientSideEvents Click="function(s, e) {
showLoadingPanel();
}" />
        <Image Url="~/Content/Images/Save.png" Width="24px">
        </Image>
    </dx:ASPxButton>

Usar el objeto ASPxGlobalEvents para detectar cuando todos los controles han sido inicializados y esconder el Panel con la función creada para tal evento:

 <dx:ASPxGlobalEvents ID="ge" runat="server">
        <ClientSideEvents ControlsInitialized="OnControlsInitialized" />
    </dx:ASPxGlobalEvents>

Mover mensajes seleccionados a un personal folder en Oulook 2016

Este es un ejemplo de como mover los mensajes seleccionados a un personal folder (pst) en Outlook 2016 usando VBA. Sub MoveInbox()     Mov...