|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 168
|
[VB.NET] Lettura da file INI a varie textbox
Ciao a tutti,
Vi pongo una domandina... Ho costruito un form dove sono presenti parecchie textbox che dovrebbero contenere dei valori letti da un file .ini ad esempio: Server Name=Daniele -> textbox1.text = Daniele Admin Name=Carlo -> textbox2.text = Carlo .. e così via .. Dovrei poter anche salvare il file in funzione delle modifiche apportate dal mio form... Come potrei imbastire il codice? è fattibile la cosa? Grazie mille a tutti
__________________
D@x |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Certamente, l'idea base è di aprire il file in lettura, leggerlo riga per riga e lanciare l'update delle textbox con istruzioni tipo
TextboxN.text = <stringa letta dal file> Suppongo VB.NET abbia anche qualcosa di più evoluto per leggere un file INI senza doverlo scorrere riga per riga e fare il parsing della riga letta per ricavare la stringa cercata
__________________
Il sole è giallo |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 168
|
Benissimo, grazie!
hai suggerimenti? sappi che io sono novizio in materia Ho letto di streamreader, riesco a fargli leggere interamente un file testuale e riempire una textbox ma... per fargli discriminare le parole ancora non ce la fò..
__________________
D@x |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Nov 2009
Messaggi: 56
|
ciao,
intendi proprio un INI esterno oppure vuoi fare un file risorsa o config ecc..? immagino la prima, prova a postare la struttura di questo file, perchè credo che si debba fare a manina la lettura. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 168
|
Quello che posto è solo una porzione di "INI", non mi servono proprio tutti i paramteri contenuti ma solo alcuni...
ServerBehindNAT=false DoLANBroadcast=False bIgnoreUTANBans=True ServerName=++ Enjoy II ++ The [BuG] Server AdminName=ARIX UsePrecaching=True ecc.. hai idee? grazie per l'interessamento..
__________________
D@x |
|
|
|
|
|
#6 | |
|
Member
Iscritto dal: Nov 2009
Messaggi: 56
|
Quote:
basta che le leggi riga per riga e splitti al segno uguale. esempio : Codice:
Dim strLinee As String() = File.ReadAllLines("percorso")
Dim ValoreFileINI As String
Dim key As String ="AdminName"
For Each strLinea As String In strLinee
If strLinea.IndexOf("=") > -1 Then
If key = strLinea.Split("=")(0) Then
ValoreFileINI = strLinea.Split("=")(1)
End If
End If
Next
non ho modo di testare, ma dovrebbe essere corretto (io programmo in c#) |
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 168
|
Sei un grande,funziona, bravo!
per aggiungere altre parole devo aggiungere altri "dim"? ora provo... poi per poter fare l inverso sarà difficile? cioè modificare da textbox e salvare nel posto giusto nell ini...
__________________
D@x |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 168
|
Ok sono riuscito.. spettacolo!!
è sorta una problematica: nell ini sono a volte presenti piu valori con lo stesso nome, differenziati solo dal loro titolo, es: [XGame.xDeathMatch] MaxLives=0 TimeLimit=20 GoalScore=50 .... [XGame.xTeamGame] MaxLives=0 TimeLimit=20 GoalScore=60 bTeamScoreRound=False .... come posso discriminare i valori dal loro titolo? è possibile?
__________________
D@x Ultima modifica di daxdaxdax : 02-11-2009 alle 23:05. |
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Nov 2009
Messaggi: 56
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 168
|
si, tra un blocco e l'altro cè una sola riga vuota.
Povero U235, a giudicare dal numero dei tuoi messaggi, deduco che ti sei appena iscritto... e io ti ho accolto con un bello sbattone ... perdonami :-)
__________________
D@x |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Nov 2009
Messaggi: 56
|
ciao, ho buttato giu' un codice adatto a leggere scrivere con semplicità sull' INI, il problema e che l'ho scritta in c# perchè non ho modo di testare con vb.
comunque la posto cosi se tu o qualcuno la puo'/vuole tradurre in vb prima di me (probabilmente staro fuori oggi) lo puo' fare. concettualmente comunque ho creato una lista di "blocchi" (cioè quelli tra parentesi quadre) che contengono i campi (cioè tutti quelli tipo <key>=<value>) che a loro volta hanno le proprietà nome e valore. editando queste proprietà e possibile editare anche il file facendo il ciclo della liste di blocchi e chiaramente per ogni blocco faccio il ciclo sui campi contenuti contenuti dentro appena posso faccio la conversione. Codice:
public class EditINI
{
public List<BloccoINI> blocchi { get; set; }
public string PercorsoFile { get; private set; }
public EditINI(string percorsoFile)
{
this.PercorsoFile = percorsoFile;
this.blocchi = new List<BloccoINI>();
System.IO.StreamReader sr = null;
try
{
//creo un StreamReader per leggere il file
sr = new System.IO.StreamReader(this.PercorsoFile);
//leggo il file e lo divido in linee
string[] linee = sr.ReadToEnd().Split('\n');
sr.Close();
sr.Dispose();
sr = null;
int c = 0;
//itero tutte le linee alla ricerca dei "blocchi"
foreach (string linea in linee)
{
if(linea.Length>1)
{
string Slinea = linea.Remove(linea.Length - 1);
// se trovo l'inizio di un blocco dentro il file...
if (Slinea != string.Empty && linea.Substring(0, 1) == "[")
{
//creo un nuovo blocco
BloccoINI blocco = new BloccoINI();
//lo nomino con tutta la sua riga
blocco.Nome = Slinea;
// creo una nuova lista di campi
blocco.Campi = new List<CampoINI>();
//imposto il numero di linea
blocco.NumeroLinea = c;
//aggiungo il blocco alla lista
this.blocchi.Add(blocco);
}
//diversamente è un campo
else
{
//divido la chiave dal valore
string[] valoriCampo = Slinea.Split('=');
//creo un nuovo campo
CampoINI campo = new CampoINI();
//imposto la "key"
campo.Nome = valoriCampo[0];
//imposto il valore
campo.Valore = valoriCampo[1];
//imposto il numero di linea
campo.NumeroLinea = c;
//aggiungo il campo all'ultimo blocco creato
this.blocchi[this.blocchi.Count - 1].Campi.Add(campo);
}
}
c++;
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
finally
{
if(sr != null)
{
sr.Close();
sr.Dispose();
}
}
}
public int IndiceBlocco(string blocco)
{
int result = -1;
int c=0;
try
{
foreach(BloccoINI bloccoINI in this.blocchi)
{
if (blocco.ToUpper() == bloccoINI.Nome.ToUpper())
{
return c;
}
c++;
}
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
return result;
}
public int IndiceCampo(string blocco, string campo)
{
int result = -1;
int c =0;
try
{
foreach(CampoINI campoINI in this.blocchi[IndiceBlocco(blocco)].Campi)
{
if (campo.ToUpper() == campoINI.Nome.ToUpper())
{
return c;
}
c++;
}
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
return result;
}
public bool ScriviFileINI()
{
bool result = true;
System.IO.StreamWriter sw = null;
try
{
sw = new System.IO.StreamWriter(this.PercorsoFile);
//itero tutti i blocchi
foreach (BloccoINI blocco in this.blocchi)
{
//incomincio scrivendo sul file il nome del blocco [xx--nome]
sw.WriteLine(blocco.Nome);
//itero tutti i campi contenuti in questo blocco
foreach (CampoINI campo in blocco.Campi)
{
StringBuilder sb = new StringBuilder(campo.Nome);
sb.Append("=");
sb.Append(campo.Valore);
//scrivo la <key>=<value> eventualmente modificata
sw.WriteLine(sb.ToString());
}
//alla fine del blocco rimetto la riga vuota
sw.WriteLine('\n');
}
sw.Close();
sw.Dispose();
sw = null;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
result = false;
}
finally
{
if (sw != null)
{
sw.Close();
sw.Dispose();
}
}
return result;
}
public class CampoINI
{
public string Nome { get; set; }
public string Valore { get; set; }
public int NumeroLinea { get; set; }
}
public class BloccoINI
{
public string Nome { get; set; }
public List<CampoINI> Campi { get; set; }
public int NumeroLinea { get; set; }
}
public CampoINI this[string blocco,string campo]
{
get { return this.blocchi[this.IndiceBlocco(blocco)].Campi[this.IndiceCampo(blocco, campo)]; }
set { this.blocchi[this.IndiceBlocco(blocco)].Campi[this.IndiceCampo(blocco, campo)] = value; }
}
}
}
Codice:
EditINI edit = new EditINI(@"C:\ini.ini");
edit["[XGame.xDeathMatch]", "MaxLives"].Valore = "45";
edit["[XGame.xTeamGame]", "MaxLives"].Valore = "30";
edit["[XGame.xTeamGame]", "GoalScore"].Valore = "15";
edit["[XGame.xDeathMatch]", "GoalScore"].Valore = edit["[XGame.xTeamGame]", "GoalScore"].Valore ;
//oppure :
edit.blocchi[1].Campi[2].Valore = "5";
//cancellare campi
edit.blocchi[0].Campi.RemoveAt(1);
//rimuovere blocchi interi
edit.blocchi.RemoveAt(edit.IndiceBlocco("[XGame.xDeathMatch]"));
//aggiungere blocchi e campi
EditINI.BloccoINI blocco = new EditINI.BloccoINI();
blocco.Nome = "[quellochetipare]";
EditINI.CampoINI campo = new EditINI.CampoINI();
campo.Nome = "nomechemipare";
campo.Valore = "valore";
blocco.Campi = new List<EditINI.CampoINI>();
blocco.Campi.Add(campo);
edit.blocchi.Add(blocco);
//aggiungere campi a blocchi esistenti
edit.blocchi[0].Campi.Add(campo);
//infine scrivo sul file
edit.ScriviFileINI();
Ultima modifica di U235 : 03-11-2009 alle 08:53. Motivo: integrazione codice |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Personalmente risolverei con alcune semplici Classi : > Classe Chiave : Codice:
Public Class Chiave
Private m_nome As String
Private m_valore As String
Public Property Nome() As String
Get
Return m_nome
End Get
Set(ByVal value As String)
m_nome = value
End Set
End Property
Public Property Valore() As String
Get
Return m_valore
End Get
Set(ByVal value As String)
m_valore = value
End Set
End Property
Public Sub New(ByVal nomeChiave As String, ByVal valoreChiave As String)
m_nome = nomeChiave
m_valore = valoreChiave
End Sub
End Class
Codice:
Public Class Gruppo
Inherits List(Of Chiave)
'Rappresenta un gruppo coerente di coppie "chiave=valore"
Private m_nome As String
Public Sub New(ByVal nome As String)
m_nome = nome
End Sub
Public Property Nome() As String
Get
Return m_nome
End Get
Set(ByVal value As String)
m_nome = value
End Set
End Property
Public Function GetChiaveByNome(ByVal nomeChiave As String) As Chiave
For Each C As Chiave In Me
If C.Nome = nomeChiave Then
Return C
End If
Next
Return Nothing
End Function
End Class
Codice:
Public Class FileIni
Inherits List(Of Gruppo)
Private m_nomeFileCompleto As String
Public Sub New(ByVal nomeFileCompleto As String)
m_nomeFileCompleto = nomeFileCompleto
End Sub
Public Sub Carica()
Me.Clear()
Using TR As System.IO.TextReader = System.IO.File.OpenText(m_nomeFileCompleto)
Dim strLinea As String = ""
Dim n As String = ""
Dim v As String = ""
Dim nv As String()
Dim G As Gruppo = Nothing
Do Until strLinea Is Nothing
strLinea = TR.ReadLine()
If strLinea = "" Then Continue Do
If strLinea(0) = "[" And strLinea(strLinea.Length - 1) = "]" Then
G = New Gruppo(strLinea)
Me.Add(G)
Else
nv = strLinea.Split("=")
n = nv(0)
v = nv(1)
G.Add(New Chiave(n, v))
End If
Loop
TR.Close()
End Using
End Sub
Public Sub Salva()
If Me.Count = 0 Then Exit Sub
Using TW As System.IO.TextWriter = System.IO.File.CreateText(m_nomeFileCompleto)
For Each G As Gruppo In Me
TW.WriteLine(G.Nome)
For Each C As Chiave In G
TW.WriteLine(C.Nome & "=" & C.Valore)
Next
TW.WriteLine("")
Next
TW.Flush()
TW.Close()
End Using
End Sub
Public Function GetGruppoByNome(ByVal nomeGruppo As String) As Gruppo
For Each G As Gruppo In Me
If G.Nome = nomeGruppo Then
Return G
End If
Next
Return Nothing
End Function
End Class
Codice:
'Carica
Dim INI As New FileIni(Application.StartupPath & "\TEST.ini")
INI.Carica()
'Trova, Modifica e Salva
INI.GetGruppoByNome("[XGame.xDeathMatch]").GetChiaveByNome("TimeLimit").Valore = "100"
INI.GetGruppoByNome("[XGame.xTeamGame]").GetChiaveByNome("bTeamScoreRound").Valore = "True"
INI.Salva()
|
|
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Nov 2009
Messaggi: 56
|
Quote:
mi servirà anche la versione vb.net, grazie. ciao a tutti e tre i partecipanti alla discussione. |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
|
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Nov 2009
Messaggi: 56
|
è praticamente uguale alla classe che ho postato io
__________________
Un elemento come me quando si fissa fa sempre un gran casino, ma solo nel 45 ciò è stato negativo . Little Boy era mio nonno |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
|
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 168
|
Complimenti a tutti ragazzi, siete dei grandi... ora mi studio quello che avete postato e provo... vi farò sapere presto. non mi è chiaro dove immettere il valore testuale della mia label come percorso del file da caricare...
__________________
D@x Ultima modifica di daxdaxdax : 03-11-2009 alle 22:30. |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
|
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 168
|
ok! e.. tutte le stringhe da caricare le devo dichiarare nella pubblic sub carica?
forse ho capito.. TextBox1.Text = INI.GetGruppoByNome("Engine.GameReplicationInfo]").GetChiaveByNome("ServerName").Valore
__________________
D@x Ultima modifica di daxdaxdax : 04-11-2009 alle 19:03. |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Codice:
Dim INI As New FileIni( percorso )
INI.Carica()
Quando hai l'oggetto INI, il 90% del lavoro l'ha già fatto la mia classe. A te resta di fare il binding con le textbox sulla Form. Una tecnica possibile ed elegante è di creare un controllo GroupBox ( anche dinamicamente ) per ogni Gruppo trovato in INI, a cui aggiungere una TextBox per ogni Chiave... |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:50.




















