Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Problema nella lettura file .ini
Forum - C# / VB.NET - Problema nella lettura file .ini

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Pinnolo (Normal User)
Rookie


Messaggi: 28
Iscritto: 15/03/2008

Segnala al moderatore
Postato alle 16:52
Lunedì, 13/07/2009
Questo topic è stato chiuso dal moderatore

Salve a tutti, vi presento un problema che mi sta facendo davvero perdere tutti i capelli.
Utilizzo per leggere in un file .ini la seguente funzione:
Codice sorgente - presumibilmente VB.NET

  1. Public Function ReadIniData(ByVal Sezione As String, ByVal Chiave As String) As String
  2.         Dim Valore As Long
  3.         Dim RetVal As String = Space(256)
  4.         Valore = GetPrivateProfileString(Sezione, Chiave, "<Nessun valore>", RetVal, RetVal.Length, Application.StartupPath + "\Opzioni\file.ini")
  5.         ReadIniData = Trim(RetVal.ToString)
  6.     End Function


che funziona alla perfezione.... ma si presenta un problema che non riesco a spiegarmi.
Ve lo esplicito con un esempio:
Mettiamo il caso che nel file ini ci sia la sezione "[formaperti]" e una chiave "1" che ha come valore ad esempio "form2". Il file ini presenterà questa forma:
[formaperti]
1=form2
Io vorrei a questo punto che se in corrispondenza della chiave "1" c' è scritto "form2" mi deve ad esempio aprire il form2 come formfiglio.... e quindi ho scritto queste righe di codice:
Codice sorgente - presumibilmente VB.NET

  1. Dim formfiglio1 As New Form2()
  2.         If ReadIniData("formaperti", "1") = "form2" Then
  3.             formfiglio1.MdiParent = Me
  4.             formfiglio1.Show()
  5.         End If


ma stranamente non accade nulla di quanto scritto e mi apre un form (nemmeno in modalità MDI) che nessuno ha mai chiamato in causa!!!
La cosa che mi fa impazzire è che se fuori dal controllo "if" io metto un bel
Codice sorgente - presumibilmente Plain Text

  1. msgbox(ReadIniData("formaperti", "1"))

mi restituisce la stringa "form2"!!!
Come mai? Chiedo a voi aiuto, perchè sarà che non sono esperto.... ma non riesco a darmi pace.
Volevo inoltre aggiungere che ho impostato a true (ovviamente) la proprietà del form1 "ismdicontainer".


Ultima modifica effettuata da Pinnolo il 13/07/2009 alle 17:19
PM
Avatar
riseofapocalypse (Ex-Member)
Pro


Messaggi: 150
Iscritto: 08/07/2009

Segnala al moderatore
Postato alle 17:26
Lunedì, 13/07/2009
Siccome manca il metodo "GetPrivateProfileString", me lo sono creato! Tuttavia, siccome non sapevo come avevi impostato i tuoi metodi, ho modificato un po anche "ReadIniData":
Codice sorgente - presumibilmente VB.NET

  1. Function GetPrivateProfileString(ByVal sezione As String, ByVal chiave As String, ByVal percorso As String) As String
  2.         Dim s() As String = IO.File.ReadAllLines(percorso) ' Leggo tutte le righe
  3.         If s.Contains("[" & sezione & "]") Then ' Se la sezione è presente
  4.             For i As Integer = Array.IndexOf(s, "[" & sezione & "]") + 1 To s.Length - 1 ' Scorro per cercare la chiave
  5.                 If s(i).StartsWith("[") Then Exit For ' Se raggiungo un'altra sezione esco dal ciclo
  6.                 Dim r() As String = s(i).Split("=") ' Splitto la riga corrente per leggere il nome della chiave
  7.                 If r(0) = chiave Then Return r(1) ' Se la chiave corrente è la chiave che cerco la ritorno
  8.             Next
  9.         End If
  10.         Return "<Nessun valore>" ' Altrimenti ritorno questa stringa
  11.     End Function
  12.     Function ReadIniData(ByVal Sezione As String, ByVal Chiave As String) As String
  13.         Return GetPrivateProfileString(Sezione, Chiave, Application.StartupPath & "\Opzioni\file.ini").Trim
  14.     End Function


E' un po' incasinato ma funziona :k:

Ultima modifica effettuata da riseofapocalypse il 13/07/2009 alle 17:35
PM
Avatar
Pinnolo (Normal User)
Rookie


Messaggi: 28
Iscritto: 15/03/2008

Segnala al moderatore
Postato alle 17:32
Lunedì, 13/07/2009
anche se ancora non l' ho provato ti ringrazio e ti posto il mio "GetPrivateProfileString" dichiarato come Unicode per capire dove ho sbagliato....

