Visualizzazione post con etichetta VB6. Mostra tutti i post
Visualizzazione post con etichetta VB6. Mostra tutti i post

martedì 3 gennaio 2012

[VB6] ADODB Command Parameters

Descrizione :
Un mio esempio di utilizzo corretto dei Parameters con ADODB e Sql Server.

+ Articolo :

Per moltissimi utenti ADODB in ambiente VB6 è sinonimo di : costruzione della stringa Sql concatenando valori e direttive Sql.
La maggior parte di coloro che passano da VB6 a VB.NET inoltre si portano dietro questa cattiva abitudine.

Ho preso questo esempio da una mia soluzione data ad utente di un Forum.
La Tabella di Test "T_Prova" è su Sql Server.
Nella Tabella "T_Prova" il Campo "Testo" è un VarChar(50), mentre il Campo "Numero" è un Decimal (8,2), quindi Precisione 8 e Scala 2 ( il minimo vitale per poter scrivere un dato Double come 123456.78, che era quello richiesto ).

Non mi soffermo sui dettagli della costruzione della CN ( Connection String ) per Sql Server.
Ho già trattato in modo abbastanza esteso l'argomento in ambiente VB.NET :
http://marcoggblog.blogspot.com/2011/11/vbnet-connessione-ad-sql-server-express.html

Inoltre segnalo sempre il celebre :
http://www.connectionstrings.com/

Nell'esempio seguente l'operazione eseguita è una INSERT :
    '...
                    
    Dim CMD As ADODB.Command
    Set CMD = New ADODB.Command
    
    With CMD

        CN.Open
        .ActiveConnection = CN
        .CommandType = adCmdText
        .CommandText = "INSERT INTO T_Prova (Testo, Numero) VALUES (?, ?)"
        
        .Parameters.Append .CreateParameter("@Testo", adVarChar, adParamInput, 50)
        .Parameters.Append .CreateParameter("@Numero", adDecimal, adParamInput)

        With .Parameters("@Numero")
            .Precision = 8
            .NumericScale = 2
        End With

    .Execute()

    End With
    
    '...

Seguono ovviamente le solite istruzioni di chiusura e rilascio.

L'ordine con cui vengono "appesi" i Parameters al Command sarà lo stesso con cui verranno passati alla clausola VALUES(?, ?, ..., ?).
In questo modo si eliminano alla base tutti i possibili errori da concatenazione.

+ Fine Articolo.

Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.



lunedì 2 gennaio 2012

[VB6] Stampa Immagini con Zoom

Descrizione :
Un mio esempio pratico su come stampare un'immagine con coordinate e dimensioni prestabilite.

+ Articolo :

Ho deciso di inserire questo breve articolo nel mio Blog, prendendo spunto da una mia soluzione data all'utente di un Forum. Data la genericità del problema posto, la soluzione, semplice ma non banale, può essere facilmente adattata a molti altri casi.

Di seguito carico un'immagine bitmap da disco e scelgo di stamparla centrata rispetto al foglio A4 di destinazione. Inoltre specifico in centimetri le dimensioni desiderate dell'immagine stampata.

--> Codice Esempio :
    Dim percorso As String
    percorso = App.Path & "\"
    
    Const A4LandscapeW As Single = 29.7
    Const A4LandscapeH As Single = 21
    
    Dim larghezzaDesiderata As Single
    larghezzaDesiderata = 20
    Dim altezzaDesiderata As Single
    altezzaDesiderata = 16
    
    'Controlli
    '...
    'If altezzaDesiderata > A4LandscapeH Then ...
    '...
    
    Dim X1 As Single
    X1 = (A4LandscapeW - larghezzaDesiderata) / 2
    Dim Y1 As Single
    Y1 = (A4LandscapeH - altezzaDesiderata) / 2
    
    Dim myPict As Picture
    Set myPict = LoadPicture(percorso & "temp.bmp")
    
    With Printer
    
        .Orientation = 2 'Landscape
        .ScaleMode = 7 'Centimetri
        .ScaleLeft = 0
        .ScaleTop = 0
        .ScaleWidth = A4LandscapeW
        .ScaleHeight = A4LandscapeH
        
        .PaintPicture myPict, X1, Y1, larghezzaDesiderata, altezzaDesiderata
        .EndDoc
        
    End With

La parte di codice "Controlli" commentata è il posto giusto per inserire il codice che dovrebbe eseguire tutte le verifiche di rito prima di dare il via alla stampa ( prima fra tutte : le dimensioni desiderate NON devono eccedere quelle massime del foglio ... ). 

