Tips&Tricks I trucchi del mestiere

|>>>>>> Manuali  |  Ftp Warez  | Programmazione | Contatti <<<<<<|

Homepage       Avanti  >>>>>>

Come convertire le tabelle HTML in Excel.

Con un piccolo accorgimento è possibile esportare le tabelle HTML in formato Excel, con tanto di formule. Il trucco consiste nell'inviare l' header appropriato, in modo da indicare al browser web che il contenuto del documento che si appresta a scaricare è in formato Microsoft Excel.
L'unica accortezza da avere è quella di indicare i nomi delle funzioni Excel correttamente, in base alla lingua di installazione del software.
<%
Response.Buffer = True
Response.ContentType = "application/vnd.ms-excel"
%>
<table border="1">
<tr>
<th>Colonna A</th>
<th>Colonna B</th>
<th>Somma (A+B)</th>
</tr>
<tr>
<td>6</td>
<td>3</td>
<td><font color="red">=somma(a2:b2)</font></td>
</tr>
<tr>
<td>5</td>
<td>12</td>
<td><font color="red">=somma(a3:b3)</font></td>
</tr>
</table>



Come visualizzare il contenuto di una directory.

Per ottenere la lista dei file contenuti in una determinata directory, l'ASP mette a disposizione l'oggetto FileSystemObject. Tuttavia questo componente non dispone di nessun metodo capace di mostrare la lista dei file in ordine alfabetico; quindi, per poter ottenere questo risultato ricorriamo alla funzione:
FileList(folder)
passando come parametro il percorso della directory da visualizzare.
Function FileList(folder)
set fso = server.createobject("Scripting.fileSystemObject")
set fold = fso.getFolder(folder)
fileCount = fold.files.count
dim fNames()
redim fNames(fileCount)
cFcount = 0
for each file in fold.files
cFcount = cFcount + 1
fNames(cFcount) = lcase(file.name)
next
for tName = 1 to fileCount
for nName = (tName + 1) to fileCount
if strComp(fNames(tName),fNames(nName),0)=1 then
buffer = fNames(nName)
fNames(nName) = fNames(tName)
fNames(tName) = buffer
end if
next
next
for i = 1 to fileCount
content = content & fNames(i) & "<br>"
next
Response.Write content
End Function



Come conoscere la versione del motore VBScript.

In alcune occasioni è utile conoscere con precisione la versione del motore di scripting disponibile sul nostro server, ad esempio per essere certi che una determinata applicazione possa funzionare correttamente. Per ottenere queste informazioni possiamo utlizzare la funzione:
GetScriptEngineInfo()
Function GetScriptEngineInfo()
Dim sVersione
sVersione = ""
sVersione = ScriptEngine & " ver."
sVersione = sVersione & ScriptEngineMajorVersion & "."
sVersione = sVersione & ScriptEngineMinorVersion & "."
sVersione = sVersione & ScriptEngineBuildVersion
GetScriptEngineInfo = sVersione
End Function



Come costruire una finestra di splash con Swing

La soluzione che presentiamo con questo tip consente di costruire una finestra cosiddetta "splash", una di quelle finestre che appaiono all'avvio dei programmi. Il componente presenta due caratteristiche fondamentali: la possibilità di scomparire in seguito ad un clic dell'utente e la disponibilità di un timer attraverso cui impostare il tempo di visualizzazione, terminato il quale la finestra scomparirà automaticamente.

class SplashWindow3 extends JWindow
{
public SplashWindow3(String filename, Frame f, int waitTime)
{
super(f);
JLabel l = new JLabel(new ImageIcon(filename));
getContentPane().add(l, BorderLayout.CENTER);
pack();
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
Dimension labelSize = l.getPreferredSize();
setLocation(screenSize.width/2 - (labelSize.width/2),
screenSize.height/2 - (labelSize.height/2));
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
setVisible(false);
dispose();
}
});
final int pause = waitTime;
final Runnable closerRunner = new Runnable()
{
public void run()
{
setVisible(false);
dispose();
}
};
Runnable waitRunner = new Runnable()
{
public void run()
{
try
{
Thread.sleep(pause);
SwingUtilities.invokeAndWait(closerRunner);
}
catch(Exception e)
{
e.printStackTrace();
// can catch InvocationTargetException
// can catch InterruptedException
}
}
};
setVisible(true);
Thread splashThread = new Thread(waitRunner, "SplashThread");
splashThread.start();
}
}



Come avere un orologio sempre aggiornato

