Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Usare Shell per gestire una sola finestra di programma

    Premessa: uso Visual Basic Express 2013

    Sintetizzando, con questo banale codice...

    NomeFile = " C:\MioDocumento.rtf"

    Shell ("C:\wordpad.exe" & NomeFile , AppWinStyle.NormalNoFocus)


    ...apro in WordPad il file MioDocumento.RTF. Se, però, in seguito voglio esaminare anche il file AltroDocumento.RTF, con questa sintassi viene aperta una nuova sessione di WordPad e alla fine rischio di affollare troppo lo schermo. L'alternativa è quella di chiudere tutte le finestre di WordPad non più necessarie, ma è ovvio che è scomodo.

    Domanda:

    Come fare per aprire vari file RTF, in successione, su un'unica sessione di WordPad?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da GrandeTimoniere Visualizza il messaggio
    Premessa: uso Visual Basic Express 2013

    Sintetizzando, con questo banale codice...

    NomeFile = " C:\MioDocumento.rtf"

    Shell ("C:\wordpad.exe" & NomeFile , AppWinStyle.NormalNoFocus)


    ...apro in WordPad il file MioDocumento.RTF. Se, però, in seguito voglio esaminare anche il file AltroDocumento.RTF, con questa sintassi viene aperta una nuova sessione di WordPad e alla fine rischio di affollare troppo lo schermo. L'alternativa è quella di chiudere tutte le finestre di WordPad non più necessarie, ma è ovvio che è scomodo.

    Domanda:

    Come fare per aprire vari file RTF, in successione, su un'unica sessione di WordPad?
    Ma non potrebbe essere che basta chiudere il process aperto (wordpad) prima di richiamarne l'apertura di un'altro?

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non puoi usare un'interfaccia grafica con delle richtextbox?
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Quote Originariamente inviata da renygade Visualizza il messaggio
    Ma non potrebbe essere che basta chiudere il process aperto (wordpad) prima di richiamarne l'apertura di un'altro?
    Ma è proprio la domanda che ho fatto: come si fa - da Visual Basic - a chiudere un processo aperto, in precedenza, con Shell?

  5. #5
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Non puoi usare un'interfaccia grafica con delle richtextbox?
    Oservazione corretta, ma la risposta è negativa per due motivi:

    1) Come ho detto nel post, il problema è solo una sintesi delle difficoltà che ho incontrato. In realtà il programma che sto sviluppando evidenzia un ListBox in cui sono presenti i link di file di ogni tipo (RTF, JPG, XLS, WAV, eccetera). L'utente, cliccando uno dei nomi di file, dovrebbe avere la possibilità di aprire quel file con un programma da lui indicato (non necessariamente quello predefinito dal sistema). Per esempio, potrebbe voler aprire i file DOC con Word, ma i file RTF con Notepad; i file JPG non con PhotoShop, ma con Paint (eccetera).

    2) Ho già provato: può sembrare strano, ma usando un RichTextBox - e aprendo al suo interno un file RTF - il file viene aperto come se, invece di un RichTextBox, avessi a disposizione un semplice TextBox. Tanto per intederci, al suo interno compaiono i vari codici di formattazione, tipici di RTF. Esempio:

    {\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1040{\fonttbl{\f0\from an\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
    {\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f6\fmodern\fcharset 0\fprq1{\*\panose 00000000000000000000}Courier;}{\f14\fnil\fcharset2 \fprq2{\*\panose 05000000000000000000}Wingdings;}}{\colortbl;\red0\ green0\blue0

    ...eccetera.

    Il fatto strano è che facendo copia da un file RTF (da Word o da Notepad) e incolla (sul RichTextBox), il testo incollato mantiene tutte le caratteristiche (font, colore, attributi) e non so spiegarmene il motivo.

    Rimane il fatto che, anche se riuscissi a risolvere il problema del RichTextBox, rimarrebbe comunque aperto per gli altri programmi.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da GrandeTimoniere Visualizza il messaggio
    Ma è proprio la domanda che ho fatto: come si fa - da Visual Basic - a chiudere un processo aperto, in precedenza, con Shell?
    Il fatto è che non devi usare la Shell ma la classe Process con tutte le sue caratteristiche.

    http://msdn.microsoft.com/it-it/libr...v=vs.110).aspx
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Il fatto è che non devi usare la Shell ma la classe Process con tutte le sue caratteristiche.

    http://msdn.microsoft.com/it-it/libr...v=vs.110).aspx
    Ti ringrazio! Mi sei stato di grande aiuto. Ma ho ancora un piccolo problema.
    Anzitutto:

    1) Ho creato un Form contenente un TextBox (che contiene il path del programma WordPad.EXE) e un Button. Il codice è banale e funziona perfettamente:

    ----------------------------------
    Imports System
    Imports System.Diagnostics
    Imports System.ComponentModel


    Public Class Form1
    Public Aperto As Boolean
    Public X As Process


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Programma As New Process()
    If Aperto = True Then
    X.Kill()
    End If
    Programma.StartInfo.UseShellExecute = False
    Programma.StartInfo.FileName = TextBox1.Text
    Programma.StartInfo.CreateNoWindow = False
    Programma.Start()
    X = Programma
    Aperto = True
    End Sub


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Aperto = False
    End Sub


    End Class

    --------------------------
    Grazie a If ... End If Ogni volta che premo Button1 viene chiusa la sessione (eventualmente già aperta) di WordPad e ne viene creata una nuova (poco male: avrei preferito aprire un file all'interno di quella già aperta, ma mi accontento...).

    2) Il fatto è che se l'utente, dopo aver aperto WordPad premendo Button1, chiude la finestra di WordPad e poi preme Button1, il programma si interrompe perché, giustamente, non "vede" più il processo WordPad da "Killare".
    Bisognerebbe inserire del codice come questo:

    If finestra WordPad = aperta Then X.Kill Else Continua così.

    Un suggerimento? Grazie in anticipo!

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da GrandeTimoniere Visualizza il messaggio
    Ti ringrazio! Mi sei stato di grande aiuto. Ma ho ancora un piccolo problema.
    Anzitutto:

    1) Ho creato un Form contenente un TextBox (che contiene il path del programma WordPad.EXE) e un Button. Il codice è banale e funziona perfettamente:

    ----------------------------------
    Imports System
    Imports System.Diagnostics
    Imports System.ComponentModel


    Public Class Form1
    Public Aperto As Boolean
    Public X As Process


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Programma As New Process()
    If Aperto = True Then
    X.Kill()
    End If
    Programma.StartInfo.UseShellExecute = False
    Programma.StartInfo.FileName = TextBox1.Text
    Programma.StartInfo.CreateNoWindow = False
    Programma.Start()
    X = Programma
    Aperto = True
    End Sub


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Aperto = False
    End Sub


    End Class

    --------------------------
    Grazie a If ... End If Ogni volta che premo Button1 viene chiusa la sessione (eventualmente già aperta) di WordPad e ne viene creata una nuova (poco male: avrei preferito aprire un file all'interno di quella già aperta, ma mi accontento...).

    2) Il fatto è che se l'utente, dopo aver aperto WordPad premendo Button1, chiude la finestra di WordPad e poi preme Button1, il programma si interrompe perché, giustamente, non "vede" più il processo WordPad da "Killare".
    Bisognerebbe inserire del codice come questo:

    If finestra WordPad = aperta Then X.Kill Else Continua così.

    Un suggerimento? Grazie in anticipo!
    LA classe process ha la proprietà HasExited che dovrebbe fare al caso tuo

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da renygade Visualizza il messaggio
    LA classe process ha la proprietà HasExited che dovrebbe fare al caso tuo
    Infatti potresti scrivere semplicemente

    codice:
        Dim programma As Process = Nothing
    
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If programma Is Nothing Then
                programma = New Process()
            Else
                If Not programma.HasExited Then
                    programma.Kill()
                End If
            End If
    
    
            programma.StartInfo.UseShellExecute = False
            programma.StartInfo.FileName =  TextBox1.Text
            programma.StartInfo.CreateNoWindow = False
            programma.Start()
        End Sub
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Quote Originariamente inviata da renygade Visualizza il messaggio
    LA classe process ha la proprietà HasExited che dovrebbe fare al caso tuo
    Grazie anche a te, era proprio quello che mi serviva!
    Ora WordPad (se aperto) viene chiuso e subito dopo se ne apre una nuova sessione.
    A chi può interessare, ecco la modifica da apportare alla sub del post precedente:

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

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Programma As New Process()

    If Aperto = True Then
    If X.HasExited = False Then
    X.Kill() : Aperto = False
    End If
    End If

    If Aperto = False Then
    Programma.StartInfo.UseShellExecute = False
    Programma.StartInfo.FileName = TextBox1.Text REM & " " & TextBox2.Text REM IMPOSSIBILE TROVARE IL FILE SPECIFICATO
    Programma.StartInfo.CreateNoWindow = False
    Programma.Start()
    X = Programma
    Aperto = True
    End If

    End Sub
    --------------------------------------

    Tuttavia c'è da dire che WordPad è un programma leggerissimo e il tempo necessario a chiudere e riaprire una sua sessione è praticamente inavvertibile. Ma se, invece di WordPad, voglio aprire programmi più corposi (come PhotoShop), il tempo di apertura / chiusura potrebbe risultare eccessivo. C'è un modo per "costringere" Visual Basic a usare sempre la stessa sessione del programma con cui aprire i vari file di competenza?

    Tra l'altro (si noti la parte del codice compresa tra i due REM) VisualBasic segnala l'inesistenza del file se tento di aprire WordPad facendo seguire il Path del file di testo RTF (ovviamente presente in TextBox2.Text). Con quale sintassi è possibile aprire un file "associato" a Programma.StartInfo.FileName ? Ho provato facendo precedere il nome del Path del file RTF da un semplice spazio (come nel codice riportato qui sopra, togliendo il REM ) da una virgola, da una barra dritta o inversa, ma il file sembra sempre non esistere (non ho commesso errore di digitazione: ho trascritto con copia/incolla).

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.