Community
 
Aggiungi lista preferiti Aggiungi lista nera Invia ad un amico
------------------
Crea
Profilo
Blog
Video
Sito
Foto
Amici
   
 
 
 


Allineare i campi di una DBGrid.
Se devi allineare a sinistra la 5° colonna di un DbGrid che si chiama DB fai
DB.Columns(5).Alignment = vbLeft

Come si fa ad allineare il testo a destra (per esempio i numeri) in una textbox? (la proprietà alignment =2 non funziona)
Oltre a impostare l'allineamento a destra, devi anche settare la proprieta' MultiLine a True e disabilitare la pressione del tasto INVIO con un bel
    If KeyAscii = vbKeyReturn then KeyAscii = 0
nell'evento Keypress.

Come si formatta una textbox inserendo un separatore delle migliaia nella cifra? (es. 10.000 oppure 25.000)
txtPrezzi(Index) = Format(txtPrezzi(Index), "###,###,###")

Nell'evento Change della text inserisci il seguente codice:

Text1.Text = Format(Text1.Text, "#,##0")
Text1.SelStart = Len(Text1.Text)

C'e' modo di sapere, magari con qualche API, se una Grid ha una scrollbar verticale?
La funzione GestScrollRange restituisce 0 se un controllo non ha una barra e 1 se è visualizzata.


Imposto una label la cui caption è 'ora'. nelle condizioni generali ho impostato 'dim ora as date'. Negli eventi del timer ho messo l' intervallo regolato a 1000 e...
    ora = time
    label1.caption = ora
Mi succede una cosa inconcepibile: ogni 20 secondi l'ora salta passa cioè da 20 a 22 secondi, falsandomi quindi tutto. Perchè?

Poco... di solito per non avere problemi la proprietà Interval deve essere impostata ad 1/2 dell' intervallo "reale". Questo perchè un evento inaspettato o con priorità maggiore del tuo PRG, fa ignorare l'evento del timer.
Il Timer come specificato dalla documentazione non è affidabile per un controllo esatto del tempo, in quanto il suo controllo dipende dal fatto che il processore abbai o meno tempo per lui. Nel senso che se imposti un orologio che aggiorna una label ogni secondo, ma poi fai partire una procedura che non ha mai il DoEvents e si becca la CPU tutta per lui, fino a quando non ha terminato la label non verra' aggiornata. Devi utilizzare la API per avere una gestione del tempo 'reale'.

Come posso trovare una stringa in una combo-box in un tempo ragionevole?
Puoi usare questa funzione dele API:
     index = SendMessage(hWnd, CB_FINDSTRING, (WPARAM) indexStart, (LPARAM) (LPCSTR) lpszFind);