Il codice di questo semplice applet permette di toccare diversi importanti punti della programmazione Java: in particolare, l'argomento thread è qui accennato grazie alla necessità di attivare periodicamente l'aggiornamento delle scritte sullo schermo. Nel codice è presente anche il codice HTML per richiamare l'applet.

import java.applet.*;
import java.awt.*;
import java.util.*;
import java.text.*;

public class MyClock extends Applet {
MyPanel mp;
public void init() {
mp = new MyPanel(getParameter("format"));
add(mp);
}
}

class MyPanel extends Panel {
MyThread tm;
Color b, f;
SimpleDateFormat formatter;
String previousDateText = "";
String dateText;

MyPanel(String df) {
super();
formatter = new SimpleDateFormat(df);
validate();
setBackground(new Color(0).black);
setForeground(new Color(0).yellow);
b = this.getBackground();
f = this.getForeground();
tm = new MyThread(this);
tm.start();
}

public Dimension getPreferredSize() {
return new Dimension
(this.getFontMetrics(this.getFont()).stringWidth(getNow()) + 25, 30);
}

public void paint(Graphics g) {
if (g != null) {
g.setColor(b);
g.drawString(previousDateText,10,15);
g.setColor(f);
dateText = getNow();
g.drawString(dateText,10,15);
previousDateText = dateText;
}
}

public String getNow() {
return formatter.format(new Date());
}
}

class MyThread extends Thread {
MyPanel mp;

public MyThread(MyPanel a) {
mp = a;
}

public void run() {
while (true) {
try {
mp.repaint();
this.sleep(1000);
}
catch(InterruptedException e) { }
}
}
}


<HTML><HEAD></HEAD><BODY>
<APPLET CODE="MyClock.class"
HEIGHT=25 WIDTH=200>
<PARAM NAME="format" VALUE="yyyy-MM-dd hh:mm:ss">
</APPLET><P>
<APPLET CODE="MyClock.class"
HEIGHT=25 WIDTH=200>
<PARAM NAME="format" VALUE="h:mm a">
</APPLET><P>
<APPLET CODE="MyClock.class"
HEIGHT=25 WIDTH=200>
<PARAM NAME="format" VALUE="yyyy.MMMMM.dd GGG hh:mm aaa">
</APPLET><P>
<APPLET CODE="MyClock.class"
HEIGHT=25 WIDTH=200>
<PARAM NAME="format" VALUE="H:mm:ss:SSS">
</APPLET><P>
</BODY></HTML>

 

Come salvare un oggetto in un file

I motivi per cui si renda necessario salvare un oggetto su disco possono essere i più vari: dalla conservazione dello stato tra due sessioni per un applet, alla condivisione dei dati da parte di più applicazioni, alla possibilità di ricreare lo stesso identico oggetto a distanza di tempo. Quello che trovate è un metodo semplice ed efficace per effettuare questa operazione.

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;

public class WriteObjectToFile

public void writeObject(String filename,
Object obj)

File objFile = new File(filename);
try

FileOutputStream fos = new FileOutputStream
(objFile);
ObjectOutputStream oos = new
ObjectOutputStream(fos);

oos.writeObject(obj);
oos.close();
}
catch (IOException e)

System.out.println();
}
}

public static void main (String args[])

WriteObjectToFile objectWriter = new
WriteObjectToFile();

Object localObj = new Object();
String test = "This will appear in the file";
localObj = (object)test;

objectWriter.writeObject("appletFile.obj",
localObj);
}
}


Come accedere ad un dato privato

Questo tip mostra un aspetto poco noto del C++: oggetti diversi appartenenti alla stessa classe possono accedere ai membri degli altri, anche se questi membri sono privati.
Generalmente questo stile di programmazione andrebbe evitata, ma è comunque utile sapere che un oggetto può cambiare lo stato di un altro oggetto appartenente alla stessa classe… potrebbe risultare utile in situazioni particolari.
class A
{
int n;
public:
void f(A* p) {p->n=0;}// il membro private di un'altra classe!
};

int main()
{
A a1,a2;
a1.f(&a2); // a1 cambia n appartenente ad a2
}

 



Come filtrare l'input di scanf()

E' possibile forzare scanf() a leggere unicamente specifici caratteri dalla sorgente di input, ignorando tutto il resto. E' anche possibile forzare scanf() a leggere tutti i caratteri esclusi quelli specificati in un dato insieme. Il tip presenta una serie di esempi che illustrano diversi tipi di impiego di questa caratteristica.
//Supponiamo che si voglia leggere solo lettere 
// ed ignorare numeri, punteggiatura e tutto il resto
char s[12]={0};
fscanf(stdin, "%[A-Za-z]", s);