Pur trattandosi di un esempio base, contiene alcune "mosse fondamentali" da compiere nella stampa da VB6, in particolare per quanto riguarda l'Oggetto Printer e il Metodo .PaintPicture().
Per chiunque si stia cimentando nella gestione di stampe di una certa complessità, e non abbia ancora deciso se stare su VB6 o passare a VB.NET, il mio consiglio è anche qui uno solo : GDI+ e .NET permettono un controllo ben superiore.

+ Fine Articolo.

Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.




lunedì 31 ottobre 2011

[VB6] Arrotondamenti Diversificati con Select Case

Descrizione :
Un esempio su come usare una Select Case per eseguire un arrotondamento personalizzato di numeri in base a range prestabiliti.

+ Articolo :

Si sfrutta la possiblità di usare Case x To y : il che comporta l'esclusione dell'estremo sinistro (x) del range, e l'inclusione del destro (y).
In sostanza Case x To y equivale a : Valore > x AND <= y.

Nell'esempio di codice seguente si desidera arrotondare il numero in input secondo questi range :

Da 0 a 10 deve essere arrotondato al 0,10
Da 10,01 a 20 deve essere arrotondato al 1,00
Da 20,01 a 30 deve essere arrotondato al 2,00
Da 30,01 a 100 deve essere arrotondato al 3,00
Da 100,01 a 1000 deve essere arrotondato al 5,00
Da 1000,01 a 2000 deve essere arrotondato al 10,00
Da 2000,00 a 3000 deve essere arrotondato al 20,00
Da 3000,01 a 5000 deve essere arrotondato al 30,00
...

--> Codice Esempio :

    Dim valore As Double
    valore = 33.0005
 
    Dim valoreRound As Double
 
    Select Case valore
 
        Case 0 To 10
            valoreRound = Round(valore, 1)
            If valoreRound < valore Then valoreRound = valoreRound + 0.1
 
        Case 10 To 20
            valoreRound = Round(valore, 0)
            If valoreRound < valore Then valoreRound = valoreRound + 1
 
        Case 20 To 30
            valoreRound = Int(valore / 2) * 2 + 2
 
        Case 30 To 100
            valoreRound = Int(valore / 3) * 3 + 3
 
        '...
        '...
        '...
 
    End Select
 
    MsgBox valoreRound
Questi i primi 4 casi. Per i successivi non fate altro che ripetere il Caso 4 sostituendo con i valori desiderati...

+ Fine Articolo.

Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.



domenica 30 ottobre 2011

[VB6] Interazione con Excel

Descrizione :
Un esempio semplice di lettura e scrittura di files Excel da VB6.

+ Articolo :

Scopo principale di questo articolo è di mettere in chiaro alcuni aspetti importanti ( almeno per me lo sono ) della gestione di documenti Office - in questo caso files di Excel 2007.

1. Si può ottenere un sensibile miglioramento sulla velocità delle operazioni impostando a False la visibilità dell'Application Excel.

2. Ottima cosa è creare un Oggetto per ogni WorkBook da gestire.

3. Le operazioni di Selezione - i vari .Select, e conseguenti richiami ad ActiveSheet, ActiveCell, e quant'altro, al 99% NON sono affatto necessari nelle operazioni di lettura o scrittura, e vanno evitate. Non solo perchè espongono a risultati spesso indesiderati, ma anche perchè rallentano il processo.

4. Una volta che ogni enità Excel è rappresentata dal proprio Oggetto, ci si riferisce sempre a quello, per ogni operazione.
Al termine del processo si chiudono e si scaricano sempre tutti gli Oggetti.

--> Nell'esempio ho due File Excel 2007 : ADD_1.xlsx e ADD_2.xlsx su cui eseguo operazioni di lettura cella per cella.
Un terzo file : SUM.xlsx destinato a contenere la somma delle celle da A1 ad A10 dei primi due.

--> N.B.: nel caso di Excel 2007 occorre aggiungere al Progetto un
RIF. a Microsoft Excel 12.0 Object Library
.