indexStart:
elemento da cui iniziare la ricerca (-1 per iniziare dall'inizio)
lpszFind:
stringa da ricercare
CB_FINDSTRING
si ferma alla prima occorrenza, anche se la stringa specificata è solo la parte iniziale di quella trovata.
CB_FINDSTRINGEXACT
ricerca la stringa specificata per intero.
index:
l'indice dell'elemento trovato o CB_ERR in caso la stringa non sia trovata.

Spero di averti dato qualche indizio, puoi anche vedere nell'help dell'SDK del VC++.

Avete presente un form con un controllo data e un qualsiasi tipo di grid associato? Se il database e' grandicello o su un media lento (=CD) la prima volta che il form viene visualizzato viene fuori uno spiacevole effetto d'incasinamento grafico, dovuto al fatto che VB ridisegna solo parzialmente la grafica in quanto buona parte del sistema e' impegnato a popolare la grid... solo al termine della lettura del database il form viene correttamente ridisegnato. Sapete come evitare questo fenomeno??
Chiama DoEvents dopo la creazione della form, ma prima di accedere al database. Questo permette a Windows di processare i messaggi WM_PAINT per la form.

Ho appena installato Visual basic 5.0 Italiano. Attivo VB5,sulla finestra"Nuovo progetto" faccio clic su "Esistente",vado sulla dir "samples"/"visdata" , apro visdata.vbp,poi faccio "Esegui/avvia". L'adorabile VB5 mi dice: "Errore durante il caricamento.Per informazioni vedere il file:c:\Programmi\...\VDMDI.log". Vado a vedere VDMDI.log e leggo: "Riga 15:impossibile caricare il controllo tblToolbar licenza non disponibile"
1° metodo
Hai qualche problema con l'installazione dei Common Controls, quindi prova a cercare sul CD un file con un nome tipo vbctrls.reg e cliccaci sopra, in modo da cercare di aggiustare i dati dell'installazione nel registry.

2° metodo
scarica VBC.exe da
    http://support.microsoft.com/download/support/mslfiles/Vbc.exe
serve proprio a risolvere questo bug, praticamente ricontrolla l'installazione,leggi comunque la documentazione nel KB per VB,cerca per VBC.exe.

Memoria stack esaurita!
Creo una classe EXE Active (quindi "out-of-process"), ma quando istanzio l'oggetto con set myvar= new myclas VB5 mi da l'errore di memoria stack esaurita.

Il problema si presenta perchè si innesta una ricorsione su una routine o su piu' routine in maniera incrociata. Vale a dire la Sub A prima di fine chiama per un motivo da stabilire ( generalmente indesiderato ) una Sub B la quale a sua volta prima di terminare richiama direttamente o indirettamente la Sub A. Lo stack, che contiene tanti record di attivazione per quante routine sono in esecuzione, invece di deallocare spazio per la routine terminata, deve allocarne ancora per la nuova chiamata. Una cosa simile, con centinaia di istanze della stessa routine in esecuzione, causa lo stack overflow. Controlla il flusso di esecuzione attraverso la modalità Passo-Passo ( F8 ) così potrai vedere dove si ripetono chiamate indesiderate. Mal che vada piazza dei break point e quindi controlla lo stato dello stack in quel istante premendo Ctrl+L.

Il numero di errore non è sempre chiaro, come posso visualizzare la descrizione dell' errore tramite la finestra di dubug?
Metti un "on error goto GestErrore" ed in GestErrore scrivi:

    Debug.print err.description

almeno hai un idea del perche` VB si lamenta.
L'errore 3020 spiega infatti :"Update o CancelUpdate senza AddNew o Edit".

Qualcuno sa se ci sono controlli Data/Ora e Valuta per VB 4 soprattutto (e VB5) simili a quelli di Access ? Sarebbe più bello inserire date e numeri senza dover necessariamente inserire gli / ogni volta.
Io ho fatto questa funzione per le date:


Function FormattaData(ByVal Data As String) As String
'
'Formatta una data a seconda del numero di caratteri digitati:
'0 caratteri = nessuna data
'1 carattere = giorno (trasf. giorno in due cifre mese corrente
anno corrente)
'2 caratteri = giorno ( mese corrente anno corrente)
'3 caratteri = formato errato
'4 caratteri = giorno mese ( anno corrente)
'5 caratteri = formato errato
'6 caratteri = giorno mese anno (trasf. anno in 4 cifre)
'7 caratteri = formato errato
'8 caratteri = giorno mese anno
'9 caratteri = formato errato
'10 caratteri = data
'
Dim sRetVal As String
'
If IsNumeric(Data) Then
Select Case Len(Data)
Case 0
sRetVal = ""
Case 1
sRetVal = PadL(Data, 2, "0") & "/" & PadL(Month(Now), 2, "0") &
"/" & Trim$(Str$(Year(Now)))
Case 2
sRetVal = Data & "/" & PadL(Month(Now), 2, "0") & "/" &
Trim$(Str$(Year(Now)))
Case 4
sRetVal = Left$(Data, 2) & "/" & Right$(Data, 2) & "/" &
Trim$(Str$(Year(Now)))
Case 6
sRetVal = Left$(Data, 2) & "/" & Mid$(Data, 3, 2) & "/" &
Trim$(Str$(Year(Now) \ 100)) & Right$(Data, 2)
Case 8
sRetVal = Left$(Data, 2) & "/" & Mid$(Data, 3, 2) & "/" &
Right$(Data, 4)
Case 10
sRetVal = Data
Case Else
sRetVal = ""
End Select
Else
sRetVal = Data
End If
'
If sRetVal <> "" And Not IsDate(sRetVal) Then sRetVal = ""
FormattaData = sRetVal
'
End Function

Function PadL(ByVal cTesto As String, nLunghezza As Integer,
cCarattere As String) As String
'
'aggiunge tanti caratteri cCarattere a sinistra di cTesto quanti ne
servono per portare cTesto alla lunghezza nLunghezza
'
Dim nLungTesto As Integer, nCaratteri As Integer
If IsNull(cTesto) Then
PadL = Space$(nLunghezza)
Exit Function
End If
nLungTesto = Len(Trim$(cTesto))
If nLunghezza < nLungTesto Then
PadL = Left$(Trim$(cTesto), nLunghezza)
Exit Function
End If
nCaratteri = nLunghezza - nLungTesto
PadL = String$(nCaratteri, cCarattere) Trim$(cTesto)
'
End Function

Forse e' un po' "casereccia", ma la trovo comoda.

Devo trasformare dei numeri da decimale a binario. Come?
Dim x As Integer, intResto As Integer, strBinary As String

x = 254

While x
   intResto = IIf(x Mod 2 > 0, 1, 0)
   strBinary = CStr(intResto) & strBinary
   x = x \ 2
Wend

Print strBinary '11111110

Vorrei, perfavore, sapere se esiste la possibilità di emulare in VB5 la funzione Access Nz() che converte una variabile con valore Null al numero 0.
Function Nz(Valore)
    If IsNull(Valore) Then
        Select Case VarType(Valore)
            Case vbByte, vbInteger, vbLong, vbSingle, vbDouble, vbCurrency
                Nz = 0
            Case vbString
                Nz = ""
            Case Else
                Nz = vbNullString
        End Select
    Else
        Nz = Valore
    End If
End Function

Come posso fare a scaricare un file da un sito FTP? Utilizzo VB5 professional e dovrei riuscire a trasferire un file da internet. Ho provato l'esempio riportato dall'Help di VB5 sull'utilizzo di OpenURL:
Inet1.AccessType = icUseDefault
Dim b() As Byte
Dim strURL As String

' Si suppone che l'URL sia valido.
strURL = "ftp://ftp.microsoft.com/developr/drg/Win32/Autorun.zip"

' Recupera il file come matrice di dati byte.
MousePointer = 11
b() = Inet1.OpenURL(strURL, icByteArray)

Open "C:\temp\Autorun.zip" For Binary Access Write As #1
Put #1, , b()
Close #1

MousePointer = 0
MsgBox "Done"

Come posso creare un nuovo oggetto clonandolo da un altro?
Dichiari una variabile del tipo di oggetto che vuoi conare, per esempio una form.
    dim newForm as form
crei il nuovo oggetto copiando il form1 (già esistente) in newForm
    set newForm = new form1
visualizzi l' oggeto, in questo caso la finestra
    newForm.show

Come si fa a dividere un testo su più righe in una MSGBOX?
Guarda questo esempio:
    msgbox "Ti sei risposto" & vbCrLf & "Da Solo"

Conoscete qualche cosa per ottenere l'espulsione del CD?
Dichiarazioni

Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
    (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
    ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

Apre il cassetto...

Dim retvalue As Long
retvalue = mciSendString("set CDAudio door open", returnstring, 127, 0)

... e lo richiude

retvalue = mciSendString("set CDAudio door closed", returnstring, 127, 0)

Esiste una funzione per controllare se su disco c'è spazio a sufficienza per copiare dei file?.
The GetDiskFreeSpace function retrieves information about the specified disk, including the amount of free space on the disk.

BOOL GetDiskFreeSpace(

LPCTSTR lpRootPathName, // address of root path
LPDWORD lpSectorsPerCluster, // address of sectors per cluster
LPDWORD lpBytesPerSector, // address of bytes per sector
LPDWORD lpNumberOfFreeClusters, // address of number of free clusters
LPDWORD lpTotalNumberOfClusters // address of total number of clusters
);

In Visual Basic è

Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters As Long) As Long

Aprire una cartella di Windows.
Per aprire gestione risorse alla directory c:\windows:
Shell ("C:\WINDOWS\EXPLORER.EXE /n,/e,C:\windows") , 1
Per aprire solo una finestra:
Shell ("C:\WINDOWS\EXPLORER.EXE /n,C:\windows") , 1

Catturare l'output di una finetra Dos.
Basta ridirigere l' output verso un file
a = Shell("g++ -c prova.cxx > output.txt",1)
e poi rileggere il file.

Trovare la Dir dei files temporanei.
Usa la funzione GetTempPath.

Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, _
   ByVal lpBuffer As String) As Long

dim res as long
dim mydir as string
dim bl as long
dim bf as string

bl=50
bf=space$(bl)
res=GetTempPath(bl, bf)

mydir=rtrim(bf)

In mydir c'è la directory. Il concetto è che bisogna preparare la stringa che riceverà la tempdir settandola ad una
lunghezza sufficiente. Nell'esempio è 50 caratteri, ma puoi aumentare o diminuire.

Come posso aprire un file che risiede sempre nella directory del programma?
Se il file da aprire risiede sempre nella directory del programma allora puoi usare App.path che ti
restituisce il percorso dell' applicazione.

OPEN App.path & "\file.dat".

Ho visto che la funzione shell permette di lanciare applicazioni esterne, e mi sta bene. Come si puo' fare per sapere se detta applicazione è terminata?
La funzione GetModuleUsage va benissimo (piu' o meno, da qualche problema di overflow ma e' l'unica)  se si resta
in ambiente 16 bit, ma è stata cancellata nel VB5. Ho avuto anche io dei problemi che ho risolto spulciando nell' "alveare"
di API che possiede Windows e creando una funzione che sfrutta due di esse:

-in fase di dichiarazione
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

- Questa e' la funzione da me creata (cioe' e' un collage di varie funzioni)

'La funzione restituisce true o false a seconda se e' andata a buon fine o meno
Function Attendi(ProcessID As Long) As Boolean

On Error GoTo ErrAttendi
    Dim ProcessHandle As Long
    Dim ExCode As Long
    Dim oldExCode As Long
'Memorizzo l'handle del processo aperto
    ProcessHandle = OpenProcess(1, 0, ProcessID)
'Richiamo una prima volta la funzione di controllo per
'avere il codice che identifica il programma quando è attivo
    GetExitCodeProcess ProcessHandle, ExCode
    oldExCode = ExCode
'Ciclo fino a quando l'ExCode non cambia, e quindi significa che
'il programma sotto controllo è terminato
    While oldExCode = ExCode
        GetExitCodeProcess ProcessHandle, ExCode
    Wend
    Attendi = True
Exit Function
ErrAttendi:
    Attendi = False
    MsgBox Err.Description & " nella funzione Attendi", vbExclamation
End Function

-Nel codice questa funzione puo' essere usata cosi'

Private Sub Command2_Click()
Dim id As Long

    id = Shell("C:\windows\sol.exe", vbMaximizedFocus)
    If Attendi(id) Then
        id = Shell("C:\windows\winmine.exe", vbMaximizedFocus)
    End If
End Sub

Lanciare file *.reg da Visual Basic.
1° metodo
Puoi avviare regedit passandogli il nome del tuo file .reg
a=shell("c:\windows\regedit.exe c:\prova\prova.reg")
in questo modo puoi aggiungere al registro le informazioni contenute in c:\prova\prova.reg

2° metodo
Usa un OCX di nome RegEdit Lite

Lanciare programmi esterni.
Prova con la funzione Shell(pathname [,windowstyle]).

es.
Dim retval As Long
retval = Shell("d:\utilities\Winzip6.3\Winzip32.exe")

Se lo vuoi fare all'avvio del programma mettilo nell'evento form_load del form principale, altrimenti crei un bottone
di comando sul form e inserisci la funzione Shell nell'evento "click" di quel bottone di comando.

Leggere la riga di comando (es. pippo.exe /p).
Beh è molto semplice! Sull'help di VB5 c'è un esempio che fa al caso tuo!

-------------------------------------------------------------------------------------------------
Function GetCommandLine(Optional MaxArgs)
'Dichiara le variabili.
Dim C, CmdLine, CmdLnLen, InArg, I, NumArgs
Verifica se MaxArgs è stato specificato.
If IsMissing(MaxArgs) Then MaxArgs = 10
'Imposta le dimensioni giuste per la matrice.
ReDim ArgArray(MaxArgs)
NumArgs = 0: InArg = False
'Legge gli argomenti della riga di comando.
CmdLine = Command()
CmdLnLen = Len(CmdLine)
'Si sposta nella riga di comando un carattere alla volta.
For I = 1 To CmdLnLen
C = Mid(CmdLine, I, 1)
'Controlla se vi sono spazi o tabulazioni.
If (C <> " " And C <> vbTab) Then
'Nessuno spazio o tabulazione.
'Controlla se è già nell'argomento.
If Not InArg Then
'Inizia un nuovo argomento.
'Controlla se vi sono troppi argomenti.
If NumArgs = MaxArgs Then Exit For
NumArgs = NumArgs + 1
InArg = True
End If
'Aggiunge un carattere all'argomento corrente.
ArgArray(NumArgs) = ArgArray(NumArgs) + C
Else
'Ha trovato uno spazio o una tabulazione.
'Imposta il flag InArg su False.
InArg = False
End If
Next I

'Ridimensiona la matrice in modo che sia sufficiente per archiviare gli argomenti.
ReDim Preserve ArgArray(NumArgs)
'Restituisce la matrice nel nome della funzione.
GetCommandLine = ArgArray()
End Function
-------------------------------------------------------------------------------------------------
Utilizzando la funzione alla fine avrai la variabile ArgArray che conterrà nei suoi argomenti i parametri che sono stati
intercettati! In realtà qualsiasi carattere venga aggiunto alla chiamata dell'applicazione viene considerato come l'intero
parametro. Tocca alla funzione poi distinguere all'interno della stringa i parametri separati da uno spazio: Bada che la
funzione non fa un controllo sul parametro se è valido o meno, quello tocca a te. Con visual basic non c'è il problema
dell'ordine dei parametri=> dopo che sono stati acquisiti nell'array fai un controllo con una selezione (select case) su
ogni valore assunto dagli argomenti del tuo array.

0027 - Come posso fare a centrare un finestra nello schermo di Windows?
Sub Centra(Frm As Form)

    'dato un form lo centra nello schermo
    Frm.Left = (Screen.Width - Frm.Width) \ 2
    Frm.Top = (Screen.Height - Frm.Height) \ 2

End Sub

Come posso fare a vedere l'orientamento corrente della stampa?
Type Orientstructure
    Orientation As Long
    Pad As String * 16
End Type

Private PrtStruct As Orientstructure

Private Declare Function PrtOrient% Lib "GDI" Alias "Escape" (ByVal hDC%, ByVal nEsc%, ByVal nLen%, lpData As Orientstructure, _
   lpOut As Any)
   
Function GetPrinterOrientation() As Integer
    ' Valori di ritorno       : 1 = Printer Orientation is Portrait
    '                            2 = Printer Orientation is Landscape
    Dim Orientation As Integer
    PrtStruct.Orientation = 0
    Orientation = PrtOrient(Printer.hDC, 30, Len(PrtStruct), PrtStruct, 0&)
    GetPrinterOrientation = Orientation
End Function

Impostare la stampa a Landscape
Type Orientstructure
    Orientation As Long
    Pad As String * 16
End Type

Private PrtStruct As Orientstructure

Private Declare Function PrtOrient% Lib "GDI" Alias "Escape" (ByVal hDC%, ByVal nEsc%, ByVal nLen%, lpData As Orientstructure, _
   lpOut As Any)

Sub LandScape()
    Dim ResValue As Integer
    PrtStruct.Orientation = 2
    ResValue = PrtOrient%(Printer.hDC, 30, Len(PrtStruct), PrtStruct, 0&)
    Printer.EndDoc
End Sub

Impostare la stampa a Portrait.
Type Orientstructure
    Orientation As Long
    Pad As String * 16
End Type

Private PrtStruct As Orientstructure

Private Declare Function PrtOrient% Lib "GDI" Alias "Escape" (ByVal hDC%, ByVal nEsc%, ByVal nLen%, lpData As Orientstructure, _
   lpOut As Any)

Sub Portrait()
     
    Dim ResValue As Integer

    PrtStruct.Orientation = 1
    ResValue = PrtOrient%(Printer.hDC, 30, Len(PrtStruct), PrtStruct, 0&)
    Printer.EndDoc

End Sub

Devo fare eseguire un file musicale in formato Wav. Come?
Private Declare Function SndPlaySound Lib "MMSYSTEM" (ByVal File$, ByVal PlayType%) As Integer

Sub pLAYSOUND(SoundFile As String)
  Dim PlayType As Integer
  If SoundFile > "" Then
    On Error Resume Next
    PlayType = 1
    PlayType = SndPlaySound(SoundFile, PlayType)
    On Error GoTo 0
  Else
    Beep
  End If
End Sub

Come posso stampare un grafico prodotto con MsChart?
Poniamo che il grafico si chiami MSChart1.
Usa le seguenti istruzioni:

Clipboard.Clear
MSChart1.EditCopy
Printer.PaintPicture Clipboard.GetData, 0, 5000

In sostanza copi il grafico negli appunti e lo trasferisci alla stampante.
I valori 0 e 5000 sono le coordinate di stampa, ovviamente da 'aggiustare secondo necessità.

Dovrei stampare un solo record di un database usando Crystal Report. Ma quando lancio la stampa Crystal report stampa tutti i record del database. Come posso fare a dirgli di stampare solo un record specifico ?
Usa la SlectionFormula. Prima della Action=1 setti la selectionFormula che ti seleziona solo uno o una parte dei record che ti servono. la sintassi e' quella delle selection formule di CR.

Se io voglio aprire uno specifico documento di Word che si trova sul disco C, ad esempio il file Scuola il cui percorso è: C:\Archivio\Scuola come dovrei fare ?
1° metodo:
Shell ("C:\MSOffice\Winword\WINWORD.EXE C:\Archivio\Scuola.doc"), 1

2° metodo:
se tu crei un documento chiamato pippo con questo esempio fai alcune operazioni, prova a vedre....

Dim msWordApp As Word.Application
Set msWordApp = New Word.Application

'Apro l'oggetto MSWord
msWordApp.Visible = True
'Operazioni sul documento da utilizzare
With msWordApp

'finestra massimizzata
.Application.WindowState = wdWindowStateMaximize

'documento in esame
.Documents.Open ("c:\pippo.doc")

'tipo di visualizzazione
.ActiveWindow.View.Type = wdOnlineView

.CommandBars("Standard").Visible = False
.CommandBars("Formatting").Visible = False
.CommandBars("Control Toolbox").Visible = False
.CommandBars("Drawing").Visible = False
.CommandBars("Web").Visible = False
.CommandBars("Visual Basic").Visible = False


End With

Come posso convertire un sogente scritto per VB4 in VB5?
1° metodo
Caricarlo in VB5 e salvandolo, verrà riscritto in versione 5.0

2° metodo
Sul CD di VB5 c'è un'utility per aiutarti a passare da un progetto VB4 a uno VB5, si trova nella directory Unsupprt, e si chiama MigrWiz.

C'è qualche anima gentile che mi spiega come si fanno i file *.res?? So che bisogna creare prima i file *.rc e poi compilarli con l'utility RC.EXE. Vero? Ma come si creano i file *.rc?

I file *.rc sono dei banali file di testo con estenzione rc. Quindi apri il notepad e salvi con nome "pippo.rc". Poi lo compili con la seguente istruzione rc /r pippo.rc. Più problematico è cosa scrivere all'interno del file pippo.rc. In generale possiamo dividere le risorse in due tipi, quelle di testo e quelle binarie Per le stringhe di testo devi utilizzare la seguente sintassi (in maiuscole le istruzioni)

STRINGTABLE opzioneDiCaricamento opioneDiMemoria
BEGIN
IdStringa1 stringa1
IdStringa2 stringa2
....................................
END

le opzioniDiCaricamento specificano quando il programma deve caricare la risorsa e possono assumere i seguenti valori:

PRELOAD la risorsa viene caricata immediatamente
LOADONCALL la risorsa viene caricata quando chiamata

le opzioniDiMemoria specificano se le risorse debbano essere fisse o possano essere rimosse dalla memoria e possono assumere i seguenti valori

FIXED non vengono rimosse
MOVEABLE vengono rimosse se necessario
DISCARDABLE vengo rimosse se non utilizzate

IdStringa è un intero identificativo della risorsa, il parametro usato dalla funzione LoadResTring(IdStringa) stringa è la stringa di testo (inferiore a - mi sembra - 250 caratteri)

N.B. non puoi utilizzare come identificativo della risorsa il numero 1 che è riservato all'icona del programma

Le risorse binarie usano la seguente sintassi:

IdRisorsa Chiave opzioneDiCaricamento opzioneDiMemoria NomeFile

al solito IdRisorsa è l'intero identificativo della risorsa Chiave può assumere i seguenti valori a seconda del tipo di file che vuoi caricare

BITMAP - CURSOR - ICON - SOUND - VIDEO

opzioniDiCaricamento e opzioniDiMemoria vedi sopra

NomeFile è la path nella quale è memorizzata la risorsa che vuoi collegare

N.B. mi sembra di avere letto da qualche parte (forse C.P.) che puoi mettere nelle risorse qualunque file binario, anche uno tuo personale, però non mi ricorco che Chiave devi utilizzare.

Il mio programma (VB5) deve leggere dei file di dati prodotti da un'applicazione Fortran. Putroppo VB riconosce la virgola come separatore decimale e il punto come separatore delle migliaia mentre il programma Fortran fa esattamente l'opposto. Il risultato è che 5.450 viene letto come 5450 !!!!
1° metodo
Puoi usare la funzione Format() oppure cambiare le impostazioni internazionali nel pannello di controllo di win95

2° metodo
Probabilmente leggi il file prodotto dall'applicativo fortran con sistemi di lettura "standard" che chiaramente controllano e riconoscono i formati. Hai provato ad aprire e leggere il file in "binario"? In questo modo puoi leggere i singoli bytes del file, a prescindere dal formato. Ti lascio un esempio banale:

Dim NumeroFile as integer
Dim B as string
NumeroFile=Freefile
OPEN "nomefile.est" for BINARY as #NumeroFile
    do while not(eof(NumeroFile))
        B=Space$(1)
        Get #NumeroFile,,B
        '------------------------------
        '
        ' Inserisci qui le tue routines
        '
        '------------------------------
    loop
close #NumeroFile

Tieni conto che la riga B=Space$(1) è quella che dimensiona la quantità di Bytes letti in un solo passaggio (get).
Infatti per leggere da un file in modo binario, devi prima dimensionare una stringa che poi verrà riempita di dati presenti nel file, in dipendentenza della "dimensione" della stringa stessa.
Inoltre il comando GET accetta, come secondo parametro, la posizione "fisica" all'interno di un file, infatti "Get #NumeroFile,1000,B" inserisce nella stringa B i dati presenti a partire dal 1000mo byte del file.
Se non indichi un valore, all'apertura del file il "puntatore" sarà al byte 1 e verrà incementato automaticamente del numero di bytes letti (nell'esempio, di un byte alla volta).
Se indichi un valore ("Get #NumeroFile,1000,B") in pratica blocchi il puntatore alla posizione indicata. Se vuoi leggere altri dati di altre posizioni devi variare il valore del puntatore o utilizzare il comando

SEEK #NumeroFile,ValorePuntatore.

Se puoi cambiare la dimensione del cluster a piacimento dimmelo, che lo faccio all'istante anch'io, recuperando in totale sulle varie partizioni circa ... 60 Mb
Esiste una funzione non documentata per farlo, era stata postata qualche tempo fa proprio su questo NG. Purtroppo ho perso il messaggio e non ricordo quale fosse. Spero che qualcuno la riposti.

Eccotela (pero' bisogna formattare il disco) :

    FORMAT /z:n

dove n*512bytes = cluster size

Ricordati che facendo i cluster troppo piccoli si ha un peggioramento nelle prestazioni.

Qualcuno sa come si fa per salvare, da un'applicazione VB4 32, un file su più dischetti ?

In VB5 dovrebbe essere qualcosa del genere, l'unica riserva è sul fatto che non ricordo se in VB4 esisteva già il tipo Byte...

Sub SplitFile(ByVal SourceFile As String, ByVal Kbyte As Long)

Dim FBuffer() As Byte
Dim DestFile As String
Dim SourceLen As Long, SplitLen As Long, LastSplitLen As Long
Dim i As Integer

SourceLen = FileLen(SourceFile) 'Dimensione totale file

'La dimensione (passato in Kb, convertita in bytes) dei files risultanti; per un floppy usare ad es. Kbyte=1440
SplitLen = Kbyte * 1024

LastSplitLen = SourceLen Mod SplitLen 'la dimensione dell'ultimo file (che sarà necessariamente <= SplitLen)

Open SourceFile For Binary Access Read Lock Read Write As #1
    Do While Not EOF(1)
        'Dimensiona il buffer correttamente
        If i < SourceLen \ SplitLen Then
            ReDim FBuffer(SplitLen)
        Else
            ReDim FBuffer(LastSplitLen)
        End If
        Get #1, , FBuffer
        DestFile = SourceFile & "." & i 'I files in uscita hanno nome "PIPPO.TXT.0","PIPPO.TXT.1" ecc.
        Open DestFile For Binary Access Write Lock Read Write As #2
            Put #2, , FBuffer
        Close #2
        i = i + 1
    Loop
Close #1

End Sub

Per ripristinare il file originale basta invertire il processo di lettura/scrittura o, ancor più semplicemente, usare il comando DOS "copy /b PIPPO.TXT.0+PIPPO.TXT.1 PIPPO.TXT"

Sto cercando di scrivere una cgi con VB5 con scarso successo. Microsoft suggerisce di usare un programmino da loro scritto: cgispawn.exe ma non mi funziona lo stesso. Qualcuno sa darmi qualche consiglio?

===========================================
Readme file for VB5-CGI Objects Version 1.1
Last changes: 17. Dec. 1997 (c) EazyWare
===========================================

Microsoft Visual Basic Service Packs
------------------------------------
Before installing the VB5-CGI Objects, be sure you already got the Service Pack 2 or 3 for Visual Basic 5 from Microsoft, which fixes a number of problems. You can download the Service Pack 3 (12.3MB) from the Web at

http://www.microsoft.com/msdownload/vs97sp/vb.asp.

WWW Home Page
-------------
For updates, FAQ's and further information, have a look at

http://ourworld.compuserve.com/homepages/stsch/VB5-CGI.htm.

nel frattempo penso di aver trovato ancora di meglio!

http://www.users.dircon.co.uk/~tbrown/vb/cgi.htm

Prova ad andare a vedere, in tre minuti adesso mi faccio la mia bella cgi che funziona benone con tutte le comodità di VB...

Come settare la directory in uso inserendola nella linea di comando del programma?
Risponde: Ettore Meronese
Per me la directory di partenza non e' quella che pensi. Io ho SEMPRE questo problema, e mi sono abituato, durante lo sviluppo, di implementare l'uso sella linea di comando, inserendoci la directory di lavoro (es: c:\progetti\alutec\prove ) e come prima cosa nel codice fare:

If len(command$) then
    chdrive command$
    chdir command$
EndIf

In questo modo, anche durante lo sviluppo (in interpretato), sono sicuro di lavorare nella directory in cui mi aspetto di essere!

Come posso massimizzare una finestra durante l' esecuzione del programma?
Prova in form_load:

width=screen.width
height=screen.height
left=0:top=0

In questo modo avrai i bordi della finestra visibili, e quindi eviterai il fastidioso effetto "scomparsa bordo".

Ho bisogno di sapere ,dal mio eseguibile in VB 4.0, la lettera assegnata all'unità cd-rom.
Risponde: Alberto Pasqualini
Ho posto lo stesso quesito alcuni giorni fa e, gentilmente mi è stato risposto. Riporto il sunto dell'articolo postatomi (si dice così?) ed altresì le mie osservazioni. In VB4 32 bit è molto semplice perchè esiste una apposita funzione che ricava quello che desideri. La stessa cosa non è invece possibile nella versione a 16 bit in quanto la medesima chiamata non restituisce quanto richiesto (anche se il programma lavora su Window 95). Per VB4 32 bit è possibile utilizzare la chiamata GetDriveType (... estratto da MSDN aprile 98):

Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Const DRIVE_CDROM = 5
    For Drive = 65 To 90
        If GetDriveType(Chr(Drive) & ":\") = DRIVE_CDROM Then
            ' fai quello che vuoi (normalmente esci)
            ' il CD-ROM è identificato dalla lettera
            CDROMdrive= Chr(Drive) & ":\"
            Exit For
        End If
    Next Drive

Questo sistema funziona in maniera egregia. L'ho provato in varie situazioni ed ha sempre funzionato. In VB4 16 bit pur essendo disponibile una funzione pressochè simile non è possibile ottenere lo steso risultato. Ho quindi usato un sistema simile a questo:

Declare Function GetDriveType Lib "Kernel" (ByVal nDrive As Integer) As Integer
Const DRIVE_REMOVABLE = 2
Const DRIVE_REMOTE = 4
    For i = 2 To 25    ' dal disco C a Z
        retval=GetDriveType(i)
        ' puo' essere qualsiasi cosa ad esclusione di un disco fisso
        if retval=DRIVE_REMOTE or retval=DRIVE_REMOVABLE then
            CDROMdrive=chr$(65?)
            ' a questo punto devo controllo anche la presenza del
           ' file che mi interessa. Se non lo trovo vado con il successivo.
           if len(dir$(....)) 0 then exit for
        End If
    Next Drive

tutto questo è incluso in un ciclo DO .... LOOP e con un adeguata gestione degli errori ho ottenuto un sistema soddisfacente. Riesco anche a chiedere all'utilizzatore se eventualmente vuole inserire il CD e riprovare. Spero sia sufficiente (se ti serve altro chiedi pure).

Devo cercare in un database, tramite un recordset di un Data control, o uno Snapshot o un Dynaset, dei record che contengono i nomi di citta' italiane, che sono scritti in maiuscolo e quindi chiaramente contengono gli apostrofi (usati anche come accenti), esempio: SANT'ANNA LODE' ecc. Il programma mi blocca chiaramente con un errore quando faccio ad esempio:
    COMUNE="SANT'ANNA"
    cerca="CITTA='" + COMUNE + '"'"
    Data1.Recordset.FindFirst CERCA
in quanto nella stringa e' presente piu' di una apostrofo.

1° metodo (risponde: Night Eagle)
devi usare prima e dopo la stringa il chr$(34), ti faccio un esempio:
    cerca= "CITTA=" & CHR$(34) & COMUNE & CHR$(34)
in questo modo non userai l' apostrofo e eviti gli errori :-))

2° metodo (risponde: Nicola Pietralunga)
L'argomento di FindFirst dovrebbe essere una normale clausola WHERE di SQL. Nella SELECT SQL si risolve il problema sostituendo all'apostrofo singolo due apostrofi consecutivi. Dovrebbe funzionare anche con il metodo FindFirst. Qui sotto c'è una funzione che esegue la sostituzione; per restare nel tuo esempio la puoi chiamare con

Cerca = "Citta = '" & DblApos(Comune) & "'"
Data1.Recordset.FindFirst Cerca

BTW è meglio usare & per concatenare le stringhe piuttosto che il  così sei sempre sicuro di quello che fai.

-----------------------------------------------
Function DblApos(ByVal sBr As String) As String
  Dim lPos As Long
  Dim sBl As String
  If Len(sBr) = 0 Then Exit Function
  lPos = InStr(sBr, Chr(39))
  While lPos <> 0
    sBl = sBl & Left(sBr, lPos) & Chr(39)
    sBr = Right(sBr, Len(sBr) - lPos)
    lPos = InStr(sBr, Chr(39))
  Wend
  DblApos = sBl & sBr
End Function
------------------------------------------------

Come posso usare form_resize per adattare la misura degli oggetti alla finestra?
Guarda questo esempio:

Dim FormResized as Boolean

Private Sub Form_Resize()
    FormResized = True
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If FormResized Then
        FormResized = False
        ' do whatever you need to do here, maybe something like
        Dim MyControl as Control
        For Each MyControl in Me.Controls
            ' determine what type of control it is, resize accordingly
            If TypeOf MyControl Is TextBox Then
                .
                .
            Else
                .
                .
            End If
        Next MyControl

    End If
End Sub

Qualcuno saprebbe indicarmi quale metodo devo utilizzare per rilevare il nome dell'utente e quello della societa che compaiono aprendo la finestra Pannello di controllo -> Sistema ?
Risponde: Carlo
La funzione per trovare il nome è GetUserName

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

I due parametri sono rispettivamente una stringa per contenere il nome,e le dimensioni che vuoi impostare per questa stringa. Io ti consiglierei qualcosa del genere.

Dim sName as string
dim sTemp as string
dim ret as long
sName=string$(255,0)
ret=GetUserName(sTemp,256)
sName=Left(sTemp,ret)

Qualcuno gentilmente mi spiega a cosa serve il LOAD ? Voglio dire: se la mia applicazione ha un form PIPPO, e da un form PLUTO voglio passare a PIPPO (semplicemente 2 schermate del programma, che probabilmente ricorreranno piu' volte), piu' o meno faccio solo:
    pluto.active=false
    pluto.hide
    pippo.show
    pippo.active=true
cioe' anche la prima volta che uso PIPPO non LOAD niente....  Quand'e' che va usato LOAD???

Risponde: Ettore Maronese
Il LOAD carica il form in memoria e lo inizializza.Spiegandomi meglio, quando si fa LOAD frmPippo il form (la window) viene creata ed inizializzata, ossia viene assegnato un valore alla proprieta' hWnd e viene scatenato l'evento di Form_Load(), ma il form (la window) non viene visualizzata. Se si accede ad una qualsiasi proprieta' o metodo di un form che non e' stato ancora caricato con LOAD, viene caricato automaticamente. Di fatto l'istruzione LOAD serve a poco, se non in quei casi in cui hai bisogno di inizializzare un form, ma non e' ancora giunto il momento di visualizzarlo.
E' da notare che per chiudere e scaricare dalla memoria un form esiste di fatto l'istruzione UNLOAD frmPippo, che fa l'esatto opposto.
L'istruzione LOAD viene spesso anche usato per creare vettori di controlli creati a run-time. se ad esempio hai un form frmPippo che ha al suo interno il controllo Text1(0) (notare che e' indicizzato) se si fa:
    LOAD Text1(1)
    LOAD Text1(2)
si sono creati altri due controlli a run-time gemelli di Text(0), che potranno essere riposizionati e normalmente usati come se si fossero creati a design-time. Come al solito UNLOAD fa l'opposto.

Come si fa a convertire una directory del tipo 'c:\programmi\Microsoft VisualBasic\' nel corrispettivo dos-compatibile?
Risponde: Leonardo tagliavini
C'è una API  apposita che dal nome lungo ti ritorna il nome dos, GetShortPathName (attenzione che se il file o la dir non esistono, ritorna errore!)

Qualcuno conosce un buon metodo per validare il testo libero inserito in una serie di TextBox? Mi spiego meglio: nello sviluppo di programmi gestionali dove c'e` da acquisire nome, cognome, ecc., in quale evento conviene testare la validita` del testo digitato? Se uso il LostFocus posso trovarmi in loop con i campi sottostanti.
1° metodo (Risponde: Nicola Pietralunga)
Il problema del LostFocus si ha solo se cerchi di ridare immediatamente il focus al controllo precedente; secondo me sarebbe meglio semplicemente
avvertire l'utente che il dato non è valido (scrivendoglielo di fianco, facendo diventare il testo o il background di un altro colore: i metodi possono essere tanti).
In un articolo abbastanza interessante di qualche mese fa su VBPJ l'autore consigliava di usare una macchina di stato ed un timer. Il concetto era che all'utente veniva inibita la capacità di procedere oltre la form (per esempio disabilitando il pulsante di conferma) fino a quando non fossero soddisfatte tutte le condizioni. Il controllo delle condizioni veniva fatto periodicamente, pilotato da un controllo timer messo sulla form (p.es. ogni mezzo secondo).

2° metodo (Risponde: Night Eagle)
Io utilizzo un controllo sull' evento click di un tasto di conferma, se uno dei campi non è valido visualizzo un messaggio di errore e tramite SETFOCUS rimando il cursore sul campo errato.

3° metodo (Risponde: Fulvio Senore)
Io metto tutto il codice di validazione in una funzione che chiamo prima di scrivere i dati e che provvede a fornire gli eventuali messaggi di errore. Un vantaggio rispetto al lostfocus è che si è insserito un dato non corretto in un campo si può premere il pulsante Annulla per abbandonare tutto senza che il programma protesti che i dati non vanno bene.
Il problema del lostfocus è che non sai dove è andato a finire il focus: se hanno premuto annulla non si dovrebbero dare messaggi di errore, dato che tanto si butta via tutto. L'evento lostfocus verrebbe invece attivato, rendendo idrofobo l'utente, a meno di fare contorsionismi vari.
Uso il lostfocus solo quando è necessario elaborare subito i dati, ad esempio se si deve cercare un nominativo tra tutti quelli che iniziano come specificato nel TextBox.

Fino a poco tempo fa programmavo in VB3 e VB4, da un mesetto mi sono buttato su VB5. Con mio enorme stupore ho perso di vista la THREED.VBX o chi ne fa le veci..... Il fantastico controllo Pannel3d (oggetto oltretutto contenitore)  che usavo a piene mani, che fine ha fatto?
Risponde: Orzak
Vai sul CD, sotto Tools, controls, trovi Threed32.ocx

Vorrei sapere come si puo' fare apparire un popup menu' com la pressione del pulsante dx del mouse avendo pero' il form completamente coperto da un controllo Grid. Il popup menu' e' attivabile solo dal form, giusto?
Risponde: Etsero
No, i menù popup sono attivabili praticamente da qualsiasi controllo che supporti l'evento MouseDown ( che serve per stabilire quale pulsante del mouse si sia premuto);irrilevante invece se l'oggetto occupa o meno l'intero spazio del form. Sul form piuttosto devi inserire il tuo menù (seguendo la stessa procedura che useresti per un menù normale) avendo però l'accortezza di renderlo invisibile. Fatto ciò inserisci il seguente codice di esempio nell'evento MouseDown dell'oggetto Grid (sempre che lo abbia perchè non conosco questo controllo in quanto non l'utilizzo):

If Button=2 Then PopupMenu NomeTuoMenu

Naturalmente è solo un esempio ampiamente migliorabile (in teoria non si dovrebbe mai mettere un numero ma sempre una costante per migliorare la leggibilità del codice ma ora non ricordo come si chiama quella predefinita per il tasto destro del mouse)

Vorrei sapere se è possibile rilevare la posizione del mouse anche quando questo è al di fuori dei miei forms...,in vb5. Ad esempio come in quel programmino in cui 2 occhi seguono il movimento del cursore....
Risponde: Ettore Maronese
In VB non si possono fare Hook, ma con questo semplice trucco (non troppo bella ma piu' che funzionale) riesci a girare l'ostacolo.
Metti un bel controllo Timer sul form principale, imposta la proprieta' TimeIntervall a 100 millisecondi (tanto piu' veloce non va!) nell'evento di timer scrivi qualcosa di simile:

*********** VB a 16 bit ******************
Type POINTAPI
        x As Integer
        y As Integer
End Type

Declare Sub GetCursorPos Lib "User" (lpPoint As POINTAPI)

Sub Timer1_Timer ()

Dim Punto as POINTAPI
Dim puntoHwnd%

Call GetCursorPos(Punto)
' in Punto.Y e Punto.X c'e' la coordinata del mouse in coordinate schermo

End Sub

*********** VB a 32 bit ******************
Type POINTAPI
        x As Long
        y As Long
End Type
Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long

Sub Timer1_Timer ()

Dim Punto as POINTAPI
Dim puntoHwnd as long

Call GetCursorPos(Punto)
' in Punto.Y e Punto.X c'e' la coordinata del mouse in coordinate schermo

End Sub

E' un metodo stupido ma ti assicuro che funziona molto bene.

Ho cercato di mettere un'icona nella Status Area della Taskbar col Visual Basic 5 , usando la chiamata Shell_NotifyIcon della Shell32.dll. Ma non ha funzionato...
Risponde: Roberto Mannelli
Prova ad usare questo codice:
in un modulo scrivi:

'----------------------
'DICHIARAZIONI
'----------------------
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

Global Const NIM_ADD = 0
Global Const NIM_MODIFY = 1
Global Const NIM_DELETE = 2

Global Const NIF_MESSAGE = 1
Global Const NIF_ICON = 2
Global Const NIF_TIP = 4

Global Const WM_MOUSEMOVE = &H200

Global Const WM_LBUTTONDBLCLICK = &H203
Global Const WM_LBUTTONDOWN = &H201
Global Const WM_LBUTTONUP = &H202

Global Const WM_RBUTTONDBLCLICK = &H206
Global Const WM_RBUTTONDOWN = &H204
Global Const WM_RBUTTONUP = &H205

Declare Function Shell_NotifyIconA Lib "SHELL32" (ByVal dwMessage As Long,
pnid As NOTIFYICONDATA) As Boolean
'------------------------------
'FINE DICHIARAZIONI
'------------------------------

...poi inserisci questa sub

sub AddIcon()
   'Add an icon. This procedure uses the icon specified in the Icon property of Form1.
   'This can be modified as desired.
   Dim i As Integer
   Dim s As String
   Dim nid As NOTIFYICONDATA

   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 = "Esempio" & vbNullChar

   Shell_NotifyIconA NIM_ADD, nid
end sub

Come si fa a far stampare il contenuto di una Textbox da VB5?? Ho provato con:
    printer.print text1.text
ma inizia a stampare solo dopo che io interrompo l'esecuzione del programma.

Per dirgli di stampare subito devi scrivere:
    printer.enddoc

Tentando di stampare del testo contenuto in un TextBox, non riesco a gestire i ritorni a capo nella pagina di stampa per evitare di avere il testo troncato quando supera il margine destro. Per capire quando si è arrivati al margine destro nella pagina di stampa confronto la dimensione del testo (TextWidth) da stampare con l'effettiva dimensione della pagina di stampa (Printer.Width) mantenendo sia nel TextBox che in stampa (oggetto Printer) lo stesso font e la stessa dimensione carattere. Risultato? Il testo viene comunque troncato.
Se non mi ricordo male non devi considerare la proprietà printer.Whidth ma la proprietà Printer.ScaleWidth. La prima considera anche l'offset fisico della stampante, cioè l'area nella quale la stampante non può stampare. In secondo luogo ricordati che TextWidth("Pippo") restituisce la larghezza di pippo quando viene stampato sullo schermo e non sulla stampante (sono due dispositivi differenti). Per calcolare la larghezza della stringa su una stampante devi utilizzare Printer.TextWidth("Pippo"). Dovrebbe bastare a risolvere il tuo problema

Ho l'esigenza di dover formattare delle unità disco all'interno di una applicazione. Esiste una funzione API o qualche altro modo che me lo permetta ?
Risponde: Roberto 'Loba' Corti
Guarda questo esempio:
Declare Sub SHFormatDrive Lib "Shell32.dll" (ByVal hWnd As Long, ByVal Drive As Integer, ByVal fmtID As Integer, ByVal Options As Integer)

' Valore predefinito per fmtID
Public Const SHFMT_ID_DEFAULT As Integer = 65535   ' fmtID secondo MS DEVE essere cosí

' Valori possibili per Options
Public Const SHFMT_OPT_FULL As Integer = 1           ' Formattazione completa
Public Const SHFMT_OPT_SYSONLY As Integer = 2       ' Trasferimento sistema

' valori di ritorno  notare che sono DWORD (c/c) o LONG (vb)
Public Const SHFMT_ERROR As Long = &HFFFFFFFF       ' Errore nella formattazione
Public Const SHFMT_CANCEL As Long = &HFFFFFFFE      ' Ultima formattazione annullata
Public Const SHFMT_NOFORMAT As Long = &HFFFFFFFD    ' Disco o unità non formattabile

Public Const DriveA As Integer = 0
Public Const DriveB As Integer = 1
Public Const DriveC As Integer = 2
Public Const DriveD As Integer = 3
Public Const DriveE As Integer = 4
' e cosi via nei secoli dei secoli AMEN...........

Private Sub A_Click()
    ' Formatta il Disco A
    Loba = SHFormatDrive(Me.hWnd, DriveA, SHFMT_ID_DEFAULT, SHFMT_OPT_FULL)
End Sub

Private Sub C_Click()
    ' Formatta il disco E
    Loba = SHFormatDrive(Me.hWnd, DriveE, SHFMT_ID_DEFAULT, SHFMT_OPT_FULL)
End Sub

Conoscete un modo per adattare la lunghezza delle colonne di una DBGrid alla lunghezza dei campi? A me appaiono sempre tutti stretti i campi, e non è bello a vedersi.
Se imposti a 0 (zero) la proprietà DefColWidth la dimensione delle colonne viene automaticamente impostata alla dimensione del campo più lungo per ciascuna colonna.

0058 - Ho un form con una picturebox e voglio che in base alle dimensioni dell'immagine caricata nella picturebox la form si ridimensioni con le stesse proporzioni. Ho provato assegnado gli stessi valori di altezza e larghezza alla form ma senza risultato (forse vengono usate unita' di misura diverse)...ho provato anche con scaleX e scaleY ma ricevo diversi errori.. Che mi consigliate?
Risponde: Bruno
La dimensione della tua finestra lo puoi calcolare utilizzando la funzione API adjustWindowRect, questa funzione restituisce un rettangolo contenente le dimensioni della più piccola finestra che racchiude un'area client data. Ricorda che le API lavorano con i pixel, quindi devi impostare la proprietà scalemode della form e della picture a 3

Dim retto As RECT

' sposto la picture in alto a sinistra nel form
Picture1.Left = 0
Picture1.Top = 0

' riempio la struttura rect con le dimensioni della picture
retto.Right = Picture1.Width
retto.Bottom = Picture1.Height

' questa funzione mi restituisce le dimensioni che mi servono del rettangolo finestra modificando la struttura rect
AdjustWindowRect retto, GetWindowLong(Form1.hwnd, GWL_STYLE), False

' conversione necessaria in quanto la proprietà  Widht e Height della form lavorano in twips
Form1.Width = ScaleX(retto.Right, vbPixels, vbTwips)
Form1.Height = ScaleY(retto.Bottom, vbPixels, vbTwips)

attento il giochetto non funziona con disegni piccoli se è presente la caption (questa non può essere inferiore a una certa dimensione)

Come posso visualizzare un file di help premendo per esempio un CommandButton? Sono riuscito a visualizzarlo solo premendo il tasto "F1", cambiando le proprietà del progetto. Ma non sono riuscito a farlo partire, con un CommandButton.
Risponde: Domenico Statuto (CCRP)
Nella sezione dichiarazioni metti:

Global Const HELP_CONTEXT = &H1     '// Display topic identified by number in Data
Global Const HELP_QUIT = &H2        '// Terminate help
Global Const HELP_INDEX = &H3       '// Display index
Global Const HELP_HELPONHELP = &H4  '// Display help on using help
Global Const HELP_SETINDEX = &H5    '// Set an alternate Index for help file with more than one index
Global Const HELP_KEY = &H101       '// Display topic for keyword in Data
Global Const HELP_MULTIKEY = &H201  '// Lookup keyword in alternate table and display topic

Type MULTIKEYHELP
    mkSize As Integer
    mkKeylist As String * 1
    szKeyphrase As String * 253
End Type

Declare Function WinHelp Lib "user32" Alias "WinHelpA" (ByVal hwnd As Long, ByVal HelpFile As String, ByVal wCommand As Long, ByVal dwData As Long) As Long

Nel Command1_Click metti:

            Dim HelpFile As String
            Dim wind As Long
            Dim wCommand As Long
            Dim lContext As Long
            Dim sKey As String

            HelpFile = "c:\help\MyHelpFile.hlp"
            wind = Me.hwnd         '// schermata iniz. dell'help
            wCommand = HELP_CONTEXT
            lContext = 15                 '// Le varie pagine del file di help
            WinHelp wind, HelpFile, wCommand, lContext

Alla fine (di solito all'uscita dal programma) devi scaricare l'help engine dalla memoria:
    WinHelp UC.CommDlghWnd, HelpFile, HELP_QUIT, 0         '// Unloads the Help engine

Come posso vedere se un file esiste utilizzando VB5?
1° metodo (Risponde: Alessio V.)
In una sola directory specificata.
If Dir$("C:\MyDir\MyFile") <> "" Then
...
EndIf

2° metodo (Risponde: Carlo)
In tutto l' HardDisk invece usa questo sistema.
In project1.bas dichiarare le API come segue:
Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String,lpReOpenBuff As ofstruct, ByVal wStyle As Long) As Long

Nello stesso file dichiarare la variabile type OFSTRUC come segue:

Type ofstruct '136 Bytes
       cbytes As String * 1
       ffixeddisk As String * 1
       nerrcode As Integer
       reserved As String * 4
       szpathname As String * 128
End Type
Public Const OF_EXIST = &H4000
Public Const OF_SHARE_COMPAT = &H0

Nel tuo codice metti:

Dim x as long, y as integer, filename as string, fileexist as ofstruct
Filename = curdir & trim(text1.text) ' metti qualsiasi file con o senza pat"
x = OpenFile(filename, fileexist, OF_EXIST Or OF_SHARE_COMPAT)
z = fileexist.nerrcode

X ritorna un numero positivo se il file esiste,negativo in caso di errore,Z ritorna il codice dell'errore.

Qualcuno saprebbe indicarmi se esiste un modo per riuscire ad utilizzare il tasto ENTER, al posto del TAB, per spostarsi fra i vari controlli (textbox) in VB5 ?
1° metodo (Risponde: Sid)
Nell'evento KeyPress fai
If KeyAscii= 13 Then
    KeyAscii=0
    txtproxcasella.SetFocus
End If

2° metodo (Risponde: Daniele Dini)
Nell'evento KeyPress di un qualsiasi controllo che accetta il focus inserire:
If KeyAscii = 13 Then
    SendKeys ("{TAB}")
    KeyAscii = 0
End If
Con lo stesso metodo puoi intercettare anche i tasti di funzione, le costanti sono vbKeyF1........ vbKeyF12 ecc.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
Sezione InternetSezione MultimediaSezione GraficaSezione Controllo filesSezione GiochiSezione DatabaseSezione Tutti i files