//Per leggere solo numeri
scanf("%[0123456789]", s);

//Per insiemi estesi si può usare la seguente sintassi
scanf("%[0-9]", s); // identico a scanf("%[0123456789]", s);

//Per indicare I caratteri da ignorare, utilizziamo il segno ^
// subito dopo la parentesi quadra. Nell'esempio che segue
// leggiamo tutto meno le punteggiatura
scanf("%[^,!?-.]", s); // ignore only ! ? - and .

 

 

Come prevenire problemi durante l'input

Una delle più frequenti cause di bug e di rischi per la sicurezza è l'utilizzo di array di caratteri come buffer per l'input di dati. Per evitare pug potenziali è sempre bene utilizzare degli oggetti string al posto di array di char: una oggetto string alloca automaticamente tutta la memoria necessaria, evitando così erriru di buffer overflow.
// Ecco il codice pericoloso
char buff[20];
cout << "enter your name: "
cin >> buff; // cosa accade se l'utente inserisce più di 25 caratteri?

// …ed ecco il codice sicuro!
string buff;
cout << "enter your name: "
cin >> buff;




Come leggere un input da console

Ovvero, l'altra faccia di "Hello world!"Una delle prime cose da imparare quando si impara un nuovo linguaggio è l'input da console. Utile non solo per fare i primi test nelle fasi di apprendimento, ma anche per le innumerevoli sessioni di debug che si rendono necessarie durante lo sviluppo di applicazioni complesse.

using System;

class ReadStr
{
public static void Main()
{
Console.Write("Enter your name:");
string szName = Console.ReadLine();
Console.WriteLine(" Hey "+ szName);
}
}

 

Come utilizzare più main in un'applicazione

Il metodo main è il punto di ingresso (entry point) in un'applicazione C#. Il metodo main deve essere unico per non creare confusioni al compilatore. Il C# fornisce però un sistema per aggirare questa che, almeno in fase di test e debug di un'applicazione, può rivelarsi una fastidiosa limitazione: l'opzione /main del compilatore C# permette di indicare al compilatore stesso quale metodo utilizzare come entry point. Come vedrete dal codice presente sul CD, si utilizzano nomi qualsiasi per indicare i diversi Main (nel nostro caso sono stati utilizzati i nomi MainTest1 e MainTest2) e, al momento della compilazione si specifica quale metodo utilizzare come entry point. Nel caso in questione:

               csc MainTest.cs /main:MainTest1


oppure
               csc MainTest.cs /main:MainTest2

Il compilatore genera un errore nel caso in cui non venga indicato alcun entry point.


using System;
class MainTest1
{
public static void Main()
{
Console.WriteLine("Main from Test Method1");
}
}
class MainTest2
{
public static void Main()
{
Console.WriteLine("Main from Test Method1");
}
}

 

Come effettuare il passaggio per valore e per riferimento

E' alla base della conoscenza di ongi programmatore: la differenza fra passaggio per valore e passaggio per riferimento. In questo esempio vediamo come utilizzare entrambe le modalità nel nuovo linguaggio Microsoft. Per testare il codice, è sufficiente salvarlo con il nome di PassVal.cs e compilarlo.


using System;

class Demo
{
public class t
{
public void change(ref String k)
{
k="Changed";
}

public void change(String k)
{
k="Changed";
}
}

public static void Main()
{
String i="ioProgrammo rules";
String o = "ioProgrammo rules";
t hi=new t();

// il valore di i verrà alterato
Console.WriteLine("Prima{0} ", i);
hi.change(ref i);
Console.WriteLine("Dopo {0} ", i);

// il valore di o non sarà alterato
Console.WriteLine("Prima {0} ", o);
hi.change(o);
Console.WriteLine("Dopo {0} ", o);

}
}


Come ottenere la Caption e il Thread ID della finestra sottostante il cursore del mouse

Il tips permette di reperire alcune informazioni sulla finestra attualmente identificata dalla posizione del mouse sulla stessa. In particolar modo sono restituiti la Caption (nome della finestra) ed il suo Thread ID.
Option Explicit

Const WM_COMMAND = &H111
Const MAX_PATH = 260
Const SW_SHOW = 5
Const SW_RESTORE = 9
Const SW_SHOWMINIMIZED = 2
Const SW_SHOWMAXIMIZED = 3
Const SW_SHOWNORMAL = 1

