Adesso vorrei programmare la registrazione, ad esempio giorno,
mese ed anno alle ore xx:xx con l'inserimento in delle textbox, non riesco a farlo, gentilmente mi suggerite qualcosa
Cioè vorresti semplicemente far partire la registrazione all'orario scritto in più TextBox ?
Se è così, allora, potresti utilizzare un Timer che, attivandosi (ad esempio ogni secondo), compara quanto risulta scritto dall'unione delle TextBox con la data e l'orario del computer.
Private obj As Object
Private orario As String
Public Sub Button1_Click()
' Per ogni oggetto posto nel Form...'
For Each obj In FMain.Children
' effettuiamo una verifica: se il tipo di oggetto è una "TextBox"...'
If Object.Type(obj) = "TextBox" Then
' ...allora aggiungiamo il loro testo alla variabile:
orario &= obj.Text
Endif
Next
With Timer1
' Attiviamo il Timer ogni secondo
.Start
.Delay = 1000
End With
End
Public Sub Timer1_Timer()
Dim unione As String
unione = Replace(Str(Now), "/", "")
unione = Replace(unione, ":", "")
unione = Replace(unione, " ", "")
' oppure anche così:
' unione = Replace(Replace(Replace(Str(Now), "/", ""), ":", ""), " ", "")
' Se quanto scritto nella "TextBox" è uguale alla data ed all'orario del computer....
If orario = unione Then
'...allora avvia la baracca:
Print "Alibaba"
Endif
End
Non so se era questo che intendevi :-X
Saresti così gentile a farmi un esempio pratico inserendo sempre il mio codice mencoder ?
Ci provo... :-X
Dunque, nella prima TextBox la data andrà inserita nel seguente formato: gg/mm/aaaa, mentre nella seconda e nella terza TextBox l'orario andrà scritto con il seguente formato: hh:mm:ss
Private hp As Process
Public Sub Form_Open()
' Volendo, possiamo prevedere la seguente istruzione,
' per inserire automaticamente la data del giorno "corrente" nella prima "TextBox": ;-)
TextBox1.Text = Format(Date, "dd/mm/yyyy")
' In tal caso, inseriamo il cursore all'interno della seconda "TextBox" per comodità:
TextBox2.SetFocus
End
Public Sub Button1_Click()
With Timer1
' Attiviamo il Timer ogni secondo:
.Start
.Delay = 1000
End With
End
Public Sub Timer1_Timer()
' Se la data e l'orario del computer sono uguali alla data e all'orario scritti nelle prime due "TextBox"....
If Str(Now) = TextBox1.Text & " " & TextBox2.Text Then
' allora avviamo il comando "mencoder" e ne gestiamo il processo con un'apposita variabile:
hp = Shell "mencoder dvb://Canale5 -tv driver=v4l2......etc....etc....."
Endif
' Se l'orario del computer è uguale a quello presente nella terza TextBox.....
If Str(Time) = TextBox3.Text Then
' ...allora stronchiamo il processo:
hp.Kill
' Blocchiamo quindi anche il "Timer":
Timer1.Stop
Endif
End
a) Se inserendo una data non odierna ad es 25/12/2012
e chiaramente lasciando il computer sempre acceso, la registrazione si avvia comunque ?
Non vedo perché no. Nell'esempio, ho commentato che la data odierna la si può impostare automaticamente solo se eventualmente si voglia così. E' ovvio che puoi nella TextBox scrivere la data che vuoi.
Se la data o gli orari per un qualsiasi motivo sono errati .......posso gestire l'errore con un messagebox ?
Sì.
Nel caso di data di un giorno qualsiasi passato:
' Se la data immessa nella prima "TextBox" è relativa ad un giorno ormai appartenente al passato...
If CInt(Val(TextBox1.Text)) < CInt(Now) Then
'...allora solleva il messaggio d'errore:
Message.Error("< FONT color=darkred >< B >Data errata!")
Return
Endif
Nel caso di data corretta, ma di orario ormai passato:
' Se l'orario immesso nella seconda "TextBox" è già passato...
If CFloat(Val(TextBox1.Text & " " & TextBox2.Text)) < CFloat(Now) Then
'...allora solleva il messaggio d'errore:
Message.Error("< FONT color=darkred >< B >Orario errato!")
Endif
Seguiremo un procedimento analogo nel caso in cui nella terza TextBox sia stato immesso un orario ormai già passato.
Si può creare un database con le registrazioni programmate per i giorni futuri ?
Potresti usare, creandolo, anche un mero file di testo....
Come posso fare per avere solo il nome delle emittenti ad esempio
Rai1
...ti faccio un piccolo esempio: della stringa contenente tre righe di caratteri A:B:C\nD:E:F\nG:H:I, così visibili in lista:
A:B:C
D:E:F
G:H:I
voglio vedere in console scritte soltanto le prime lettere di ciascuna riga: "A", "D" e "G":
Public Sub Button1_Click()
Dim s As String
Dim ss1, ss2 As String[]
Dim j As Byte
' Abbiamo tre righe visivamente poste una sotto l'altra:
s = "A:B:C\nD:E:F\nG:H:I"
' Separo le tre righe distinguendole sulla base del carattere "nuova riga a capo": \n, che ovviamente sarà escluso,
' e le carico ciascuna in un elemento di una variabile array:
ss1 = Split(s, "\n")
For j = 0 To ss1.Max
' Di ciascuna riga separo le lettere sulla base del carattere ":", che ovviamente escludo,
' e le pongo - ad ogni giro - ciascuna in un elemento di un'altra variabile array:
ss2 = Split(ss1[j], ":")
' Poiché le prime lettere di ciascuna riga si troveranno rispettivamente nel primo elemento della solita variabile "ss2",
' vado a vedere, ovviamente, il contenuto del solo primo elemento (indice = 0):
Print ss2[0]
Next
End
Man mano che la registrazione va avanti si può avere il conteggio dei mb ?
Ahia ! :-X
Non ho ben compreso se Mencoder salva, man mano che la registrazione va avanti, un file temporaneo. In caso affermativo, e se questo file temporaneo fosse rintracciabile, si potrebbe interrogarlo così (mostriamo il risultato in console a mo' esemplificativo):
Print Stat("percorso_file_temporaneo_creato_da_Mencoder").Size
Altrimenti, si potrebbe pensare una procedura ben più complessa: intercettare i dati, calcolarne e mostrare man mano la quantità ricevuta, quindi destinarli a Mencoder per la prevista registrazione...
Ho portato l'esempio di Rai1: Rai2:, che sono composte da solo 4 lettere, ma il nome può essere più lungo ad esempio RaiPremium: Italia1: TeleItalia:
La lunghezza o complessità dei nomi delle emittenti è del tutto ininfluente.
... a me interesserebbe avere i nomi delle emittenti prima prima dei due punti, e visualizzarli in una listbox, dando il percorso il file channels.conf:
Public Sub Button1_Click()
ListBox1.List = Split(File.Load("/home/Fernando/mplayer/channels.conf"))
end
con questo codice (mi ripeto) mi da tutta la lista delle emittenti ma con al seguito canale, frequenza etc.
Rai1:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_AUTO:FEC_AUTO:QAM_AUTO:TRANSMISSION_MODE_AUTO:GUARD_INTERVAL_AUTO:HIERARCHY_AUTO:512:650+694:3401.
Mi faresti un esempio pratico con questa stringa e il mio codice ?
Io non userei la proprietà .List dell'oggetto ListBox, bensì il suo metodo .Add. La funzione Split ti suddivide l'intera riga - sulla base di un carattere discriminante - ed anzi ti ritorna un array stringa[]. Cosicché per aggiungere il primo elemento, ossia quello che porta il nome dell'emittente, dobbiamo richiamare l'indice zero.
Ho riprodotto il tuo esempio, inserendo quell'unica lunghissima riga in un file di testo che ho chiamato channels.conf, poi...
ListBox1.add(Split(File.Load("/percorso_del_mio_file_di_prova/channel.conf"), ":")[0])
Nella ListBox ho ottenuto coerentemente il nome Rai1 .
Però tu in realtà non hai nel file una sola riga, bensì molte righe afferenti a diverse emittenti...... a questo punto può servirti la prima parte del mio codice che t'avevo suggerito: per separare le varie righe fra loro.
Facciamo finta che nel file ci siano tre lunghissime e complesse righe relative a tre emittenti.... Ra1, Ra2 e Rai3. Vogliamo vedere nella ListBox soltanto i nomi di queste tre emittenti:
Public Sub Button1_Click()
Dim ss As String[]
Dim j As Byte
' Distinguo/separo le tre righe in base al carattere "nuova riga a capo",
' e le piazzo in una variabile array di tipo stringa.
' Saranno piazzate, in vero, nei primi tre elementi dell'array:
ss = Split(File.Load("/percorso_del_mio_file_di_prova/channel.conf"), "\n")
' "Frantumo" ciascuna riga in varie parti sulla base del carattere " : " (presente nella riga in questione).
' Vado ad aggiungere nell'oggetto "ListBox" solo la prima parte
' - presente nell'elemento di Indice "zero" dell'array -
' che corrisponde al nome dell'emittente:
For j = 0 To 2
ListBox1.add(Split(ss1[j], ":")[0])
Next
End
...nell'oggetto ListBox avrò, l'uno sotto l'altro, i soli nomi delle tre emittenti.
Per quanto riguarda il conteggio della registrazione in mb, appena parte la registrazione mencoder crea il file video...
...ma quindi è un file temporaneo ? Sembrerebbe di sì ! E' visibile ? Cioè ne hai individuato nome e percorso precisi ?
Se durante la registrazione ogni tanto clicchi sopra quel file temporaneo con il tasto destro del topastro, e ne vedi le proprietà, noterai che la sua dimensione aumenta appunto ogni volta che effettui tale controllo !
Per quanto riguarda il conteggio del video, con il tasto destro man mano che registra aggiorna i mb, pensavo che si potesse vedere il tutto in una label, cmq va bene ugualmente.
Potresti - appunto - mostrare il risultato in una Label ! Che ci vuole ?
Label.Text = Stat("percorso_del_file").Size
Inoltre, poiché tu hai attivato ogni secondo il Timer, puoi inserire questa riga proprio all'interno della routine dell'evento Timer (cioè quella: ....Timer1_Timer() ). In tal modo avresti una visualizzazione dell'incremento della dimensione del file temporaneo, e dunque della registrazione, secondo dopo secondo !
Per non allungare eccessivamente questa discussione, ti ho inviato qualche messaggio privato.
Aggiorniamo la discussione semplicemente dicendo che per eliminare quell'errore di "Out of Bound" si è dovuto eliminare ogni possibile eventuale elemento vuoto.
Inoltre si è aggiunta una nuova linea di comando nella routine per evitare di assegnare più di una volta il nome delle emittenti televisive alla ListBox.
Pertanto il nuovo codice ora è:
Public Sub Button5_Click()
Dim ss As String[]
Dim j As Short
If ListBox1[0].Text <> Null Then Return
ss = Split(File.Load("/home/nando/channels.conf"), "\n", "", True)
For j = 0 To ss.Max
ListBox1.add(Split(ss[j], ":")[0])
Next
End
Volevo anche aggiungere che ho provato ho : Label1.Text = Stat("/home/nando/").Size inserendolo nel timer1,......
Ovviamente quando ho scritto Label.Text = Stat("percorso_del_file").Size, mi riferivo non solo al "percorso" in sé, ma anche al file. Quindi va riletta così:
Label1.Text = Stat("/home/nando/nome_File_temporaneo").Size