View Full Version : [VB.NET] Lettura da file INI a varie textbox
daxdaxdax
02-11-2009, 17:53
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 ;)
yorkeiser
02-11-2009, 18:04
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
daxdaxdax
02-11-2009, 18:25
Benissimo, grazie!
hai suggerimenti? sappi che io sono novizio in materia :D :D
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ò..
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.
daxdaxdax
02-11-2009, 19:54
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..
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..
se le righe sono sempre "uguali" nel senso che sono sempre <key>=<valore>
basta che le leggi riga per riga e splitti al segno uguale.
esempio :
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#)
daxdaxdax
02-11-2009, 21:18
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...
daxdaxdax
02-11-2009, 21:28
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?
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?
ha delle righe vuote tra i blocchi con le parentesi quadre?
daxdaxdax
02-11-2009, 23:32
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 :-)
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.
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; }
}
}
}
e per utilizzaarla :
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();
è 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?
Puoi vedere un File INI come una collezione di Gruppi, un Gruppo come una collezione di Chiavi ( coppie di nomeChiave e valoreChiave ), in questo modo rendi tutto più organico e leggibile.
Personalmente risolverei con alcune semplici Classi :
> Classe Chiave :
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
> Classe Gruppo :
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
> Classe FileIni :
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
A questo punto Caricare, Salvare, Cercare e Modificare Gruppi / Chiavi / Valori nel File Ini diventa molto semplice :
'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()
;)
Puoi vedere un File INI come una collezione di Gruppi, un Gruppo come una collezione di Chiavi ( coppie di nomeChiave e valoreChiave ), in questo modo rendi tutto più organico e leggibile.
Personalmente risolverei con alcune semplici Classi :
...
grande! se non fosse per qualche piccola differenza sarebbe una traduzione perfetta.
mi servirà anche la versione vb.net, grazie.
ciao a tutti e tre i partecipanti alla discussione.
se non fosse per qualche piccola differenza sarebbe una traduzione perfetta.
Traduzione... di che ? :stordita:
Traduzione... di che ? :stordita:
è praticamente uguale alla classe che ho postato io:) tradotta in vb.net, pensavo fosse voluto... :)
è praticamente uguale alla classe che ho postato io:) tradotta in vb.net, pensavo fosse voluto... :)
Ah ok. No, infatti il tuo codice C# non l'avevo proprio letto. :D
daxdaxdax
03-11-2009, 20:49
:eek:
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...
non mi è chiaro dove immettere il valore testuale della mia label come percorso del file da caricare...
Nel metodo costruttore della classe FileIni, perciò :
Dim INI As New FileIni( percorso )
daxdaxdax
04-11-2009, 18:54
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
ok! e.. tutte le stringhe da caricare le devo dichiarare nella pubblic sub carica?
No, non devi dichiarare nulla. Quando fai :
Dim INI As New FileIni( percorso )
INI.Carica()
il metodo Carica() apre il file .ini, lo legge e riempie l'oggetto INI ( che eredita da List(Of Gruppo) ), con tutti i Gruppi trovati, e ciascun Gruppo con tutte le chiavi trovate. Comodo, no ?
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... ;)
forse ho capito..
TextBox1.Text = INI.GetGruppoByNome("Engine.GameReplicationInfo]").GetChiaveByNome("ServerName").Valore
Esatto, io pensavo a qualcosa di più raffinato, ma sì, il concetto è quello ! :D
Esatto, io pensavo a qualcosa di più raffinato, ma sì, il concetto è quello ! :D
Ciao MarcoGG,
scusami se approfitto della tua gentilezza, come posso modificare la tua classe per fare in modo ad esempio di creare un blocco ed inserirlo tra uno e l'altro oppure aggiungere un campo in una determinata posizione ecc..?
grazie per le dritte...
daxdaxdax
04-11-2009, 20:44
Comodo? Spaziale!!!
grasie, provo poi faccio sapere :-)
Ciao MarcoGG,
scusami se approfitto della tua gentilezza, come posso modificare la tua classe per fare in modo ad esempio di creare un blocco ed inserirlo tra uno e l'altro oppure aggiungere un campo in una determinata posizione ecc..?
grazie per le dritte...
FileIni eredita da List(Of), pertanto è possibile usare tutti i metodi generici di aggiunta alla List ( .Add, .Insert, ecc... ).
Se volessi invece un metodo che, dato in input il nome di un Gruppo già presente nell'INI, inserisca un nuovo Gruppo subito dopo, ad esempio puoi aggiungere alla Classe FileIni il metodo :
Public Sub AddGruppoDopo(ByVal nomeGruppo As String, ByVal nomeNuovoGruppo As String)
For Each G As Gruppo In Me
If G.Nome = nomeGruppo Then
Me.Insert(Me.IndexOf(G) + 1, New Gruppo(nomeNuovoGruppo))
Exit For
End If
Next
End Sub
Da usarsi così :
'Inserisci subito dopo "[XGame.xDeathMatch]" il nuovo Gruppo "[NomeNuovoGruppo]"
INI.AddGruppoDopo("[XGame.xDeathMatch]", "[NomeNuovoGruppo]")
INI.Salva()
Ovviamente metodi buttati giù così, senza alcun controllo errori. A voi il piacere di implementare... ;)
FileIni eredita da List(Of), pertanto è possibile usare tutti i metodi generici di aggiunta alla List ( .Add, .Insert, ecc... ).
Se volessi invece un metodo che, dato in input il nome di un Gruppo già presente nell'INI, inserisca un nuovo Gruppo subito dopo, ad esempio puoi aggiungere alla Classe FileIni il metodo :
Public Sub AddGruppoDopo(ByVal nomeGruppo As String, ByVal nomeNuovoGruppo As String)
For Each G As Gruppo In Me
If G.Nome = nomeGruppo Then
Me.Insert(Me.IndexOf(G) + 1, New Gruppo(nomeNuovoGruppo))
Exit For
End If
Next
End Sub
Da usarsi così :
'Inserisci subito dopo "[XGame.xDeathMatch]" il nuovo Gruppo "[NomeNuovoGruppo]"
INI.AddGruppoDopo("[XGame.xDeathMatch]", "[NomeNuovoGruppo]")
INI.Salva()
Ovviamente metodi buttati giù così, senza alcun controllo errori. A voi il piacere di implementare... ;)
grazie, gentilissimo.
Puo' sempre servire in vb anche se in genere programmo in c#.
ciao.
daxdaxdax
04-11-2009, 22:38
Esatto, io pensavo a qualcosa di più raffinato, ma sì, il concetto è quello ! :D
Ok funziona tutto alla grande!!!
ancora una domandina.. :D
In che modo posso modificare la sub carica in modo che se le viene chiesto un parametro che non esiste, non dia errore?
Ok funziona tutto alla grande!!!
ancora una domandina.. :D
In che modo posso modificare la sub carica in modo che se le viene chiesto un parametro che non esiste, non dia errore?
Beh, dipende da cosa si desidera che succeda se m_nomeFileCompleto non corrisponde ad un file ini realmente esistente.
La cosa più semplice è uscire dal metodo Carica(), ossia come prima linea di codice nel metodo inserire :
If System.IO.File.Exists(m_nomeFileCompleto) = False Then Exit Sub
in questo caso l'oggetto INI, dopo l'esecuzione di Carica() sarà una lista vuota :
Dim INI As New FileIni( percorsoErrato )
INI.Carica()
If INI.Count = 0 Then MsgBox("vuoto")
E poi bisognerebbe gestire le eccezioni dovute al caricamento di un file ini non formattato correttamente. Questa classe è pensata per un file Ini, diciamo "ben formato", se così si può dire, ossia che rispetta la struttura :
[Gruppo1]
Chiave1=valore
Chiave2=valore
...
ChiaveN=valore
< spazio >
[Gruppo2]
Chiave1=valore
Chiave2=valore
...
ChiaveN=valore
ecc...
Bisogna aver chiaro quali errori possono verificarsi, e quali azioni intraprendere caso per caso...
daxdaxdax
05-11-2009, 00:21
Capito...
sai che funziona tutto a parte la funzione salva?
come sono ignorante... cosa manca secondo te?
(Comunque aggiungere letture di stringhe in questo modo è sicuramente meno laborioso...goood)
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
' SALVATAGGIO PARAMETRI SU FILE SCELTO
Dim INI As New FileIni(Label17.Text)
INI.GetGruppoByNome("[Engine.GameReplicationInfo]").GetChiaveByNome("ServerName").Valore = Nomeserver.Text
ProgressBar1.Value += 1
INI.GetGruppoByNome("[Engine.GameReplicationInfo]").GetChiaveByNome("AdminName").Valore = NomeAmmin.Text
ProgressBar1.Value += 1
INI.GetGruppoByNome("[Engine.GameReplicationInfo]").GetChiaveByNome("AdminEmail").Valore = AmminMail.Text
ProgressBar1.Value += 1
ecc...
Come "a parte la funzione Salva" ?
Da me funziona benissimo. Che problema c'è ?
daxdaxdax
05-11-2009, 17:43
Object reference not set to an instance of an object.
Object reference not set to an instance of an object.
Eh, vabbeh, :D , ma facendo COSA ti da quell'errore ?
daxdaxdax
05-11-2009, 21:17
Hihihihi scusa.... hai ragione...:)
Allora, ho scritto nella sub del mio pulsante "LEGGI"
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim INI As New FileIni(Label17.Text)
INI.Carica()
ProgressBar1.Value += 1
Nomeserver.Text = INI.GetGruppoByNome("[Engine.GameReplicationInfo]").GetChiaveByNome("ServerName").Valore
ecc..
Poi, ho fatto un pulsante "scrivi" che (se ho capito bene il concetto) prende invece i valori delle varie textbox per ricompilare l'ormai famoso INI e salvarlo...Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
' SALVATAGGIO PARAMETRI SU FILE SCELTO
Dim INI As New FileIni(Label17.Text)
INI.GetGruppoByNome("[Engine.GameReplicationInfo]").GetChiaveByNome("ServerName").Valore = Nomeserver.Text
ProgressBar1.Value += 1
ecc..
Il LEGGI funziona da dio ma SCRIVI mi si ferma evidenziandomi :
INI.GetGruppoByNome("[Engine.GameReplicationInfo]").GetChiaveByNome("ServerName").Valore = Nomeserver.Text
Ora, non capisco che errore ci sia dato che non cè alcun problema apparente..
Quando avrò compreso appieno le tue classi sarò mooolto felice :) :)
ciao
sei certo che nel file INI ci siano esattamente quelle voci ([Engine.GameReplicationInfo] e ServerName)?
se sbagli anche solo un carattere ti da quelgenere di errore mi sa...
daxdaxdax
05-11-2009, 23:25
Ciao U235 :) :)
si, sono abbastanza sicuro che esistano...
In fase di lettura legge il valore, in fase di scrittura\salvataggio, no... mah..
Io nel frattempo ravano ancora un po per capire...
Hihihihi scusa.... hai ragione...:)
Allora, ho scritto nella sub del mio pulsante "LEGGI"
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim INI As New FileIni(Label17.Text)
INI.Carica()
ProgressBar1.Value += 1
Nomeserver.Text = INI.GetGruppoByNome("[Engine.GameReplicationInfo]").GetChiaveByNome("ServerName").Valore
ecc..
Poi, ho fatto un pulsante "scrivi" che (se ho capito bene il concetto) prende invece i valori delle varie textbox per ricompilare l'ormai famoso INI e salvarlo...Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
' SALVATAGGIO PARAMETRI SU FILE SCELTO
Dim INI As New FileIni(Label17.Text)
INI.GetGruppoByNome("[Engine.GameReplicationInfo]").GetChiaveByNome("ServerName").Valore = Nomeserver.Text
ProgressBar1.Value += 1
ecc..
Il LEGGI funziona da dio ma SCRIVI mi si ferma evidenziandomi :
INI.GetGruppoByNome("[Engine.GameReplicationInfo]").GetChiaveByNome("ServerName").Valore = Nomeserver.Text
Ora, non capisco che errore ci sia dato che non cè alcun problema apparente..
Quando avrò compreso appieno le tue classi sarò mooolto felice :) :)
Ora che ti sei spiegato chiaro su COSA fai e su COME lo fai, direi che il problema è lampante. Fai attenzione :
1. Istanzi un oggetto della classe FileIni, e poi con Carica() lo "riempi" con i gruppi e le chiavi presenti. Perfetto.
2. Poi, per salvare, fai questo :
' SALVATAGGIO PARAMETRI SU FILE SCELTO
Dim INI As New FileIni(Label17.Text)
INI.GetGruppoByNome("[Engine.GameReplicationInfo]").GetChiaveByNome("ServerName").Valore = Nomeserver.Text
Istanzi un altro oggetto da FileINI, NON fai il Carica(), e cerchi un Gruppo, e una Chiave che ovviamente non possono esistere, perchè ti ritrovi una List vuota !
L'inizializzazione dell'oggetto INI deve avvenire una volta sola ed essere visibile dalle ruotine di lettura e scrittura. Il che significa che la dichiarazione dell'oggetto INI di tipo FileIni deve avvenire a livello di Form, o anche a livello di Modulo o classe statica...
Quando INI è caricato con Carica(), non è più necessario istanziare un altro oggetto FileIni per fare il Salva().
Salva() va fatto sulla stessa istanza da cui hai eseguito il Carica().
Credo di essermi spiegato. ;)
daxdaxdax
06-11-2009, 00:02
Sempre disponibile, grazie.
Domani cerco di capire dove sbaglio e ti dico..
Siete i miei due maestri :) :)
Devo usare "shared"?
..consigliatemi un libro per mozzi come me per imparare queste cose..
Devo usare "shared"?
Shared è lo "Static" di VB.NET.
Dipende... Usarlo per cosa ?
daxdaxdax
07-11-2009, 11:37
Per fare la classe statica che dicevi... Per far vedere alle ruotine di lettura e scrittura "dim INI As New FileIni(Label17.Text)"
Per fare la classe statica che dicevi...
Un Modulo VB.NET è già di per sè una classe statica. Non hai nessun bisogno di usare Shared. Basta :
Module ModuloINI
Public FI As FileIni
End Module
Quando vuoi caricare :
FI = New FileIni ( percorso )
FI.Carica()
Quando vuoi salvare :
FI.Salva()
Quando te ne vuoi liberare :
FI.Dispose()
A patto di aver implementato IDisposable nella classe FileIni.
;)
daxdaxdax
07-11-2009, 17:52
Io non ci riesco...
se posto tutta la mia form5 hai voglia di leggerla?
Io non ci riesco...
se posto tutta la mia form5 hai voglia di leggerla?
NO. :D
daxdaxdax
07-11-2009, 18:24
Hihihihihhi ok :)
tardi... ma ho capito..
Grazie di tutto, a buon rendere :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.