Private Type POINTAPI
x As Long
y As Long
End Type

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Type WINDOWPLACEMENT
Length As Long
flags As Long
showCmd As Long
ptMinPosition As POINTAPI
ptMaxPosition As POINTAPI
rcNormalPosition As RECT
End Type

Private lpwndpl As WINDOWPLACEMENT
Private CursorLoc As POINTAPI

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, _
ByVal yPoint As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd _
As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As _
Long, lpwndpl As WINDOWPLACEMENT) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As _
Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal _
lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal _
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As _
Long) As Long

Private Sub Command1_Click()
Dim sAppName As String
Dim lState As Long
Dim lHandle As Long
sAppName = Trim$(Text1)
If sAppName = "" Then Exit Sub
lpwndpl.Length = 44
lHandle = FindWindow(vbNullString, sAppName)
If lHandle = 0 Then Exit Sub
lState = GetWindowPlacement(lHandle, lpwndpl)
Select Case lpwndpl.showCmd
Case SW_SHOWMINIMIZED
Call ShowWindow(lHandle, SW_RESTORE)
Case SW_SHOWNORMAL, SW_SHOWMAXIMIZED
Call ShowWindow(lHandle, SW_SHOW)
End Select
Call SetForegroundWindow(lHandle)
End Sub

Private Sub Timer1_Timer()
Dim lHandle As Long
Dim lProcessId As Long
Dim lThreadId As Long
Dim lStrLen As Long
Dim sText As String
lStrLen = MAX_PATH
Call GetCursorPos(CursorLoc)
lHandle = WindowFromPoint(CursorLoc.x, CursorLoc.y)
sText = Space$(MAX_PATH)
Call GetWindowText(lHandle, sText, lStrLen)
Label1 = Left$(sText, lStrLen)
lThreadId = GetWindowThreadProcessId(lHandle, lProcessId)
Label2 = CStr(lProcessId)
End Sub




Come concatenare due file di testo