--> Codice Esempio :

    'Esempio con Excel 2007 :
    'RIF. a Microsoft Excel 12.0 Object Library

    'Percorso relativo WorkBooks
    Dim percorso As String
    percorso = App.Path & "\"
    
    'Applicazione Excel : UNA sola per tutti i WorkBooks
    'coinvolti nell'operazione
    Dim AppExcel As Excel.Application
    Set AppExcel = New Excel.Application
    'Visibilità Applicazione Excel
    AppExcel.Visible = False
    
    'Oggetti WorkBooks
    Dim WBAdd1 As Excel.Workbook
    Set WBAdd1 = AppExcel.Workbooks.Open(percorso & "ADD_1.xlsx")
    Dim WBAdd2 As Excel.Workbook
    Set WBAdd2 = AppExcel.Workbooks.Open(percorso & "ADD_2.xlsx")
    Dim WBSum As Excel.Workbook
    Set WBSum = AppExcel.Workbooks.Open(percorso & "SUM.xlsx")
    
    'Operazioni
    Dim addendo1 As Integer
    Dim addendo2 As Integer
    Dim somma As Integer
    
    Dim i As Long
    For i = 1 To 10
        
        addendo1 = WBAdd1.Worksheets("Foglio1").Range("A" & i).Value
        addendo2 = WBAdd2.Worksheets("Foglio1").Range("A" & i).Value
        
        somma = addendo1 + addendo2
        WBSum.Worksheets("Foglio1").Range("A" & i).Value = somma
        
    Next i
 
    'Salvataggio / Chiusura Oggetti
    WBAdd1.Close SaveChanges:=False
    Set WBAdd1 = Nothing
    WBAdd2.Close SaveChanges:=False
    Set WBAdd2 = Nothing
    WBSum.Close SaveChanges:=True
    Set WBSum = Nothing
    
    'Chiusura Applicazione Excel
    AppExcel.Quit
    Set AppExcel = Nothing
    
    MsgBox "Processo completato", vbInformation, "OK"

+ Fine Articolo.


Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.



[VB6] Combinazioni Semplici e con Ripetizione

Descrizione :
Due Function di mia "invenzione" per il calcolo delle Combinazioni con e senza Ripetizione.

+ Articolo :

1. Combinazioni semplici ( senza ripetizioni ) :
Si chiama combinazione semplice una presentazione di elementi di un insieme nella quale non ha importanza l'ordine dei componenti e non si può ripetere lo stesso elemento più volte.

arrayElementi è l'Array degli N elementi dell'insieme S di partenza.
Faccio notare che tale Array è di tipo Variant, e che la mia Function può operare su Array di svariati tipi, quindi Integer, String, Char, ecc...
dimensioneGruppo indica il numero di elementi da prendere in ogni Combinazione generata.

--> La Function :
Public Function CombinazioniSemplici(ByVal arrayElementi As Variant, ByVal dimensioneGruppo As Byte) As Collection
 
    Dim LC As New Collection
    If UBound(arrayElementi) = 0 Then
        Set CombinazioniSemplici = LC
    End If
    If dimensioneGruppo = 0 Or dimensioneGruppo > UBound(arrayElementi) Then
        Set CombinazioniSemplici = LC
    End If
    Dim aP() As Integer
    ReDim aP(dimensioneGruppo - 1)
    Dim i As Integer
    For i = 0 To UBound(aP)
        aP(i) = i
    Next i
    Dim j As Integer
    Dim C As String
    Dim cnt As Integer
    Do
        C = ""
        For i = 0 To UBound(aP)
            C = C & arrayElementi(aP(i))
        Next i
        LC.Add (C)
 
        cnt = 0
        For i = UBound(aP) To 0 Step -1
            If aP(i) = UBound(arrayElementi) - cnt Then
                cnt = cnt + 1
                If cnt = UBound(aP) + 1 Then Exit Do
            Else
                aP(i) = aP(i) + 1
                For j = 0 To UBound(aP)
                    If i < j Then aP(j) = aP(i) + (j - i)
                Next
                Exit For
            End If
        Next i
    Loop
 
    Set CombinazioniSemplici = LC
 
End Function

--> Un Esempio di Utilizzo ( Output su ListBox ) :
    List1.Clear
 
    Dim N() As Variant
    N = Array("a", "b", "c", "d")
    Dim K As Byte
    K = 3
 
    Dim Comb As Collection
    Set Comb = CombinazioniSemplici(N, K)
 
    Dim i As Integer
    For i = 1 To Comb.Count
        List1.AddItem (Comb(i))
    Next i
 
    MsgBox "Numero combinazioni generate = " & Comb.Count


2. Combinazioni con Ripetizione :
Quando l'ordine non è importante ma è possibile avere componenti ripetute si parla di combinazioni con ripetizione. Il numero di combinazioni con ripetizione di N oggetti di classe K è uguale a quello delle combinazioni senza ripetizione di N + K - 1 oggetti di classe K.

arrayElementi è l'Array degli N elementi dell'insieme S di partenza.
Anche qui l'Array è di tipo Variant, e la mia Function può operare su Array di svariati tipi, quindi Integer, String, Char, ecc...
classe indica il numero di elementi da prendere in ogni Combinazione generata.

--> La Function :

