top of page

Aero - pagina codici (1)

STAMPA DA RICHTEXTBOX

 

Il componente RichTextBox non prevede un metodo di stampa, del tipo:

 

richtextbox.print o richtextbox.showprintdialog

 

perciò per stampare il contenuto di una richtextbox bisogna usare un escamotage particolare: bisogna convertire in elemento grafico tutto il contenuto e stamparlo come 'stringa grafica' tramite e.graphics.drawstring

 

Purtroppo questo metodo non permette facilmente di stampare il documento a colori, ma solo in un colore assegnato al pennino grafico.

Bisogna per prima cosa aggiungere un controllo PrintDocument al progetto, al quale assegnamo questa sub:

 

Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

        e.Graphics.DrawString(RichTextBox1.Text, RichTextBox1.Font, Brushes.Black, 100, 100)

End Sub

 

Potete cambiare il colore di stampa assegnando un altro valore a Brushes (es: Brushes.Aqua).

Il comando di stampa, da assegnare eventualmente a un bottone chiamato PrintButton, é il seguente:

 

    Private Sub PrintButton_Click(sender As System.Object, e As _System.EventArgs) Handles PrintButton.Click

        PrintDocument1.PrinterSettings.Copies = 1

        PrintDocument1.Print()

    End Sub

 

Volendo potete anche cambiare il numero di copie; se per esempio é presente una textbox1 in cui digitare il numero di copie desiderate, il codice cambierà in :

 

        PrintDocument1.PrinterSettings.Copies = val(textbox1.text)

SEMPLICE SISTEMA DI REGISTER / LOGIN

 

Una mia idea personale, un sistema di login e registrazione utenti che non coinvolge database o altre vie esterne per il salvataggio delle password. Si basa su un vecchio sistema che veniva utilizzato negli script javascript a fine anni 90.

In sostanza il principio é assegnare all' ambiente utente una cartella composta, per esempio, da nomeutente+password.

Per esempio quando si registra l' utente

 

id = admin

pass = access

 

il sistema crea una cartella chiamata adminaccess.

 

Il codice si basa sulla presenza di due bottoni (loginokbutton e registerokbutton) e due textbox (useridtext e passtext):

 