Questo tips permette di concatenare due file di testo in un unico file denominato BigText. Per ottenere questo viene fatto uso della File System Object.
Option Explicit
Private Sub Form_Load()
Concatenate
End
End Sub
Private Sub Concatenate()
Dim WkDir As String, S As String
Dim fsO As Object
Dim fsF As Object
Dim fsN As Object
Dim fsT As Object
Dim fsW As Object
S = "Concatenation of the text files:" & vbCr
Set fsO = CreateObject("Scripting.FileSystemObject")
WkDir = App.Path
Set fsW = fsO.opentextfile(WkDir & "\BigText", 2, True)
Set fsF = fsO.GetFolder(WkDir).Files
' Process each file
For Each fsN In fsF
If Right(fsN.Name, 3) = "txt" Then
S = S & fsN.Name & vbCr
Set fsT = fsO.opentextfile(WkDir & "\" & fsN.Name, 1)
fsW.writeline ("")
fsW.writeline ("############### New file " & fsN.Name & " ###############")
fsW.writeline ("")
Do While Not fsT.atendofstream
fsW.writeline (fsT.readline)
Loop
fsT.Close
End If
Next fsN
fsW.Close
MsgBox S, , "The File BigText"
Set fsO = Nothing
Set fsF = Nothing
Set fsN = Nothing
Set fsT = Nothing
Set fsW = Nothing
End Sub



Come effettuare un click automatico sullo "Start" di Windows

A volte può risultare utile effettuare, da una nostra applicazione, il click automatico sul bottone Start di Windows. La procedura proposta, ricorrendo ad una API di sistema (MapVirtualKey) si occupa proprio di effettuare questa operazione.
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" _
(ByVal wCode As Long, ByVal wMapType As Long) As Long
Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan _
As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Public Const KEYEVENTF_KEYUP = &H2

Private Sub Command1_Click()
Const MENU_KEYCODE = 91
keybd_event MENU_KEYCODE, 0, 0, 0
keybd_event MENU_KEYCODE, 0, KEYEVENTF_KEYUP, 0
End Sub





Come poter visualizzare correttamente la dimensione dei file

Quando si utilizza il PHP per creare pagine web per il download di file, spesso è utile dare all'utente una indicazione circa la dimensione dei file disponibili. Il linguaggio mette a disposizione la funzione filesize($filename), che ha proprio il compito di restituire la lunghezza in byte del file indicato, tuttavia utilizzando la funzione:
bytesize($filename)
possiamo mostrare la dimensione del file, seguita dall'unità di misura (byte) indicati mediante il multiplo più opportuno (es: 870 Byte, 1.3 MB, ...).
function bytesize($filename)
{
$byte=filesize($filename);
$tmp=$byte;
$base[0]="Byte";
$base[1]="KB";
$base[2]="MB";
$base[3]="GB";
$base[4]="TB";
$d=0;
while ( $tmp >= 1024 )
{
$tmp>>=10;
$d++;
}
$dim = round($byte / (1 << (10 * $d)),2);
return "$dim $base[$d]";
}



Come realizzare un countdown dei giorni.

Alcune volte può essere utile aggiungere nelle proprie pagine web un contatore per indicare il numero di giorni che rimangono al verificarsi di un determinato evento (fine anno, compleanni, ricorrenze, …). La funzione to_date($target) effettua proprio questo conteggio. Basterà specificare la data, nel formato GG-MM-AAAA, da confrontare con quella attuale ed avremo il numero di giorni che intercorrono tra le due.
function to_date($target)
{
$today = getdate();
$datestr = explode("-",$target);
$date = getdate(mktime(0,0,0,$datestr[1],$datestr[0],$datestr[2]));
if($datestr[2] > $today['year'])
{
$days = $date['yday'] - $today['yday'] + (($datestr[2] - $today['year']) * 356);
}
elseif ($datestr[2] < $today['year'])
{
$days = $date['yday'] - $today['yday'] - (($today['year'] - $datestr[2]) * 356);
}
else
{
$days = $date['yday'] - $today['yday'];
}
return $days . " giorni al $target";
}



Come ottenere dai web server le informazioni "nascoste".

Uno dei siti più conosciuti dagli amministratori di web server è certamente quello di Netcraft (www.netcraft.com). Su questo sito possiamo trovare molte informazioni riguardo i diversi web server, ed uno script che ci permetterà di conoscere quale server web viene utilizzato dal sito indicato. Un metodo semplice per ottenere qualche informazione simile, non certo tutte quelle disponibili su Netcraft, consiste nell'utilizzare la funzione:
http_request($server, $port)
specificando il server che vogliamo controllare e la porta da utilizzare (di default è l'80). La funzione restituirà tutte le informazioni contenute nell'header della risposta del web server.
function http_request($server, $port=80)
{
$data = "<pre>\n";
$query = "HEAD / HTTP/1.0";
$fp = fsockopen($server, $port);
if($fp)
{
fputs($fp, $query."\r\n\n");
while( ($str=fgets($fp)) != "\r\n" )
$data .= $str;
fclose($fp);
return $data."</pre>\n";
}
}



Come mostrare un'immagine ridimensionata "al volo".

In alcuni casi può essere utile visualizzare un'anteprima delle immagini che ritroveremo al click successivo, le classiche thumbnail. Piuttosto che creare a mano le versioni ridotte delle immagini, possiamo utilizzare la funzione:
img_resize($file,$new_x,$new_y)
che accetta in input il nome del file (immagine) da mostrare, la nuova larghezza e la nuova altezza. In realtà andrà indicato uno dei due parametri dimensionali, in quanto l'altro verrà calcolata in modo da mantenere invariato il rapporto x/y dell'immagine. La funzione presentata supporta le immagini in formato jpeg e necessita della libreria GD.
function img_resize($file,$new_x=0,$new_y=0)
{
$dim=getimagesize($file);
$img1=imagecreatefromjpeg($file);
if ( $new_x > 0 )
$new_y=ceil($dim[1] * $new_x / $dim[0]);
else
$new_x=ceil($dim[0] * $new_y / $dim[1]);
$img_resized=imagecreatetruecolor($new_x,$new_y);
imagecopyresampled($img_resized,$img1,0,0,0,0,$new_x,$new_y,$dim[0],$dim[1]);
header("Expires: Mon, 1 Jan 1990 00:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Content-type: image/jpeg");
imagejpeg($img_resized,"",100);
}



Come calcolare il tempo di esecuzione di uno script

Un'informazione interessante per analizzare le prestazioni degli script PHP è quella relativa al tempo necessario all'esecuzione. Un semplice metodo per ottenere queste informazioni è quello di inserire, in testa allo script che vogliamo analizzare, il codice:
  $time = microtime(); 
$time = explode(" ",$time);
$time = $time[1] + $time[0];
$starttime = $time;
successivamente, dopo il corpo dello script, possiamo inserire il codice:
  $time = microtime(); 
$time = explode(" ",$time);
$time = $time[1] + $time[0];
$endtime = $time;
$totaltime = ($endtime - $starttime);
printf("Pagina creata in %f secondi.", $totaltime);
che ci mostrerà proprio il tempo che è stato necessario al sistema per ultimare lo script.
<?
$time = microtime();
$time = explode(" ",$time);
$time = $time[1] + $time[0];
$starttime = $time;
?>


<?
$time = microtime();
$time = explode(" ",$time);
$time = $time[1] + $time[0];
$endtime = $time;
$totaltime = ($endtime - $starttime);
printf("<br> Pagina creata in %f secondi.", $totaltime);
?>


 

Come stabilire il massimo numero di colori per il nostro monitor

Utilizzando l'API di Windows GetDeviceCaps() è possibile reperire dal proprio sistema alcune importanti parametri, come per esempio il numero massimo di colori supportati dalla corrente risoluzioni video del nostro monitor.
function GetColorsCount : integer;
var
h : hDC;
begin
Result := 0;
try
h := GetDC( 0 );
Result :=
1 shl
(
GetDeviceCaps( h, PLANES ) *
GetDeviceCaps( h, BITSPIXEL )
);
finally
ReleaseDC( 0, h );
end;
end;



Come aggiungere un documento al menu di Windows "Start | Documenti"

Per default, Windows tiene traccia dei documenti che sono stati utilizzati di recente. La lista dei documenti viene proposta nel menu Start-Documenti; è possibile tuttavia interagire con tale menù, inserendo nuove voci allo stesso:
uses ShellAPI, ShlOBJ;

procedure AddToStartDocumentsMenu(
sFilePath : string );
begin
SHAddToRecentDocs(
SHARD_PATH,
PChar( sFilePath ) );
end;

Ecco come aggiungere una voce al menu:

AddToStartDocumentsMenu( 'c:\windows\MyWork.txt' );



Come ottenere la lista dei servizi installati nel proprio sistema

Il tips consente di reperire una lista di servizi Windows, sia essi attivi che non, il tutto avviene invocando la funzione ServiceGetList( '', SERVICE_WIN32, SERVICE_STATE_ALL, ListBox1.Items );
const
SERVICE_KERNEL_DRIVER = $00000001;
SERVICE_FILE_SYSTEM_DRIVER = $00000002;
SERVICE_ADAPTER = $00000004;
SERVICE_RECOGNIZER_DRIVER = $00000008;

SERVICE_DRIVER =
(SERVICE_KERNEL_DRIVER or
SERVICE_FILE_SYSTEM_DRIVER or
SERVICE_RECOGNIZER_DRIVER);

SERVICE_WIN32_OWN_PROCESS = $00000010;
SERVICE_WIN32_SHARE_PROCESS = $00000020;
SERVICE_WIN32 =
(SERVICE_WIN32_OWN_PROCESS or
SERVICE_WIN32_SHARE_PROCESS);

SERVICE_INTERACTIVE_PROCESS = $00000100;

SERVICE_TYPE_ALL =
(SERVICE_WIN32 or
SERVICE_ADAPTER or
SERVICE_DRIVER or
SERVICE_INTERACTIVE_PROCESS);

uses WinSvc;

function ServiceGetList(
sMachine : string;
dwServiceType,
dwServiceState : DWord;
slServicesList : TStrings )
: boolean;
const
//
// assume that the total number of
// services is less than 4096.
// increase if necessary
cnMaxServices = 4096;

type
TSvcA = array[0..cnMaxServices]
of TEnumServiceStatus;
PSvcA = ^TSvcA;

var
j : integer;
schm : SC_Handle;
nBytesNeeded,

nServices,

nResumeHandle : DWord;

ssa : PSvcA;
begin
Result := false;

schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_ALL_ACCESS);

if(schm > 0)then
begin
nResumeHandle := 0;

New(ssa);

EnumServicesStatus(
schm,
dwServiceType,
dwServiceState,
ssa^[0],
SizeOf(ssa^),
nBytesNeeded,
nServices,
nResumeHandle );

for j := 0 to nServices-1 do
begin
slServicesList.
Add( StrPas(
ssa^[j].lpDisplayName ) );
end;
Result := true;
Dispose(ssa);
CloseServiceHandle(schm);
end;
end;

Per avviare la funzione:

ServiceGetList( '', SERVICE_WIN32, SERVICE_STATE_ALL, ListBox1.Items );

HOME      avanti  >>>>>