Home   Chat Servizi Tips Forum Info MailTo Us
Il mensile giusto per gli sviluppatori

I TRUCCHI DEL MESTIERE
La rubrica raccoglie trucchi e piccoli pezzi di codice che solitamente non trovano posto nei manuali, ma sono frutto dell'esperienza di chi programma. Alcuni trucchi sono proposti dalla redazione, altri provengono da una ricerca sulla Rete delle Reti, altri ancora ci giungono dai lettori.Chi vuole contribuire potrα inviarci i suoi tips&tricks preferiti che, una volta scelti, verranno pubblicati nella rubrica, i pi∙ interessanti anche sulla rivista. Dunque inviate i vostri trucchi a ioProgrammo




Riavvio e chiusura di Windows 95 da VB5

Per chi avesse la necessita` di riavviare o chiudere una sessione Windows da Visual Basic, ecco qui il codice da scrivere in un modulo Bas.



Option Explicit


Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Const EWX_POWEROFF = 8

Declare Function ExitWindowsEx Lib "user32" _
(ByVal uFlags As Long, ByVal dwReserved As Long) As Long



Public Sub WinClose()
   'Spegnimento computer
   ExitWindowsEx EWX_SHUTDOWN, 0
End Sub

Public Sub WinReboot()
   'Riavvio Windows
   ExitWindowsEx EWX_REBOOT, 0
End Sub


In un qualsiasi evento e` possibile semplicemente inserire la chiamata WinClose o WinReboot come in questo esempio che chiude Windows dopo un click sopra un CommandButton:

Private Sub Command1_Click()
  'Chiusura sistema
  WinClose
End Sub


Il significato delle costanti definite in testa al modulo e che potreste usare per creare altre funzioni, e` il seguente:

EXW_LOGOFF

Chiude tutti i processi e fa il LogOff dell'utente. (Equivale a Disconnetti nel pulsante Start di Windows 95).

EXW_SHUTDOWN

Chiude tutti i processi e scarica la cache su HD. (Equivale a Chiudi Sessione).

EXW_REBOOT

Come SHUTDOWN + riavvio del sistema.

EXW_FORCE

Simile a SHUTDOWN, ma sono forzati tutti i processi attivi e le applicazioni in uso possono perdere dati.

Nel modulo, subito dopo la dichiarazione delle costanti, abbiamo la dichiarazione della API.
Il parametro uFlags dev'essere una delle costanti sopra riportate, mentre dwReserved e` completamente ignorato.
La chiamata API puo` essere ovviamente eseguita anche direttamente nei vari Forms di un programma. Personalmente preferisco pero` creare una funzione globale, come nell'esempio, in modo da evitare ricerche alla scoperta della "API perduta" qualora il programma sia molto complesso. Questo sistema di operare puo` risultare molto comodo specialmente quando un programma e` sviluppato per girare sia sotto Win95 che Windows NT in quanto basta cambiare i moduli bas.

Ultimo tip:
prestare attenzione durante le prove perche` funziona anche dall'ambiente IDE di VB, quindi, se dovete ancora salvare qualcosaà fatelo subito!


Riccardo Bartolini

FlatBar in Visual Basic

Se avete diversi programmi che fanno uso di ToolBar e volete dargli un nuovo look per sembrare piu` moderni, queste sono le API che fanno per voi. Unico requisito, necessita installare la Comctl32.dll versione 4.70. Una fonte sicura per installare questa Dll senza spendere una lira e` Internet Explorer 4.0. Vi sono comunque molti altri prodotti che la portano al loro interno (dovrebbe installarla anche il Service Pack 3 di VB5).


Dopo aver verificato la versione in proprio possesso, creare un modulo Bas con le seguenti dichiarazioni:


Public Const WM_USER = &H400
Public Const TB_SETSTYLE = WM_USER + 56
Public Const TB_GETSTYLE = WM_USER + 57
Public Const TBSTYLE_FLAT = &H800

Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
 (ByVal hwnd As Long, _
 ByVal wMsg As Long, _
 ByVal wParam As Long, _
 ByVal lParam As Long) As Long

Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
 (ByVal hWnd1 As Long, _
 ByVal hWnd2 As Long, _
 ByVal lpsz1 As String, _
 ByVal lpsz2 As String) As Long


à ed aggiungete ora questa procedura pubblica:



Public Sub MakeFlat(Toolbar As Toolbar)

 Dim Style As Long
 Dim hToolbar As Long
 Dim Result As Long

 hToolbar = FindWindowEx(Toolbar.hwnd, 0&, "ToolbarWindow32", vbNullString)

 Style = SendMessageLong(hToolbar, TB_GETSTYLE, 0&, 0&)

 If Style And TBSTYLE_FLAT Then
  Style = Style Xor TBSTYLE_FLAT
 Else
  Style = Style Or TBSTYLE_FLAT
 End If

 Result = SendMessageLong(hToolbar, TB_SETSTYLE, 0, Style)
 Toolbar.Refresh
End Sub



A questo punto, dall'evento Load di tutti i Forms che contengono delle ToolBar, basta richiamare la sub passandogli come argomento il nome della ToolBar stessa. A desing time la ToolBar sara` quella di sempre, ma a runtime la vedrete in stile Internet Explorer 4. Richiamando una seconda volta la stessa Sub, la ToolBar tornera` a presentare i normali pulsanti. Volendo proteste anche dare all'utente la possibilita` di scelta fra i due stili.

Riccardo Bartolini
Eseguire programmi esterni

Vi e` mai capitato di dover lanciare un eseguibile esterno al vostro programma e volerne attendere la fine dell'esecuzione prima di proseguire quella del vostro? Se usate la funzione Shell di VB vi accorgerete che non e` possibile: l'esecuzione e` asincrona ed il vostro programma continua a girare subito dopo aver lanciato l'eseguibile esterno. Soluzione: inserite queste linee di codice in un modulo ed usate la funzione RikShell al posto della normale Shell di VB.



Option Explicit
'RikShell - by Rik 8/5/98

'Come funzione Shell, ma il programma VB resta
'in attesa che il programma lanciato termini.

Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hprocess As Long, _lpExitCode As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Const STILL_ACTIVE = &H103
Const PROCESS_QUERY_INFORMATION = &H400
'

Function RikShell(exe As String, Optional WinStyle) As Integer
Dim processid As Long
Dim hprocess As Long
Dim exitcode As Long
Dim parm As Integer

'Controllo il parametro opzionale finestra
Select Case VarType(WinStyle)
  Case vbEmpty, vbNull, vbError
   parm = vbNormalFocus
  Case vbLong, vbInteger, vbSingle, vbDouble
   parm = WinStyle
  Case Else
   parm = vbNormalFocus
End Select

'Prelevo l'ID del processo lanciato
processid = Shell(exe, parm)
'Creo un Handle per quel processo
hprocess = OpenProcess(PROCESS_QUERY_INFORMATION, False, processid)
Do
 'Controllo ripetutamente che termini
 Call GetExitCodeProcess(hprocess, exitcode)
 'Lascio libero il sistema di processare le altre
 'applicazioni
 DoEvents
 Loop While (exitcode = STILL_ACTIVE)
 CloseHandle (hprocess)

End Function


Esempio di uso da un pulsante sopra un Form

Option Explicit

Private Sub cmdLancio_Click()
 RikShell "notepad.exe"
End Sub

Riccardo Bartolini