View Full Version : [visual basic-access]Sapere se un form è stato caricato in memoria
serbring
09-12-2008, 22:53
Sapete come posso sapere da una routine se un form è stato caricato in memoria, cioè se ha eseguito l'evento load? Ho visto che esiste la proprietà onload, ma non ho capito come và utizzata. Sono un neofita del VBA.
Semplice :
If CurrentProject.AllForms(nomeForm).IsLoaded = True Then
MsgBox nomeForm & " Caricata"
Else
MsgBox nomeForm & " Non Caricata"
End If
facendo attenzione che, se si nomina una Form "nomeForm", il VBA di Access applica all'oggetto il nome "Form_nomeForm".
Alla routine va passato il nome secco, senza il Form_, ossia il nome visibile nella finestra "Maschere"... ;)
serbring
10-12-2008, 11:28
ti ringrazio...
Ma la funzione mi ritorna il valore vero ancor prima che sia stato eseguito l'evento load. Com'è possibile?
Cmq andando nello specifico ti illustro il mio vero problema visto che questa proprietà non me lo risolve.
In pratica, ho creato un pivotchart che mi visualizza una serie di istogrammi. Vorrei che ogni volta che viene modificato il grafico, la formattazione del chart rimanga costante. Ho creato il codice sotto elencato ma mi dà sempre l'errore di run-time '1004': paramentro non valido", nella riga evidenziata in grassetto. Grafici accelerazioni è il nome del form nel quale viene generato un evento. Cioè la sub form_viewchange viene generato quando deve essere ridisegnato il form "grafici accelerazioni"
Ho notato che dopo la prima visualizzazione non mi viene ritornato alcun errore e per questo pensavo che il problema sia quello di sapere se la maschera è stata caricata o meno.
Private Sub Form_ViewChange(ByVal Reason As Long)
Dim ochart As ChChart
Dim mycol(13) As Long
Dim num As Integer
If CurrentProject.AllForms("grafici accelerazioni").IsLoaded = True Then
Set ochart = Forms("grafici accelerazioni").ChartSpace.Charts(0)
mycol(1) = RGB(0, 128, 128)
mycol(2) = RGB(0, 128, 0)
mycol(3) = RGB(255, 0, 0)
mycol(4) = RGB(255, 204, 0)
mycol(5) = RGB(128, 0, 128)
mycol(6) = RGB(255, 153, 0)
mycol(7) = RGB(153, 204, 255)
mycol(8) = RGB(255, 255, 204)
mycol(9) = RGB(0, 0, 128)
mycol(10) = RGB(204, 153, 255)
mycol(11) = RGB(128, 128, 128)
mycol(12) = RGB(200, 100, 100)
mycol(13) = RGB(255, 50, 50)
num = ochart.SeriesCollection.Item(0).DataLabelsCollection.Count
For i = 0 To ochart.SeriesCollection.Count - 1
s = ochart.SeriesCollection(i).Name
num = ochart.SeriesCollection.Item(i).DataLabelsCollection.Count
If num = 0 Then
ochart.SeriesCollection(i).Interior.Color = mycol(i)
With ochart.SeriesCollection(i).DataLabelsCollection.Add
.HasValue = True
.Font.Size = 8
.Font.Bold = True
.Font.Color = ochart.SeriesCollection(i).Interior.Color
.NumberFormat = Format("#0.00")
.Position = chLabelPositionOutside
End With
End If
Next
End If
End Sub
questa è l'unica routine che tengo nel form.
...
Ho notato che dopo la prima visualizzazione non mi viene ritornato alcun errore e per questo pensavo che il problema sia quello di sapere se la maschera è stata caricata o meno.
La tua prima richiesta :
"sapere da una routine se un form è stato caricato in memoria"
lasciava intendere che fosse esterna al Form stesso. Ad esempio una Public Sub o Function.
Da qui la mia risposta, che era corretta in quel caso.
Nello specifico, dato che sai che quel codice funziona in tutti i casi, tranne in quello del primo lancio della Form, non è più necessario controllarne il Load, ma potrebbe essere sufficiente intercettare l'errore sulla riga che hai evidenziato. Così :
On Error Resume Next
Set ochart = Forms("grafici accelerazioni").ChartSpace.Charts(0)
In alternativa :
On Error GoTo ERRORE
dove ERRORE: è un'etichetta ( senza alcun codice associato ) che puoi inserire subito prima dell'End Sub.
Prova. ;)
serbring
10-12-2008, 14:42
La tua prima richiesta :
"sapere da una routine se un form è stato caricato in memoria"
lasciava intendere che fosse esterna al Form stesso. Ad esempio una Public Sub o Function.
Da qui la mia risposta, che era corretta in quel caso.
scusami se magari ci siamo fraintesi. Non conosco il visual basic e così mi son spiegato male. :)
Cmq ti ringrazio tantissimo facendo come mi hai detto te và benissimo :)
scusami se magari ci siamo fraintesi. Non conosco il visual basic e così mi son spiegato male. :)
Cmq ti ringrazio tantissimo facendo come mi hai detto te và benissimo :)
No hay problema !
Felice di aver risolto. :cool:
serbring
10-12-2008, 15:15
No hay problema !
Felice di aver risolto. :cool:
scusa avrei una domanda da farti, sperando che tu la sappia ed'è sempre inerente a quella routine lì. In pratica vorrei che le etichette valori abbiano lo stesso colore della serie di dati. Io l'ho fatto creandomi un vettore di colori e poi scorrendoli impongo che sia la serie che le etichette abbiano il colore imposto da me. Però ogni volta che cambio la visualizzazione del grafico, mi cambia la anche il colore della serie di dati, la quale renderebbe scomoda la visualizzazione da terze persone. Quindi mi piacerebbe lasciare in automatico la scelta dei colori della serie di dati ed imporre alle etichette il valore scelto da access. Ho provato quindi a togliere questa riga,
ochart.SeriesCollection(i).Interior.Color = mycol(i)
ed imponendo solo
ochar.SeriesCollection(i).datalabelcollections.font.color=ochart.SeriesCollection(i).Interior.Color
il problema è che se non impongo io un colore ochart.SeriesCollection(i).Interior.Color è sempre =-1, anche dopo l'evento AfterRender della form. Dove può esserci l'errore?
In pratica vorrei che le etichette valori abbiano lo stesso colore della serie di dati.
Non dovrebbe essere così difficile, comunque non riesco a trovare nella mia libreria VBA l'oggetto "ChChart".
Quando scrivi :
Dim ochart As ChChart
a quale oggetto di libreria fai riferimento ?
Se puoi fammi una lista dei riferimenti attivi nel tuo progetto.
serbring
11-12-2008, 10:22
Non dovrebbe essere così difficile, comunque non riesco a trovare nella mia libreria VBA l'oggetto "ChChart".
Quando scrivi :
Dim ochart As ChChart
a quale oggetto di libreria fai riferimento ?
Se puoi fammi una lista dei riferimenti attivi nel tuo progetto.
l'oggetto chchart fà riferimento alla libreriria ocw10.dll (microsoft office web components). la trovi in c:\programmi\file comuni\microsoft shared\web components\10. Grazie :)
La mia prima ipotesi è che quel controllo non "senta" gli eventi, o almeno, non quelli correlati ad un cambio di stato o di behavior grafico...
Dal codice che hai postato vedo che ti riferisci ad un oggetto già inserito sulla Form in fase di progettazione :
Set ochart = Forms("grafici accelerazioni").ChartSpace.Charts(0)
Ora, dovresti andare nelle proprietà di quel Chart, e controllare innanzitutto queste ( nel mio caso ho un oggetto ChartSpace1 che deriva dalla classe OWC11.ChartSpace.11 dato che uso Access 2003 ) :
EnableEvents = SI
AllowLayoutEvents = SI
AllowRenderEvents = SI
AllowPointRenderEvents = SI
Ripeto, è una prima ipotesi, dato che non ho modo di vedere il tuo progetto ( si farebbe prima se potessi vederlo, magari inviandolo in pvt... ), ma ho visto che alcune di queste proprietà sono su NO di default.
Prova...
Niente da fare purtroppo. Ho cercato più volte di far girare quel codice, ma si rifiuta, non trovando ovviamente la libreria Microsoft Office XP Web Components... Se riesci a creare un esempio funzionante in Access 2003 ( con relativo Web Component / OWC 11 ) fammi sapere.
serbring
14-12-2008, 10:41
Niente da fare purtroppo. Ho cercato più volte di far girare quel codice, ma si rifiuta, non trovando ovviamente la libreria Microsoft Office XP Web Components... Se riesci a creare un esempio funzionante in Access 2003 ( con relativo Web Component / OWC 11 ) fammi sapere.
a me funziona bene. Che errore ti dà?
a me funziona bene. Che errore ti dà?
Non funziona proprio, perchè non ho l'oggetto ChartSpace di Office Xp.
Uso Office 2003. Pensavo Access me lo upgradasse in auto, ma nisba.
Cmq, se funziona bene, hai risolto. No ?
serbring
14-12-2008, 11:38
Non funziona proprio, perchè non ho l'oggetto ChartSpace di Office Xp.
Uso Office 2003. Pensavo Access me lo upgradasse in auto, ma nisba.
Cmq, se funziona bene, hai risolto. No ?
funziona bene nel senso che mi esegue il tutto...cmq tranquillo grazie per l'impegno. Se lo sai come posso fare per avere un tipo dato di tipo ora che abbia un field size maggiore di 23.59 e come posso fare con il comando format ad impostare una formattazione di tipo ora, tenendo conto che il campo di origine è un tipo di dato h 24. Potrei tenere i campi separati, ma non mi và bene perchè devo fare il grafico e visualizzare le etichette valori. Grazie mille
come posso fare per avere un tipo dato di tipo ora che abbia un field size maggiore di 23.59 e come posso fare con il comando format ad impostare una formattazione di tipo ora, tenendo conto che il campo di origine è un tipo di dato h 24.
1. La prima me la devi spiegare, perchè non ho chiaro cosa intendi per "tipo con field size > 23.59"...
2. Per estrarre la parte oraria da una data :
'Esempio :
Dim D As Date
D = Now
Dim formatD As Variant
formatD = Format(D, "hh:mm:ss")
MsgBox formatD
formatD = Format(D, "hh:mm")
MsgBox formatD
formatD = Format(D, "hh")
MsgBox formatD
' oppure
formatD = Hour(D)
MsgBox formatD
;)
serbring
14-12-2008, 21:40
1. La prima me la devi spiegare, perchè non ho chiaro cosa intendi per "tipo con field size > 23.59"...
2. Per estrarre la parte oraria da una data :
'Esempio :
Dim D As Date
D = Now
Dim formatD As Variant
formatD = Format(D, "hh:mm:ss")
MsgBox formatD
formatD = Format(D, "hh:mm")
MsgBox formatD
formatD = Format(D, "hh")
MsgBox formatD
' oppure
formatD = Hour(D)
MsgBox formatD
;)
in pratica visto che il campo di tipo ora non deve contenere un orario ma una durata posso avere una durata che è maggiore di 24 ore. Ma il tipo dato di access arriva fino a 23.59. Per lui 24 è 00.00 ma del giorno successivo. Il problema potrei bypassarlo mettendo un campo numerico, Sapendo che per access 1 ora=1/24 numerico. Però se metto 1.5 lui mi prende 12 del giorno seguente e se vado a fare il grafico vedo la scala che va da 0, 1,2,.....22,23,0,1,2....23,00 e così via. Spero di essere stato chiaro
in pratica visto che il campo di tipo ora non deve contenere un orario ma una durata posso avere una durata che è maggiore di 24 ore. Ma il tipo dato di access arriva fino a 23.59. Per lui 24 è 00.00 ma del giorno successivo.
Beh, ma questo è normale.
Non è prerogativa di Access, è proprio che stai usando un tipo errato per il campo che vuoi creare. Un campo data/ora esprime un numero "puntiforme", ossia l'istante rappresentato da quella data, non una durata.
Se hai 2 date di cui vuoi calcolare l'intervallo trascorso in Ore, dovrai, in fase di Insert nel DB, creare un campo aggiuntivo numerico che conterrà questa differenza...
Differenza che in VB calcoli molto semplicemente con la funzione DateDiff... ;)
serbring
14-12-2008, 23:33
Beh, ma questo è normale.
Non è prerogativa di Access, è proprio che stai usando un tipo errato per il campo che vuoi creare. Un campo data/ora esprime un numero "puntiforme", ossia l'istante rappresentato da quella data, non una durata.
Se hai 2 date di cui vuoi calcolare l'intervallo trascorso in Ore, dovrai, in fase di Insert nel DB, creare un campo aggiuntivo numerico che conterrà questa differenza...
Differenza che in VB calcoli molto semplicemente con la funzione DateDiff... ;)
ma a me non serve una differenza. Devo mettere io questa durata che è stata precedentemente calcolata da una routine matlab.
ma a me non serve una differenza. Devo mettere io questa durata che è stata precedentemente calcolata da una routine matlab.
Allora temo proprio non si possa fare.
serbring
15-12-2008, 17:05
Allora temo proprio non si possa fare.
ok grazie mille per la tua disponibilità....
serbring
16-01-2009, 23:19
riesumo questo thread perchè ero stato impegnato e non sono riuscito più ad andare avanti in questo database...ho provato a formattare i datalabel scrivendo la seguente riga di codice
With ochart.SeriesCollection(i).DataLabelsCollection.Add
.NumberFormat = Format(Time, "hh.mm")
end with
solamente che lui mi dà 1.14 a posto di 23.59. Premetto che il valore di cui faccio plottare il valore ha come tipo di dato ora breve 24h
Non credo si possa usare il punto come separatore nel Format di un Data/Ora. Io uso sempre ":"
.NumberFormat = Format(Time, "hh:mm")
serbring
19-01-2009, 08:47
Non credo si possa usare il punto come separatore nel Format di un Data/Ora. Io uso sempre ":"
.NumberFormat = Format(Time, "hh:mm")
Ciao Marco, ho provato ma non funziona....ora mi mette come etichetta solo 19:41 e 9:41...:confused:
Bah, c'è qualcosa che non mi torna...
Ho fatto una prova veloce su una tabella che contiene un campo "Time" del tipo "Ora Breve 24h". Nel campo ho messo "23.59".
Se eseguo :
Dim RS As Recordset
Set RS = CurrentDb.OpenRecordset("SELECT Time FROM Tabella1 WHERE id=1")
MsgBox (Format(RS(0), "hh:mm"))
ottengo correttamente 23.59. :mbe:
serbring
20-01-2009, 13:54
Bah, c'è qualcosa che non mi torna...
Ho fatto una prova veloce su una tabella che contiene un campo "Time" del tipo "Ora Breve 24h". Nel campo ho messo "23.59".
Se eseguo :
Dim RS As Recordset
Set RS = CurrentDb.OpenRecordset("SELECT Time FROM Tabella1 WHERE id=1")
MsgBox (Format(RS(0), "hh:mm"))
ottengo correttamente 23.59. :mbe:
grazie mille ho risolto per merito tuo, il problema era proprio nella stringa time, ci andava solo format("hh:mm")
;)
serbring
20-01-2009, 13:55
Bah, c'è qualcosa che non mi torna...
Ho fatto una prova veloce su una tabella che contiene un campo "Time" del tipo "Ora Breve 24h". Nel campo ho messo "23.59".
Se eseguo :
Dim RS As Recordset
Set RS = CurrentDb.OpenRecordset("SELECT Time FROM Tabella1 WHERE id=1")
MsgBox (Format(RS(0), "hh:mm"))
ottengo correttamente 23.59. :mbe:
grazie mille ho risolto per merito tuo, il problema era proprio nella stringa time, ci andava solo format("hh:mm")
;)
grazie mille ho risolto per merito tuo, il problema era proprio nella stringa time, ci andava solo format("hh:mm")
;)
Ok. :cool:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.