Private Sub registerokbutton_Click(sender As System.Object, e As System.EventArgs) Handles registerokbutton.Click

        Try

            If Not Directory.Exists("C:\users\" & useridtext.Text & passtext.Text) Then

                 My.Computer.FileSystem.CreateDirectory("C:\users\" & useridtext.Text & passtext.Text)

 

                Else

                MsgBox("User already exists")

            End If

        Catch ex As Exception

            MsgBox("Unable to create profile for " & useridtext.Text & " " & ex.Message)

        End Try

 

    End Sub

 

questo esempio crea la cartella composta da userid+password come sotto cartella di  c:\users\

 

Al momento del login non faremo altro che verificare l' esistenza di una cartella con questa struttura, in questa maniera:

 

Private Sub loginokbutton_Click(sender As System.Object, e As System.EventArgs) Handles loginokbutton.Click

        Try

            If Not Directory.Exists("C:\users\" & useridtext.Text.ToString & passtext.Text.ToString) Then

 

                MsgBox("User " & useridtext.Text.ToString & " does not exist or wrong password")

 

            Else

               logintimer.Start()

                My.Settings.loggedinuser = useridtext.Text

                My.Settings.Save()

                My.Settings.Reload()

            End If

        Catch ex As Exception

            MsgBox("Unable to access " & useridtext.Text)

        End Try

    End Sub

 

In questo login abbiamo due elementi aggiuntivi: un timer chiamato logintimer e una variabile di ambiente loggedinuser. Questa variabile andrà creata nella cartella Impostazioni di My Project, e deve essere del tipo 'String'.

 

Il codice del timer di login sarà questo:

 

Private Sub logintimer_Tick(sender As System.Object, e As System.EventArgs) Handles logintimer.Tick

            'lancia il form principale post login , chiamato per esempio FormMaster

            Me.Hide()

            formmaster.Show()

            logintimer.Stop()

 

        End If

    End Sub

 

 

Ovviamente al momento della registrazione si possono aggiungere delle varianti sulla creazione della cartella... si potrebbe utilizzare per esempio:

 

nomeutente+codiceprestabilito+password

 

dove il codice prestabilito potrebbe per esempio essere un codice assegnato a seconda del 'grado di accesso' al sistema. Un power user potrebbe avere 002, un administrator potrebbe avere 001, un utente semplice 003, e così via...

nel nostro caso, quello dell' utente admin, avremmo:

admin001access come nome della cartella.

Supponiamo di creare l'utente amministratore... il sistema saprà che deve aggiungere 001 tra nome utente e password... Il codice IF di registrazione cambierà quindi in :

 

If Not Directory.Exists("C:\users\" & useridtext.Text & "001" & passtext.Text) Then

                 My.Computer.FileSystem.CreateDirectory("C:\users\" & useridtext.Text & "001" & passtext.Text)

 

Al momento della login, poi, il sistema non fa altro che verificare se esiste una cartella con questa struttura, secondo una logica:

se NON esiste la cartella nomeutente001password significa che l' account amministratore non é stato settato

 

            If Not Directory.Exists("C:\users\" & useridtext.Text.ToString & "001" & passtext.Text.ToString) Then

 

                MsgBox("Administrator account not set")

Else

               logintimer.Start()

                My.Settings.loggedinuser = "001"

                My.Settings.Save()

                My.Settings.Reload()

            End If

 

A questo punto entra in gioco la variabile loggedinuser. Se la cartella esiste infatti (consizione Else) parte il timer di avvio e alla variabile loggedinuser viene assegnato il codice amministratore.

In tutti gli altri momenti in cui il programma debba decidere se ad agire é un amministratore o meno infatti si potrà usare la condizione:

 

If my.settings.loggedinuser <> "001" Then

.....

End if

 

Questo sistema si può inserire nei Form_Load per esempio per rendere accessibili determinate funzioni solo all' admin, o a un qualsiasi utente prestabilito.

CREARE FORM TRASCINABILI

 

I migliori form sono quelli senza bordi, ma senza di essi é impossibile spostarli con il trascinamento del mouse, a meno che non utilizziamo 3 eventi del Form, che andranno codificati come segue:

 

Intanto sotto il Public Class dobbiamo definire 3 variabili:

 

    Dim drag As Boolean

    Dim mousex As Integer

    Dim mousey As Integer

 

poi dobbiamo definire i 3 eventi che le gestiscono. Il primo evento (MouseDown) stabilisce che se il tasto sinistro del mouse é premuto siamo in situazione di trascinamento; il secondo evento (MouseMove) verifica durante il movimento se il tasto é ancora premuto (se siamo ancora in situazione di drag = true) e aggiorna le coordinate; il terzo evento (MouseUp) stabilisce che se il tasto sinistro del mouse è rilasciato non siamo più in condizione di trascinamento e quindi il form si fermerà anche se continuiamo a muovere il mouse:

 

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown

 

        drag = True 

        mousex = Windows.Forms.Cursor.Position.X - Me.Left 

        mousey = Windows.Forms.Cursor.Position.Y - Me.Top 

    End Sub

 

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove

 

               If drag Then

 

            Me.Top = Windows.Forms.Cursor.Position.Y - mousey

            Me.Left = Windows.Forms.Cursor.Position.X - mousex

 

        End If

    End Sub

 

 

    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp

        drag = False 

    End Sub

IL BROWSER CON TAB

 

Per creare un browser con tab bisogna sostanzialmente usare 2 oggetti:

- una classe Browser (nel codice chiamato CustomTabbedBrowser) che eredita le caratteristiche del browser standard di Visual Studio

- una subroutine per aggiungere un nuovo tab (nel codice chiamata AddTab), il quale chiamerà al suo interno una istanza della classe browser customizzata. Questa sub dovrà contenere almeno due parametri: la URL e il Tabcontrol per controllare le funzioni del tab.

 

Il codice per la classe CustomTabbedBrowser sarà qualcosa di simile (sperimentate come meglio credete):

 

Public Class CustomTabbedBrowser

    Inherits WebBrowser

    Public Sub New()

        Me.ScriptErrorsSuppressed = True

 

    End Sub

    Private Sub DocCompleted() Handles Me.DocumentCompleted

        browser.ComboBox1.Text = Me.Url.ToString

        browser.ComboBox1.Items.Add(browser.ComboBox1.Text)

        Dim TP As TabPage = Me.Tag

        If Me.DocumentTitle.Length > 15 Then

            TP.Text = Me.DocumentTitle.Substring(0, 14) & "..."

        Else

            TP.Text = Me.DocumentTitle

 

        End If

 

 

    End Sub

End Class

 

A questo punto nella classe principale del nostro browser dobbiamo inserire la Sub che genera i nuovi tab:

 

Public Sub AddTab(ByRef URL As String, ByRef TabControl As TabControl)

        Dim NewBrowser As New CustomTabbedBrowser

        Dim NewTab As New TabPage

        NewBrowser.Tag = NewTab

        NewTab.Tag = NewBrowser

        TabControl.TabPages.Add(NewTab)

        NewTab.Controls.Add(NewBrowser)

        NewBrowser.Dock = DockStyle.Fill

        NewBrowser.Navigate(URL)

 

    End Sub

 

Come vedete la sub crea una istanza NewBrowser della classe CustomTabbedBrowser, crea un nuovo tab del tipo TabPage, e gestisce le funzioni per aggiungere l' istanza NewBrowser nel tab appena creato e farlo andare alla URL passatagli.

 

Una volta inserite queste subroutine fondamentali, ogni comando del browser dovrà agire su una istanza del browser.

Così se per esempio creando un browser senza tab il comando per navigare sarà ME.NAVIGATE (TEXTBOX1.TEXT) dove Textbox1 é la textbox utilizzata per digitare l' indirizzo web, nel caso del browser con tab dovremo prima definire una istanza, e poi indirizzarla, con un codice simile:

 

Private Sub NavigateButton_Click(sender As System.Object, e As System.EventArgs) Handles NavigateButton.Click

    Dim wb As CustomTabbedBrowser = Me.TabControl1.SelectedTab.Tag

      wb.Navigate(Me.TextBox1.Text)

 

    End Sub

 

Lo stesso principio varrà per i pulsanti Back, Forward, Home e Refresh, che dovrannno utilizzare l' istanza con i seguenti comandi:

-wb.GoBack()

-wb.GoForward()

-wb.GoHome

-wb.Refresh()

 

Fondamentali sono i due pulsanti per aggiungere e rimuovere i tabs:

 

Private Sub AddTabButton_Click(sender As System.Object, e As System.EventArgs) Handles AddTabButton.Click

        AddTab("about:blank", TabControl1)

 

    End Sub

 

Private RemTabButton_Click(sender As System.Object, e As System.EventArgs) Handles RemTabButton.Click

        If TabControl1.TabPages.Count = 1 Then

            Me.Close()

        Else

            TabControl1.TabPages.Remove(TabControl1.SelectedTab)

 

        End If

    End Sub

 

 

 

LA RIDUZIONE A ICONA DELLE APPLICAZIONI

 

Il sistema di riduzione a icona di Aero é realizzato tramite un pulsante icona e due brevi codici. I pulsanti icona sono inizialmente invisibili, in Aero sono disposti nell' angolo in alto a sinistra del desktop.

I codici qui sotto sono scritti per un sistema generico che utilizzi un pulsante icona chiamato ICONBUTTON collocato nel form MAIN e una applicazione chiamata APPFORM.

 

Codice di ICONBUTTON_CLICK nel form MAIN

 

appform.WindowState = FormWindowState.Normal
        iconbutton.Visible = False

 

 

Codice di APPFORM_RESIZE

 

If Me.WindowState = FormWindowState.Minimized Then

            main.iconbutton.Visible = True

End If

If Me.WindowState = FormWindowState.Normal Then

            main.iconbutton.Visible = False

End If

 

 

 

bottom of page