Tips&Tricks I trucchi del mestiere

 

Recuperare un file XML dal WEB

Il tip consente di agganciarsi ad un indirizzo Web e downloadare, in locale, il contenuto di un documento XML; i dati presenti in quest'ultimo saranno quindi formattati e inseriti in una ListBox appositamente configurata. Nell'esempio, il sito web dal quale reperire il file xml Φ segnato come http://www.localhost, mentre il file XML Φ identificato come index.xml.


unit Unit1;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xmldom, XMLDoc, msxmldom, ComCtrls,
  StdCtrls, ExtCtrls, XMLIntf;

type
  TForm1 = class(TForm)
    lv: TListView;
    XMLDoc: TXMLDocument;
    pnlTop: TPanel;
    btnRefresh: TButton;
    procedure btnRefreshClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

uses ExtActns;

function DownloadURLFile(const URL_XML, File_Locale : TFileName) : boolean;
begin
  Result:=True;

  with TDownLoadURL.Create(nil) do
  try
    URL:=URL_XML;
    Filename:=File_Locale;
    try
      ExecuteTarget(nil);
    except
      Result:=False;
    end;
  finally
    Free;
  end;
end;

procedure TForm1.btnRefreshClick(Sender: TObject);
const
  URL_XML = 'http://localhost/index.xml';
var
  File_Locale : TFileName;

  StartItemNode : IXMLNode;
  ANode : IXMLNode;
  STitle, sDesc : widestring;
begin
 File_Locale := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 'temp.adpheadlines.xml';

  Screen.Cursor:=crHourglass;
  try
    if not DownloadURLFile(URL_XML, File_Locale)  then
    begin
      Screen.Cursor:=crDefault;
      Raise Exception.CreateFmt('Non Φ stato possibile connettersi al Web',[]);
      Exit;
    end;

    if not FileExists(File_Locale) then
    begin
      Screen.Cursor:=crDefault;
      raise exception.Create('Errore!');
      Exit;
    end;

    lv.Clear;

    XMLDoc.FileName := File_Locale;
    XMLDoc.Active:=True;
    StartItemNode:=XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');
    ANode := StartItemNode;
    repeat
      STitle := ANode.ChildNodes['titolo'].Text;
      sDesc := ANode.ChildNodes['descrizione'].Text;

      with LV.Items.Add do
      begin
        Caption := STitle;
        SubItems.Add(sDesc)
      end;

      ANode := ANode.NextSibling;
    until ANode = nil;
  finally
    DeleteFile(File_Locale);
    Screen.Cursor:=crDefault;
  end;
end;
end.


Come interagire con un database Access

Java realizza le connessioni ai database attraverso il componente noto come JDBC . PoichΘ Java Φ multipiattaforma, tale insieme di API fornisce funzionalitα generiche per l'accesso alle fonti condivise, indipendentemente dal loro formato. Il trucco Φ abbastanza semplice: JDBC fa da "tramite" tra un'applicazione Java ed il DBMS che si intende sfruttare, spesso attraversando anche altri collegamenti interni.
Tip fornito dal sig. C. Pelliccia

Per testare la connessione con gli archivi di Access, realizza un archivio chiamato miodatabase.mdb, e al suo interno crea una tabella nominata Persone, suddivisa in quattro campi: " ID, un banale contatore usato come chiave primaria. " Nome, di tipo testuale. " Cognome, di tipo testuale. " Indirizzo, di tipo testuale. Quindi popola la tabella con qualche dato arbitrario. A questo punto Φ necessario far riconoscere al sistema operativo il database, in modo che possa essere introdotto tra le fonti di dati ODBC gestite. Per far ci≥, Φ necessario configurare un DSN. L'operazione Φ semplice: 1. Dal "pannello di controllo" di Windows accedi alla voce "origine dati ODBC". 2. Seleziona "aggiungi" nella scheda "DSN utente". 3. Scegli, dall'elenco presentato, il driver di Access, identificato solitamente dalla dicitura "Microsoft Access Driver (*.mdb)". 4. Nella maschera ora presentata, immetti i dati necessari per la creazione del DSN. Usa il nome MioDatabase, inserisci una descrizione a piacere, e con il pulsante "seleziona" collega il DSN al file miodatabase.mdb precedentemente creato. 5. Conferm ogni operazione effettuata, salvando cos∞ il DSN utente creato.

Ora la base di dati Φ ufficialmente riconosciuta dal sistema operativo, e JDBC pu≥ accedervi sfruttando, come tramite, il driver ODBC del sistema. In casi come questo, infatti, si parla di ponte JDBC-ODBC.

Le classi Java che permettono l'accesso ai database sono contenute nel package java.sql. Ecco un esempio in grado di sfruttare il database di Access appena registrato nel sistema:

