Oppure

Loading
11/12/08 15:45
Il Totem
Riporto qui alcune domande postate troppo spesso, con relativa risposta:


Come si salvano gli elementi di una listbox su file txt?
Ovviamente, scrivendo sul file di testo i suoi elementi. Per scorrere gli elementi si usa una enumerazione (ciclo for); per scriverli si usa la classe StreamWriter.
Dim Writer As New IO.StreamWriter("FileName")
For i As Integer = 0 To ListBox1.Items.Count - 1
  Writer.WriteLine(ListBox1.Items.Item(i))
Next
Writer.Close()


Riferimenti:
- Struttura For
totem.altervista.org/guida/versione2/…
- Uso di ListBox e ComboBox
totem.altervista.org/guida/versione2/…
- Scrittura e lettura di file
totem.altervista.org/guida/versione2/…

Discussione:
pierotofy.it/pages/extras/forum/16/46067-salvare_file_txt/


Come si fa ad impostare un programma predefinito per una certa estensione?
Per associare un programma predefinito a un'estensione particolae di file bisogna modificare il registro di sistema. Il luogo dove vengono depositate tutte le informazioni sulle estensioni è la chiave globale HKEY_CLASSES_ROOT. In essa sono presenti moltissime sottochiavi con il nome dell'estensione.
Quindi, per prima cosa si deve creare in questa chiave globale una sottochiave col nome dell'estensione (es.: ".new";). All'intero di quest'ultima, si deve modificare il valore (Predefinito) con un nome sintetico che descriva l'applicazione usata e il tipo di file (es.: "MyProgramNew";).
Dopodiché, sempre all'interno di HKEY_CLASSES_ROOT, si crea un'altra sottochiave di primo livello, usando lo stesso nome inserito come valore predefinito in precedenza (es.: "MyProgramNew";). All'interno di questa chiave, il valore (Predefinito) può essere modificato a piacere a indica la descrizione che apparirà nell'explorer (es.: "File NEW";). Per creare un collegamento con l'applicazione predefinita, si devono creare le sottochiavi shell\open\command: all'interno dell'ultima (command), il valore (Predefinito) deve essere il percorso dell'applicazione predefinita per l'apertura, seguita da "%1" o "%l" (es.: "C:\Programmi\MyProgram\MyProgram.exe" "%1";).
Per quanto riguarda il codice:
Imports Microsoft.Win32

'...

Private Sub RegisterProgram()
    Dim RegKey As RegistryKey = Registry.ClassesRoot.OpenSubKey(".New")
    Dim WParam As RegistryKeyPermissionCheck = RegistryKeyPermissionCheck.ReadWriteSubTree

    If RegKey IsNot Nothing Then
        Exit Sub
    End If

    RegKey = Registry.ClassesRoot.CreateSubKey(".New", WParam)
    RegKey.SetValue("", "MyProgramNew")
    RegKey = Registry.ClassesRoot.CreateSubKey("MyProgramNew", WParam)
    RegKey.SetValue("", "File New")
    RegKey = Registry.ClassesRoot.OpenSubKey("MyProgramNew", True)
    RegKey = RegKey.CreateSubKey("shell\open\command", WParam)
    RegKey.SetValue("", String.Format("""{0}"" ""%1""", Application.ExecutablePath))
End Sub

Ovviamente se non dite al programma cosa fare, lui se ne fa un baffo del percorso che riceve in input. Bisogna controllare i parametri da linea di comando:
If My.Application.CommandLineArgs.Count > 0 Then
  'Ci sono parametri: il primo è il percorso del file da aprire
  Dim Path as string = My.Application.CommandLineArgs(0)
End If


Riferimenti:
- Parametri da riga di comando
totem.altervista.org/appunti/…
- Modifica del registro di sistema
totem.altervista.org/guida/versione2/…

Discussione:
pierotofy.it/pages/extras/forum/16/46005-programma_predefinito/
aaa
30/03/09 13:38
Il Totem
Come si aggiunge del testo a una stringa/TextBox/RichTextBox/Label?
Non capisco perchè sia così difficile da comprendere. L'operatore = IMPOSTA il testo: ciò significa che se scrivete:
Label1.Text = "ciao"

quello che ottenente è un CAMBIAMENTO di valore del testo (questo vale anche per variabili stringa), e NON un'AGGIUNTA. Se volete effettivamente aggiungere qualcosa alla fine di una stringa, dovete usare l'operatore += o &=, ad esempio:
Dim A As String = "Ciao"
Dim B As String = " Totem"

