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