import java.sql.*;
class JavaDatabase {
  public static void main(String[] args) {
    try {
      // Carico il driver JDBC-ODBC
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      // Apro una connessione con il database
      Connection con = DriverManager.getConnection(
        "jdbc:odbc:MioDatabase"
      );
      // Preparo l'oggetto che mi permetterα
      // l'utilizzo di SQL
      Statement stat = con.createStatement();
      // Eseguo l'interrogazione, ottentendo
      // un oggetto ResultSet come risultato
      ResultSet res = stat.executeQuery(
        "SELECT * FROM Persone"
      );
      // Scorro ogni record presente e stampo
      // l'output sul video
      while (res.next()) {
        System.out.println(
          res.getString("Nome") + ", " +
          res.getString("Cognome") + ", " +
          res.getString("Indirizzo")
        );
      }
      // Chiudo il ResultSet
      res.close();
      // Chiudo lo Statement
      stat.close();
      // Chiudo la connessione
      con.close();
    } catch (Exception e) {
      System.out.println("Problema: " + e.toString());
    }
  }
}

Per prima cosa viene caricato il driver JDBC-ODBC:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Quindi la classe Connection Φ sfruttata per aprire la connessione verso il database. La stringa utilizzata, ovviamente, non Φ casuale:

jdbc:odbc:MioDatabase

