Associazione file/formati?

giovedì 15 novembre 2007 - 13.29

lucag. Profilo | Newbie

Salve, ho creato un piccolo elaboratore di testi con Visual Basic Express 2005, può salvare i documenti in formato .rtf.
Vorrei creare l'associazione file, in modo che tramite l'installer (CyberInstaller), si crei una chiave di registro che fa aprire di default i file rtf con il mio elaboratore. Il problema è che così facendo, o facendo pulsante dx apri con e selezioanndo il mio elaboratore, si apre il programma, ma non il file al suo interno. Che codice devo inserire e dove per far funzionare tutto regolarmente?

Grazie

alextyx Profilo | Expert

Quando usi l'opzione 'Apri con', il tuo programma viene lanciato con dei parametri, che recuperi con la funzione Command()
I parametri in questione, altro non sono che il percorso del file che tu devi aprire.
Quindi, se, per esempio, nel load del tuo form di apertura del programma, recuperi tale percorso, verifchi che esista e in caso positivo apri il file, hai ottenuto quello che ti serve.
Es.:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim Parametri As String = Command()
MessageBox.Show(Parametri)
Me.Close()
End Sub

Con un programmino come questo, puoi visualizzare i parametri.
Se fai come sopra descritto e usi l'opzione 'Apri con', vedrai nel messagebox il percorso del file da aprire.

lucag. Profilo | Newbie

Beh, intanto grazie mille per la risposta. Però, forse non mi sono spiegato bene: infatti, io avrei bisogno di "qualcosa" (como potrai notare, nn sono un esperto)) che funzioni sempre, non solo inserendo i parametri per un determinato file: vorrei che fosse....universale, in modo che qualunque file si clicchi, lui lo apra con il mio programma, caricandolo...cioè..non c'è un codice da inserire, che dice al prog, che quado si fa il doppio click su un file, lui si apre normalmente e automaticamente fa "apri" dall'interno del prog. e avvia correttamente il documento....Esiste qualcosa di simile? E poi, anche un'altra info: In CyberInstaller, dalla funzione "Associazione Estensioni", cosa faccio?

Grazie mille

alextyx Profilo | Expert