A += B '> "Ciao Totem"



Come si passano variabili da un form a un altro?
Le variabili, ed in generale i membri, di un form sono esclusivi e unici per quel form, perciò NON si possono richiamare da alcun altro form. Il compilatore non è onniscente e non esiste alcun tipo di magia che faccia valere i membri di un form anche per un altro. Essi vanno esplicitamente posti in un luogo accessibile a tutti i form, ossia un modulo (o classe statica). Il modulo è solitamente dichiarato in un file separato e contiene solo quei membri che è necessario condividere tra tutte le parti dell'applicazione.
In VB.NET:
Module Globals
  Public Const C As Int32 = 300
  
  Public Sub DoSomething()

  End Sub
End Module

In C#
static class Globals
{
  public const int C = 300;

  public void DoSomething()
  {

  }
}


In VB.NET esiste il namespace My, che gode della proprietà Forms, nella quale sono contenuti i riferimenti alle istanze di default dei form. My.Forms.Form1 indica il primo form (se si chiama Form1) e gli altri sono denominati di conseguenza. E' possibile accedere a un qualsiasi form da My.Forms a patto che tale form NON sia stato creato da codice dal programmatore, poiché in quel caso sarebbe un'altra istanza della classe in questione e non quella di default.
Ultima modifica effettuata da Il Totem 31/12/09 9:21
aaa
20/07/10 8:21
Il Totem
Come si associano più controlli a un indice / esistono le matrici di controlli?
In .NET non esistono le matrici di controlli, almeno non come i programmatori VB6 sono abituati a conoscerle. Dato che ogni controllo è un oggetto, è possibile dichiarare array di controlli così come si dichiarano array di qualsiasi altro tipo:
'Dichiara un array di Button
Dim Buttons(9) As Button

'Inizializza ogni controllo
For I As Byte = 0 To 9
   Buttons(I) = New Button()
   Buttons(I).Location = New Point(10, I * 25)
   Buttons(I).Size = New Size(70, 20)
Next

Per aggiungere i controlli creati a un form o a un qualsiasi controllo contenitore (GroupBox, Panel, PictureBox, eccetera...) basta aggiungerli alla proprietà Controls:
Dim B As New Button() With {.Location = New Point(10, 10), .Size = New Size(70, 20)}
Me.Controls.Add(B)

E' possibile fare la stessa cosa con più controlli. Una volta aggiunti alla collezione, ogni controllo viene visualizzato nella GUI, ed è accessibile tramite un indice o una chiave all'interno della suddetta collezione.
For I As Int32 = 0 To Me.Controls.Count - 1
   Me.Controls(I).Text = "Ciao"
Next

'oppure

Me.Controls("txtNome").Text = "Luca"

'oppure, ancora:

For Each C As Control In Me.Controls
   If TypeOf C Is ListBox Then
      DirectCast(C, ListBox).Items.Add("Fuffa")
   End If
Next
aaa
22/08/10 8:32
Il Totem
Come si leggono solo certe righe di un file di testo?
Ci sono almeno tre modi per farlo.
1 - Si legge tutto il file di testo e si usa la funzione String.Split per spezzarlo in tante sottostringhe divise da un certo carattere, che in questo caso sarà l'a capo:
Dim File As String = IO.File.ReadAllText("percorso")
Dim Lines() As String = File.Split(Environment.NewLine)

Lines è un array che contiene tutte le sottostringhe del contenuto del file separate dal carattere a capo, ossia contiene in ogni cella una singola riga di testo. Per accedere a quelle volute, si usa un indice:
Dim Line1 As String = Lines(0) 'prima riga
Dim Line5 As String = Lines(4) 'quinta riga

E' possibile leggere e modificare il contenuto dell'array. Se vi vuole salvare ancora tutto sul file di testo, basta scrivere tutte le linee:
Dim W As New IO.StreamWriter("percorso")
For Each Line As String In Lines
   W.WriteLine(Line)
Next
W.Close()


2 - Alternativa più corta al metodo precedente. Per leggere tutte le linee si usa:
Dim Lines() As String = IO.File.ReadAllLines("percorso")

Per scrivere tutto direttamente sul file, invece:
IO.File.WriteAllLines(Lines)


3 - Si utilizza un buffer di caratteri per immagazzinare tutti i caratteri del file fino all'a capo in una variabile. Dopodiché essa viene aggiunta a una lista. Si continua a bufferizzare fino alla fine del file.
Ultima modifica effettuata da Il Totem 22/08/10 8:33
aaa