MioDatabase, infatti, Φ proprio il nome del DSN creato pocanzi. A questo punto Φ superfluo commentare il resto: il package java.sql contiene tutte le funzionalitα necessarie per ogni scopo, e la documentazione ufficiale (http://java.sun.com/docs/) le illustra nel dettaglio.


Downloadare un file dal Web e salvarlo in locale

La procedura proposta consente di scaricare un file partendo dal suo URL e di salvare lo stesso in una directory locale. AffinchΘ il tip possa funzionare Φ necessario importare i package java.net e java.io.

public static void download(String url, String filename) {
	try {
		URL u = new URL(url);
		URLConnection conn = u.openConnection();
		InputStream in = conn.getInputStream();
		FileOutputStream out = new FileOutputStream(filename);
		byte[] bytes = new byte[1024];
		int l = 0;
		while ((l = in.read(bytes)) != -1)
			out.write(bytes,0,l);
		out.close();
		in.close();
	} catch (Exception e) {
		System.out.println("Problema: " + e.toString());
	}
}

La seguente riga di codice:

download("http://www.ioprogrammo.it/hello.zip","hello_ioprogrammo.zip");

recupera il file denominato hello.zip, presente all'URL indicato, e lo salva sul proprio hard-disk con il nome hello_ioprogrammo.zip


Una funzione TRIM evolutaà

Il tip proposto emula la funzione trim di Visual Basic, ovvero rimuovere gli eventuali spazi presenti all'inizio o alla fine di una stringa; utile da utilizzare anche solo lato client, nel browser.
Tip fornito dal sig. C.Miele

<%@ LANGUAGE="JScript"%>
function trim(stringa){

  var i;
  var inizio=-1;
  var fine=stringa.length;

          for(i=0;i<stringa.length;i++){
               if(stringa.charAt(i)==" ")
                    inizio=i;
               else
                    break;
          }

          for(i=stringa.length-1;i>0;i--){
               if(stringa.charAt(i)==" ")
                     fine=i;
               else
                    break;
              }
               stringa = stringa.substring(inizio+1,fine);

                  return(stringa);
}

function ltrim(stringa){

  var i;
  var inizio=-1;

    for(i=0;i<stringa.length;i++){
           if(stringa.charAt(i)==" ")
                inizio=i;
           else
                break;
          }

           stringa = stringa.substring(inizio+1,stringa.length);

          return(stringa);
    }

function rtrim(stringa){

  var i;
  var fine=stringa.length;

  for(i=stringa.length-1;i>0;i--){
   if(stringa.charAt(i)==" ")
     fine=i;
   else
    break;
 }
  stringa = stringa.substring(0,fine);
  return(stringa);
}
%>


La verifica della carta di credito

Questa funzione sviluppata in linguaggio PHP verifica l'esattezza di un codice di partita iva. La funzione restituisce 1 nel caso in cui il codice risulta corretto. Per l'utilizzo basta includere il programma in un file e richiamare la funzione CheckIVA passando come argomento la partita iva da controllare.
Tip fornito dal Sig. Rosario Sensale.

<?php
## Creato da Rosario Sensale  ##
## E.Mail gsensa@freemail.it  ##
function CheckPIva($partita_iva)
{

$dimensione=strlen($partita_iva);
$somma_disp=0;
$somma_pari=0;
$somma_totale=0;
$temp=0; //ritorna 0 se c'Φ un errore e 1 nel caso contrario

//controllo la dimensione
if ($dimensione == 11) {
        $somma_disp=intval($partita_iva[0]) + intval($partita_iva[2]) + intval($partita_iva[4]) + intval($partita_iva[6]) + intval($partita_iva[8]);

        //controllo pari
        $temp_somma=intval($partita_iva[1])*2;
        $temp_str=strval($temp_somma);
        if ($temp_somma >= 10){
            $somma_pari=$somma_pari + intval($temp_str[0]) + intval($temp_str[1]);
        }else{
            $somma_pari=$somma_pari + $temp_somma;
        }

        $temp_somma=intval($partita_iva[3])*2;
        $temp_str=strval($temp_somma);
        if ($temp_somma >= 10){
            $somma_pari=$somma_pari + intval($temp_str[0]) + intval($temp_str[1]);
        }else{
            $somma_pari=$somma_pari + $temp_somma;
        }

        $temp_somma=intval($partita_iva[5])*2;
        $temp_str=strval($temp_somma);
        if ($temp_somma >= 10){
            $somma_pari=$somma_pari + intval($temp_str[0]) + intval($temp_str[1]);
        }else{
            $somma_pari=$somma_pari + $temp_somma;
        }

        $temp_somma=intval($partita_iva[7])*2;
        $temp_str=strval($temp_somma);
        if ($temp_somma >= 10){
            $somma_pari=$somma_pari + intval($temp_str[0]) + intval($temp_str[1]);
        }else{
            $somma_pari=$somma_pari + $temp_somma;
        }

        $temp_somma=intval($partita_iva[9])*2;
        $temp_str=strval($temp_somma);
        if ($temp_somma >= 10){
            $somma_pari=$somma_pari + intval($temp_str[0]) + intval($temp_str[1]);
        }else{
            $somma_pari=$somma_pari + $temp_somma;
        }

        //somma totale
        $somma_totale=$somma_pari+$somma_disp;
        //elemento unita'
        $temp_str=strval($somma_totale);
        $controllo=10-intval($temp_str[1]);
        
        
        if (intval($partita_iva[10]) == $controllo) {
            $temp=1;
        }else{
            $temp=0;
        }
}else{
    $temp=0; //non sono 11 caratteri
}
return $temp;
}
?>

Come creare un'icona partendo da un'immagine


Semplice ma funzionale! Poche righe di codice Visual Basic .NET per creare un'icona da un'immagine JPG o BMP. Nell'esempio, al click di un bottone,denominato button1, viene richiamata una procedura (Crea_Icona) che trasforma l'immagine web.jpg (contenuta nel medesimo percorso dell'applicazione) in una classica icona Windows.
Tip fornito dal Sig. E.Mattei

Option Explicit

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
        Crea_Icona(Directory.GetCurrentDirectory & "\web.jpg")
End Sub

Public Sub Crea_Icona(ByVal StrPercorso As String)
        Dim bmp As New Bitmap(StrPercorso)
        Dim img As IntPtr = bmp.GetHicon
        Dim ico As Icon = Icon.FromHandle(img)
        Dim fStream As New FileStream(Directory.GetCurrentDirectory & 
"\web.ico", FileMode.Create)
        ico.Save(fStream)
        fStream.Flush()
        fStream.Close()
        MsgBox("Icona Creata", MsgBoxStyle.Information, "Creazione Icone")
End Sub



Come gestire la taskbar


Una serie funzioni utili a visualizzare ed a gestire un'icona nella task bar. Il tutto funziona tramite la chiamata alla funzione API "Shell_NotifyIcon" della libreria "shell32" e alla dichiarazione del tipo dato "NOTIFYICONDATA".
Tip fornito dal sig. M.Garbujo

'Dichiarazione della struttura per la gestione dell'Icona di notifica
Private Type NOTIFYICONDATA
   cbSize As Long
   hWnd As Long
   uId As Long
   uFlags As Long
   uCallBackMessage As Long
   hIcon As Long
   szTip As String * 64
End Type

'Comandi per l'inserimento, la modifica e cancellazione dell'Icona di notifica
Private Const NIM_ADD = &H0

Private Const NIM_MODIFY = &H1

Private Const NIM_DELETE = &H2


'Ritorno informazioni del mouse integrate con l'Icona di Notifica
Private Const WM_MOUSEMOVE = &H200

Private Const WM_LBUTTONDOWN = &H201     'Pulsante sinistro gi∙
Private Const WM_LBUTTONUP = &H202       'Pulsante sinistro su
Private Const WM_LBUTTONDBLCLK = &H203   'Doppio click pulsante sinistro
Private Const WM_RBUTTONDOWN = &H204     'Pulsante destro gi∙
Private Const WM_RBUTTONUP = &H205       'Pulsante destro su
Private Const WM_RBUTTONDBLCLK = &H206   'Doppio click pulsante destro

'Valori dei flag per attivare il messaggio, l'icona ed il tooltip
Private Const NIF_MESSAGE = &H1

Private Const NIF_ICON = &H2

Private Const NIF_TIP = &H4



'Dichiarazione della chiamata alla funzione API
Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" _
   (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean

Dim nid As NOTIFYICONDATA

      
Public Sub AddIconaNotifica()
   nid.cbSize = Len(nid)
   nid.hWnd = Form1.hWnd
   nid.uId = vbNull
   nid.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
   nid.uCallBackMessage = WM_MOUSEMOVE
   nid.hIcon = Form1.Icon
   nid.szTip = "Icona di notifica" & vbNullChar

   Shell_NotifyIcon NIM_ADD, nid
End Sub

Private Sub DeleteIconaNotifica()
   Shell_NotifyIcon NIM_DELETE, nid
End Sub



Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim msg As Long
    Dim sToolTip As String
    
    msg = X / Screen.TwipsPerPixelX
    Select Case msg
       Case WM_LBUTTONDOWN
       Case WM_LBUTTONUP
       Case WM_LBUTTONDBLCLK
            MsgBox "E' stato premuto il tasto sinistro"
       Case WM_RBUTTONDOWN
          sToolTip = InputBox("Inserire il nuovo tooltip:", "Conferma")
          If sToolTip <> "" Then
             nid.szTip = sToolTip & vbNullChar
             Shell_NotifyIcon NIM_MODIFY, nid
          End If
       Case WM_RBUTTONUP
       Case WM_RBUTTONDBLCLK
    End Select
End Sub



Un download manager


Spesso Φ capitato di progettare applicazioni che necessitano di interagire con internet per lo scarico di file, purtroppo non tutti hanno a propria disposizione una connessione a banda larga e, di conseguenza, quando le dimensioni dei download superano qualche mega, il tempo necessario per completare l'operazione non si riduce a pochi minuti, senza contare che si potrebbero avere delle disconnessioni accidentali, e se non si utilizzano programmi tipo "GetRight", tutto il lavoro di download potrebbe andare perso. La classe qui presentata permette di downloadare file, con la possibilitα di fermare l'operazione di download in qualsiasi momento, e di riprendere l'operazione in seguito; altres∞, se accidentalmente si perde la connessione, tutto ci≥ che si Φ scaricato non viene perso, poichΘ viene effettuare una copia dei file nella cartella temporanea denominata "C:\Down_". Trovate il progetto completo nella directory tips del Cd-Rom allegato o sul Web: cdrom.ioprogrammo.it
Tip fornito dal sig. P. Libro

Una funzione per chiamare un numero telefonico


Spesso, per comporre un numero telefonico da Visual Basic, si ricorre al componente OCX MSCOMM32, che se opportunamente configurato consente di gestire il modem per comporre un numero telefonico; tuttavia, esiste una particolare API, tapiRequestMakeCall, che consente di effettuare la medesima operazione in modo molto pi∙ semplice e immediato.
Tip fornito dalla Sig.ra N. Martire

Option Explicit
Private Declare Function tapiRequestMakeCall& Lib "TAPI32.DLL" (ByVal DestAddress$, ByVal AppName$, ByVal CalledParty$, ByVal Comment$)
Private Const TAPIERR_NOREQUESTRECIPIENT = -2&
Private Const TAPIERR_REQUESTQUEUEFULL = -3&
Private Const TAPIERR_INVALDESTADDRESS = -4&

Private Sub cmdChiama_Click()
    Dim Strtemp As String
    Dim nResult As Long
    
    nResult = tapiRequestMakeCall&(Trim$(txtNumero), CStr(Caption), "Test telefono", "")
 
    If nResult <> 0 Then
        Strtemp = "Errore durante la composizione del numero: "
        Select Case nResult
            Case TAPIERR_NOREQUESTRECIPIENT
                Strtemp = Strtemp & "Non Φ possibile avviare l'applicazione Windows si supporto"
            Case TAPIERR_REQUESTQUEUEFULL
                Strtemp = Strtemp & "Il sistema Φ attualmente impegnato in altre composizioni telefoniche"
            Case TAPIERR_INVALDESTADDRESS
                Strtemp = Strtemp & "Il numero telefonico non Φ corretto"
            Case Else
                Strtemp = Strtemp & "Errore sconosciuto"
        End Select
        MsgBox Strtemp
    End If

End Sub

Private Sub Form_Load()
    Abilita_Chiamata
End Sub

Private Sub cmdExit_Click()
    Unload Me
End Sub

Private Sub Abilita_Chiamata()
    cmdChiama.Enabled = Len(Trim$(txtNumero)) > 0
End Sub

Private Sub txtNumero_Change()
    Abilita_Chiamata
End Sub