Fortse non ci stiamo capendo!
Ti sei mai chiesto come fa NotePad, per esempio, a sapere da quale programma (poniamo "C:\pippo.txt") è stato richiesto, mediante doppioclick (che però richiede che l'estensione txt sia correntemente associata a Notepad), oppure mediante 'Apri con'?
Non è il documento che si apre, ma è l'applicazione che si avvia e controlla se per caso sono stati inseriti dei parametri nel comando. Il comando è stato composto automaticamente da windows, che gli ha aggiunto dei parametri, ovvero il path del file. L'applicazione a questo punto esegue il comando 'apri' sul file indicato.
Se tu associ una o più estensioni al tuo applicativo, esse lanceranno l'applicativo quando ci fai doppio click, tuttavia l'applicativo, se non ci metti dentro le istruzioni che ti ho suggerito, più che aprirsi non farà.
Le applicazioni tipo Notepad, eseguono un controllo simile a quello che ti ho postato.
Quindi anche tu dovrai controllare se ci sono dei parametri validi (un percorso esistente) e in quel caso aprire il file. Facendo così otterrai che la tua applicazione si comporti esattamente come stai chiedendo.
Va da sè che associare tutte le estensioni col tuo applicativo potrebbe essere eccessivo. Magari puoi ricorrere allo 'Apri con', quando vuoi che un file passi sotto il controllo del tuo programma, ma comunque questa è una scelta che lascio a te.

lucag. Profilo | Newbie

Ah, ora ho capito...prima non avevo ben compreso la tua risposta. Però, quindi, qual'è il codice che devo inserire perchè vengano "letti" i parametri, e di conseguenza, venga aperto il file da cui si fa apri con? Ho provato a inserire il codice che mi hai proposto,ma quello è per vedere il messaggio relativo agli eventuali parametri...quale per farli "eseguire"???
Grazie mille!

alextyx Profilo | Expert

Beh, questo dipende da come opera il tuo programma.
Una volta che sai su quale file deve lavorare, puoi farglielo trattare esattamente come se lo avessi selezionato con un openfiledialog lanciato all'interno del programma, o al limite, come se il percorso fosse stato già fissato all'interno del codice. Al momento che sai su chi operare, resta solo l'imbarazzo di decidere cosa fare e questo lo sai soltanto tu. Insomma, a quel punto hai tutto ciò che ti serve per passare all'azione.
Word, per esempio, esegue il comando 'Apri' sul file il cui percorso gli è arrivato dal doppio click.
Posso cercare di darti qualche consiglio (se ci riesco) su come implementare del codice, ma devi spiegarmi cosa fa, o vorrebbe fare il tuo programmino.

lucag. Profilo | Newbie

Grazie mille per la tua grande e competente disponibilità!!!
Approfitto della tua gentilezza, per dirti cosa vorrei che facesse: Essenzialmente, è molto semplice, vorrei che aprisse tramite il codice seguente il file cliccato (quindi quello evidenziato dal parametro). Ecco il codice che io ho legato al bottone d'apertura file, seguito da quello relativo alla openfiledialog:

-----------------------

Private Sub Button17_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button17.Click


If RichTextBoxPrintCtrl1.Modified Then


Dim answer As Integer
answer = MessageBox.Show("Il documento non è stato salvato, continuare senza salvarlo?", "Documento non salvato", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If answer = Windows.Forms.DialogResult.No Then
Exit Sub

Else

OpenFile()

End If

Else

OpenFile()

End If

End Sub



Private Sub OpenFile()

OpenFileDialog1.Title = "Apri documento..."
OpenFileDialog1.DefaultExt = "rtf"
OpenFileDialog1.Filter = "Rich Text Files|*.rtf|All Files|*.*"
OpenFileDialog1.FilterIndex = 1
OpenFileDialog1.FileName = ""
OpenFileDialog1.ShowDialog()

If OpenFileDialog1.FileName = "" Then Exit Sub


Dim strExt As String
strExt = System.IO.Path.GetExtension(OpenFileDialog1.FileName)
strExt = strExt.ToUpper()

Select Case strExt
Case ".RTF"
RichTextBoxPrintCtrl1.LoadFile(OpenFileDialog1.FileName, RichTextBoxStreamType.RichText)
Case Else
Dim txtReader As System.IO.StreamReader
txtReader = New System.IO.StreamReader(OpenFileDialog1.FileName)
RichTextBoxPrintCtrl1.Text = txtReader.ReadToEnd
txtReader.Close()
txtReader = Nothing
RichTextBoxPrintCtrl1.SelectionStart = 0
RichTextBoxPrintCtrl1.SelectionLength = 0
End Select

currentFile = OpenFileDialog1.FileName
RichTextBoxPrintCtrl1.Modified = False
Me.Text = "Editor - " & currentFile.ToString()


BoolModified = False


End Sub

------------------

Grazie mille!
Arrivederci!

alextyx Profilo | Expert

Dunque, abbiamo già visto come ricavare la stringa 'Parametri', contenente il path completo del file.
Quando questa stringa non è vuota, si può chiamare un overload (cioè una versione con un diverso elenco dei parametri)della tua funzione:

OpenFile(Parametri) 'La chiamata alla funzione,che verrà effettuata nell'evento load del form, dopo la verifica dell'esistenza di parametri

Private Sub OpenFile(byval Percorso as string) 'la versione di openfile che richiede direttamente il percorso

Dim strExt As String
strExt = System.IO.Path.GetExtension(Percorso)

...... da qui in poi rimane uguale

Ti consiglio di verificare sempre l'esistenza e la disponibilità dei file, o comunque di includere il codice che gli maneggia in un sano Try Catch!
Spero di aver capito bene e di essermi spiegato altrettanto bene. Altrimenti ci si riprova!

lucag. Profilo | Newbie

Ho abbastanza capito...però...quindi, quale dovrebbe essere il codice, contenente anche il richiamo dei parametri, da inseririe nel mio prog? Poi, questo codice dove dovrei inserirlo? All'inizio o nella funzione open file? Grazie mille!

alextyx Profilo | Expert

Dunque, se la tua applicazione parte da un form, puoi usare questo codice:

Dim Parametri As String=""

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Parametri = Command()
Apri()
End Sub

Cioè dichiarare una variabile stringa a livello di classe (fuori dalle procedure) e le assegni, nell'evento load, il valore dei parametri passati, se ce ne sono.
Se tale stringa, ti risultasse = "", cioè vuota, significherebbe che non sei arrivato a lanciare il tuo programma dal 'Apri con', perchè in tal caso avresti i parametri. In questa eventualità, (cioè senza parametri) il tuo programma potrebbe essere stato lanciato da te manualmente e se vuoi aprire un file, lo sceglierai attraverso la openfiledialog, esattamente come presumo tu abbia fatto finora.

Se invece sei nell'altro scenario, avrai Parametri<>"". A quel punto, salvo controllare che il tuo parametro sia un file valido, potrai eseguire l'apertura del programma, come già facevi, ma senza usare la OpenFileDialog:

Private Sub Apri()
If Parametri<>"" AndAlso IO.File.exists(Parametri) Then

Dim strExt As String
strExt = System.IO.Path.GetExtension(Parametri)
strExt = strExt.ToUpper()

Select Case strExt

....... eccetera ......

End If
End Sub

Ovviamente, questa porzione di codice devi farla eseguire senza che un utente debba cliccare alcunchè, quindi potresti chiamarla, o spostarla, nella procedura di load, più o meno come ti ho esemplificato.
Potrai mantenere la vecchia versione con lo OpenFileDialog, magari chiamata da un click di un pulsante, semplicemente usando nomi diversi, tanto per non aggrovigliarci con un overload.
Occhio che il codice è scritto a mano e non provato, quindi non ne garantisco la correttezza, oltrechè funzionamento

lucag. Profilo | Newbie

Allora, in pratica,prima di tutto, la mia applicazione parte con una splash screen, va bene lo stesso? Ecco il codice che io ho inserito:

---

Dim Parametri As String = ""

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Parametri = Command()
Apri()
End Sub


Private Sub Apri()
If Parametri <> "" AndAlso IO.File.exists(Parametri) Then

Dim strExt As String
strExt = System.IO.Path.GetExtension(Parametri)
strExt = strExt.ToUpper()

Select Case strExt

Case ".RTF"
RichTextBoxPrintCtrl1.LoadFile(OpenFileDialog1.FileName, RichTextBoxStreamType.RichText)
Case Else
Dim txtReader As System.IO.StreamReader
txtReader = New System.IO.StreamReader(OpenFileDialog1.FileName)
RichTextBoxPrintCtrl1.Text = txtReader.ReadToEnd
txtReader.Close()
txtReader = Nothing
RichTextBoxPrintCtrl1.SelectionStart = 0
RichTextBoxPrintCtrl1.SelectionLength = 0
End Select

End If
End Sub

---


Ho forse sbagliato quel che ho scritto dopo " Select Case strExt"??
Così, comunque, non accade nulla.....Perchè?
Grazie

alextyx Profilo | Expert

Da qui è difficile dirlo. Metti un punto d'interruzione dove chiami la sub Apri(), cioè nella load e segui riga per riga controllando cosa accade. Ovviamente dovresti avere in Parametri il path del file su cui hai cliccato. Verificato ciò vai avanti e raccontamelo tu perchè non va!

lucag. Profilo | Newbie

Accidenti...sono proprio in difficoltà! Ho provato a mopdificare in vari modi il codice, ma niente...non carica proprio....il problema è sicuramente (almeno credo) nel "sistema d'apertura", che sarebbe fatto per usare una openfiledialog, invece, io vorrei che aprisse automaticamente, senza chiedere ulteriori conferme....Che ne dici? Spero che tu abbia capito quel che vorrei ottenere e le caratteristiche del mio programma....perchè..la lettura dei parametri è semplice, anche abbinare un'azione di conseguenza è facile, il problema è proprio questa azione/funzione.....
Grazie!!!!

alextyx Profilo | Expert

Dunque, vediamo di analizzare un po' il codice che mi posti:


Private Sub Apri()
If Parametri <> "" AndAlso IO.File.exists(Parametri) Then

Dim strExt As String
strExt = System.IO.Path.GetExtension(Parametri)
strExt = strExt.ToUpper()

Select Case strExt

Case ".RTF"
RichTextBoxPrintCtrl1.LoadFile(OpenFileDialog1.FileName, RichTextBoxStreamType.RichText) <-----------
Case Else
Dim txtReader As System.IO.StreamReader
txtReader = New System.IO.StreamReader(OpenFileDialog1.FileName) <-----------
RichTextBoxPrintCtrl1.Text = txtReader.ReadToEnd
txtReader.Close()
txtReader = Nothing
RichTextBoxPrintCtrl1.SelectionStart = 0
RichTextBoxPrintCtrl1.SelectionLength = 0
End Select

End If
End Sub

Se questo codice è quello che stai usando, intanto comincia col sostituire nelle righe che ti ho 'frecciato' (neologismo) a:
OpenFileDialog1.FileName
il nome del file che abbiamo cliccato, cioè:
Parametri

quindi diventeranno:

RichTextBoxPrintCtrl1.LoadFile(Parametri , RichTextBoxStreamType.RichText)

txtReader = New System.IO.StreamReader(Parametri )

ti torna?

lucag. Profilo | Newbie

Bah...come logica mi sembra corretta..eppure...ancora non ci siamo....
allora, ecco il codice completo che ho usato:


Dim Parametri As String = ""

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Parametri = Command()
Apri()
End Sub


Private Sub Apri()
If Parametri <> "" AndAlso IO.File.exists(Parametri) Then

Dim strExt As String
strExt = System.IO.Path.GetExtension(Parametri)
strExt = strExt.ToUpper()

Select Case strExt

Case ".RTF"
RichTextBoxPrintCtrl1.LoadFile(Parametri, RichTextBoxStreamType.RichText)

Case Else
Dim txtReader As System.IO.StreamReader
txtReader = New System.IO.StreamReader(Parametri)

RichTextBoxPrintCtrl1.Text = txtReader.ReadToEnd
txtReader.Close()
txtReader = Nothing
RichTextBoxPrintCtrl1.SelectionStart = 0
RichTextBoxPrintCtrl1.SelectionLength = 0
End Select

End If
End Sub


Ancora non carica il file....grazie per la tua pazienza e disponibilità!

alextyx Profilo | Expert

Riguardo a questa riga:
RichTextBoxPrintCtrl1.LoadFile(Parametri, RichTextBoxStreamType.RichText)

Dovresti fare un piccolo esperimento, mettendoci un breakpoint:
Devi controllare cosa contiene il primo parametro, che nel nostro caso si chiama, guarda caso 'Parametri' e controllare che sia un indirizzo valido. Anzi devi confrontarlo con quello che leggi, sempre alla solita riga, ma nella versione dove usi lo openfiledialog. Ovviamente si suppone che in quella versione il tutto ti funzionasse.
Ricapitolando, devi aprire il solito file, sia con la prima versione che con quella chiamata col doppio click e controllare come stanno le cose quando arrivi alla riga fatidica. Poi ci risentiamo, ma credo che a questo punto potresti già venirmi a raccontare la soluzione. Non dovrebbe essere un debug troppo difficile....almeno spero!

lucag. Profilo | Newbie

Ho provato a fare quel che mi hai detto, il problema, è che con Vb.net 2005 non sono riuscito, perchè ho messo il punto di interruzione, ma dal debug, o facevo "esegui istruzione" e il programma non partiva, quindi veniva evidenziato "Parametri As String = """, ma nonfacendo nulla era vuoto o avviavo completamente il debug, ma non veniva preso in considerazione il brekpoint....come posso vedere il break point con i parametri? E poi, per la prova con la openfiledialog oK, ma per quella apri con, come faccio a monitararla con Vb??
Grazie

alextyx Profilo | Expert

Fai una cosa, metti un messagebox appena hai recuperato i parametri, prima di chiamare Apri() e fatti scrivere cosa ha recuperato. E poi un altro dopo che hai recuperato l'estensione:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Parametri = Command()
MessageBox.Show("Parametri " & Parametri) <------------------
Apri()
End Sub


Private Sub Apri()

If Parametri <> "" AndAlso IO.File.Exists(Parametri) Then

Dim strExt As String
strExt = System.IO.Path.GetExtension(Parametri)
strExt = strExt.ToUpper()
MessageBox.Show("Estensione: " & strExt) <---------------------
Select Case strExt

alextyx Profilo | Expert

Allora, ho deciso di mettere su il progettino e fare direttamente le prove. Ho scoperto la magagna!
Il problema risiede nel fatto che la stringa dei parametri contiene anche le virgolette all'inizio e alla fine del path.
Per rimediare, bisogna aggiungere qualche riga,immediatamente prima della chiamata alla funzione Apri():

If Parametri <> "" Then
Parametri = Parametri.Substring(1, Parametri.Length - 2)
End If

Ora a me funziona e mi legge il file .TXT con cui ho fatto la prova, nella richtextbox!

lucag. Profilo | Newbie

Complimeti e Grazie! Era proprio quello il problema. Ora è tutto risolto e tutto funziona perfettamente. Grazie per la tua collaborazione!
A presto

lucag. Profilo | Newbie

Salve, volevo chiederti un ULTIMA cosa: con questa nuova "funzione" di apertura del file con il metodo dei parametri, c'è solo 1 problema. Se apro il file in questo modo e se apporto delle modifiche al documento e clicco su "SALVA" mi fa salvare in un altro file, in pratica fa "save as", non save normale....Che dici?
Grazie millllleeee!

alextyx Profilo | Expert

Clicchi 'salva' dove? Io ho visto solo che tiri del testo in una textbox. Devi dirmi di più e poi vediamo che si può fare!

lucag. Profilo | Newbie

Effettivamente...hai ragione!
Allora, nel mio prog, oltre alle funzioni che già sai, c'è un pulsante per salvare, legato alla funzione salva e a una savedialog. TI allego qui stto il codice legato al bottone salva (bottone 16). Inoltre, c'è un altro bottone, numero 1, che ho reso invisibile e che ha una sua funzione. Ti allego qui sotto tutto...così capisci meglio. Grazie!!!


----

Private Sub Button16_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button16.Click

BoolModified = False


If currentFile = "" Then
Button1_Click(Me, e)
Exit Sub
End If

Dim strExt As String
strExt = System.IO.Path.GetExtension(currentFile)
strExt = strExt.ToUpper()

Select Case strExt
Case ".RTF"
RichTextBoxPrintCtrl1.SaveFile(currentFile)
Case Else
' to save as plain text
Dim txtWriter As System.IO.StreamWriter
txtWriter = New System.IO.StreamWriter(currentFile)
txtWriter.Write(RichTextBoxPrintCtrl1.Text)
txtWriter.Close()
txtWriter = Nothing
RichTextBoxPrintCtrl1.SelectionStart = 0
RichTextBoxPrintCtrl1.SelectionLength = 0
RichTextBoxPrintCtrl1.Modified = False
End Select

Me.Text = "Editor Text - " & currentFile.ToString()

End Sub



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SaveFileDialog1.Title = "Salva file"
SaveFileDialog1.DefaultExt = "rtf"
SaveFileDialog1.Filter = "Rich Text Files|*.rtf|All Files|*.*"
SaveFileDialog1.FilterIndex = 1
SaveFileDialog1.ShowDialog()

If SaveFileDialog1.FileName = "" Then Exit Sub

Dim strExt As String
strExt = System.IO.Path.GetExtension(SaveFileDialog1.FileName)
strExt = strExt.ToUpper()

Select Case strExt
Case ".RTF"
RichTextBoxPrintCtrl1.SaveFile(SaveFileDialog1.FileName, RichTextBoxStreamType.RichText)
Case Else
Dim txtWriter As System.IO.StreamWriter
txtWriter = New System.IO.StreamWriter(SaveFileDialog1.FileName)
txtWriter.Write(RichTextBoxPrintCtrl1.Text)
txtWriter.Close()
txtWriter = Nothing
RichTextBoxPrintCtrl1.SelectionStart = 0
RichTextBoxPrintCtrl1.SelectionLength = 0
End Select

currentFile = SaveFileDialog1.FileName
RichTextBoxPrintCtrl1.Modified = False
Me.Text = "Editor Text - " & currentFile.ToString()

End Sub

---

alextyx Profilo | Expert

Non so se ho ben capito, ma forse, quando tu clicchi sul bottone16, trova currentfile="" e va alla procedura del bottone1 ?
Può essere questo il problema?

lucag. Profilo | Newbie

Beh...il funzionamento è proprio così! Infatti, se il file ha già un nome, dovrebbe effettuarsi il "Save", se dovesse mancare, ciò dovrebbe significare che è un file nuovo, quindi fare un SAVE AS. Però..se io apro il file dal pulsante apri presente nel mio programma, il problema non si manifesta...Mentre con l'apertura del file tramite parametri, c' è il problema descritto prima...Immagino che sia un problema relativo al nome del file o qualcosa del genere... Da quanto ho capito è relativo al "FileName", quindi, penso che andrebbe inserito un codice come quello qui sotto, ma naturalmente, adattandolo ai parametri, e non alla openfiledialog.. Che ne dici?
Grazie

----

currentFile = OpenFileDialog1.FileName
RichTextBoxPrintCtrl1.Modified = False
Me.Text = "Editor - " & currentFile.ToString()


---

alextyx Profilo | Expert

Così ad occhio, direi che devi fare qualcosa del genere:

currentfile=Parametri

ovviamente quando sei nel caso di presenza di parametri. Forse dovrebbe bastare. Fammi sapere.

lucag. Profilo | Newbie

Sisì, funziona....grazie!
Bye
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5