Public Function CombinazioniConRipetizione(ByVal arrayElementi As Variant, ByVal classe As Byte) As Collection
 
    Dim LC As New Collection
    If UBound(arrayElementi) = 0 Then
        Set CombinazioniConRipetizione = LC
    End If
    If classe = 0 Then
        Set CombinazioniConRipetizione = LC
    End If
    Dim aP() As Integer
    ReDim aP(classe - 1)
    Dim i As Integer
    Dim j As Integer
    Dim C As String
    Dim cnt As Integer
    Do
        C = ""
        For i = 0 To UBound(aP)
            C = C & arrayElementi(aP(i))
        Next i
        LC.Add (C)
 
        cnt = 0
        For i = UBound(aP) To 0 Step -1
            If aP(i) = UBound(arrayElementi) Then
                cnt = cnt + 1
                If cnt = UBound(aP) + 1 Then Exit Do
            Else
                aP(i) = aP(i) + 1
                For j = 0 To UBound(aP)
                    If i < j Then aP(j) = aP(i)
                Next
                Exit For
            End If
        Next i
    Loop
 
    Set CombinazioniConRipetizione = LC
 
End Function 

--> Un Esempio di Utilizzo ( Output su ListBox ) :
    List1.Clear
 
    Dim N() As Variant
    N = Array("a", "b", "c", "d")
    Dim K As Byte
    K = 3
 
    Dim Comb As Collection
    Set Comb = CombinazioniConRipetizione(N, K)
 
    Dim i As Integer
    For i = 1 To Comb.Count
        List1.AddItem (Comb(i))
    Next i
 
    MsgBox "Numero combinazioni generate = " & Comb.Count

+ Fine Articolo.


Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.




sabato 29 ottobre 2011

[VB6] Gestire Controlli Image a Runtime con Drag & Drop

Descrizione :
Una tecnica interessante per gestire creazione, eliminazione, spostamento di controlli Image a runtime.

+ Articolo :

--> Form di Test :
Basta avere una Form VB6 abbastanza grande, e poi aggiungere questi controlli :

- 2 Controlli Image ( che si chiameranno "Image1" e "Image2" )
su Image1 e Image2 è necessario impostare la Proprietà DragMode=1-Automatic.

- 1 altro Controllo Image ( che si chiamerà "IMG" )
su IMG è necessario impostare le Proprietà Index=0 e Visible=False.

Image1 e Image2 sono immagini "sorgenti", ossia stanno in posizione fissa rispetto alla Form, e non possono essere eliminate.
Le immagini "derivate" si possono creare semplicemente draggando sulla Form le rispettive Image sorgenti.
Le immagini derivate possono essere spostate successivamente, ed eliminate ( tasto destro del mouse )...

--> Il codice Form :
Private mouseX As Single
Private mouseY As Single
Private indiceIMG As Integer
 
Private Function nuovaImage() As Image
 
    Dim i As Integer
    i = IMG.Count
    Load IMG(i)
    IMG(i).Visible = True
 
    Set nuovaImage = IMG(i)
 
End Function
 
Private Sub Form_Load()
 
    Image1.Picture = LoadPicture("C:\Test.bmp")
    Image2.Picture = LoadPicture("C:\Test.bmp")
 
End Sub
 
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
 
    If TypeName(Source) = "Image" Then
 
        If Source.Tag = "IMG" Then
            IMG(indiceIMG).Left = X - mouseX
            IMG(indiceIMG).Top = Y - mouseY
        Else
            Dim nI As Image
            Set nI = nuovaImage
            With nI
                .Picture = Source.Picture
                .Stretch = True
                .Width = Source.Width
                .Height = Source.Height
                .Left = X - mouseX
                .Top = Y - mouseY
                .Tag = "IMG"
                .DragMode = DragModeConstants.vbAutomatic
                '...
                '...
            End With
        End If
 
    End If
 
End Sub
 
Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
 
    mouseX = X
    mouseY = Y
 
End Sub
 
Private Sub Image2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
 
    mouseX = X
    mouseY = Y
 
End Sub
 
Private Sub IMG_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
 
    If Button = vbRightButton Then Unload IMG(Index)
 
End Sub
 
Private Sub IMG_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
 
    mouseX = X
    mouseY = Y
    indiceIMG = Index
 
End Sub

1. Con un Click destro elimino una qualsiasi Image derivata ( ma non una Image sorgente ).

2. Con il pulsante sinistro invece possiamo spostare anche le Image derivate ( che in questo caso non verranno duplicate ), per correggere errori di posizionamento.


+ Fine Articolo.

Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.



 
Design by Free WordPress Themes Modificato da MarcoGG