Codice sorgente - presumibilmente VB.NET

  1. Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" _
  2.     Alias "GetPrivateProfileStringW" (ByVal lpApplicationName As String, _
  3.     ByVal lpKeyName As String, ByVal lpDefault As String, _
  4.     ByVal lpReturnedString As String, ByVal nSize As Int32, _
  5.     ByVal lpFileName As String) As Int32


PM
Avatar
riseofapocalypse (Ex-Member)
Pro


Messaggi: 150
Iscritto: 08/07/2009

Segnala al moderatore
Postato alle 17:37
Lunedì, 13/07/2009
Ah non sapevo che fosse un API di Windows! :D comunque su internet ho trovato questa dichiarazione, provala:
Codice sorgente - presumibilmente VB.NET

  1. Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, <MarshalAs(UnmanagedType.AsAny)>ByVal lpKeyName As Object, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer


:k:

PM
Avatar
Pinnolo (Normal User)
Rookie


Messaggi: 28
Iscritto: 15/03/2008

Segnala al moderatore
Postato alle 17:51
Lunedì, 13/07/2009
scusa, colpa mia :) .... avevo dimenticato di dire che era un api..
comunque sia, il problema persiste con entrambi i codici (anche quello postato da te che non sfrutta l' api)...
La cosa che non capisco è il motivo per cui mi apre un altro form senza motivo, non in modalità MDI...
per quanto riguarda la dichiarazione che hai trovato in rete mi da errore in corrispondenza di "marshalas"

Ultima modifica effettuata da Pinnolo il 13/07/2009 alle 17:53
PM
Avatar
riseofapocalypse (Ex-Member)
Pro


Messaggi: 150
Iscritto: 08/07/2009

Segnala al moderatore
Postato alle 18:00
Lunedì, 13/07/2009
Aspetta un attimo, non avevo badato ad una cosa!
Codice sorgente - presumibilmente VB.NET

  1. If ReadIniData("formaperti", "1") = "form2" Then
  2.      Form2.MdiParent = Me
  3.      Form2.Show()
  4. End If


Credo che devi fare così! :k:

P.S. A proposito, controlla la proprietà IsMDIContainer del tuo Form principale, dev'essere impostata a true :D

Ultima modifica effettuata da riseofapocalypse il 13/07/2009 alle 18:07
PM
Avatar
Pinnolo (Normal User)
Rookie


Messaggi: 28
Iscritto: 15/03/2008

Segnala al moderatore
Postato alle 18:07
Lunedì, 13/07/2009
mi dispiace averti coinvolto nel mio problema, anche perchè non vorrei far perdere capelli e neuroni anche a te :asd:, ma niente ancora... per semplificare le cose potremmo comunque lavorare con le msgbox così togliamo di mezzo i form e formMDI....
perchè anche se metto
Codice sorgente - presumibilmente C# / VB.NET

  1. If ReadIniData("formaperti", "1") = "form2" Then
  2.           msgbox("perchè non funzioni?!?")
  3.       End If


non appare una msgbox nemmeno a pagarla, eppure (ripeto) quella cacchio di form2 in corrispondeza della chiave "1" c'è scritta tant'è che se faccio
Codice sorgente - presumibilmente Plain Text

  1. msgbox(ReadIniData("formaperti", "1"))

mi restituisce la stringa "form2"

PM
Avatar
riseofapocalypse (Ex-Member)
Pro


Messaggi: 150
Iscritto: 08/07/2009

Segnala al moderatore
Postato alle 18:11
Lunedì, 13/07/2009
Ora mi sta venendo un dubbio, può darsi che sia la Trim che sta funzionando male e quindi non rimuove gli spazi bianchi! Prova a impostare l'IF così:
Codice sorgente - presumibilmente C# / VB.NET

  1. If ReadIniData("formaperti", "1").StartsWith("form2") Then


Oppure così:
Codice sorgente - presumibilmente C# / VB.NET

  1. If ReadIniData("formaperti", "1").Contains("form2") Then


Se la Trim non sta funzionando, la aggiriamo così :rotfl:

PM
Avatar
Pinnolo (Normal User)
Rookie


Messaggi: 28
Iscritto: 15/03/2008

Segnala al moderatore
Postato alle 18:19
Lunedì, 13/07/2009
sto piangendo.... niente ancora.... comunque sono riuscito a correggere l' errore che mi apriva costantemente una form anche se non era chiamata in causa... ma persiste questo maledetto problema

PM
Pagine: [ 1 2 ] Precedente | Prossimo