![Avatar](/data/images/profiles/users/Pinnolo_societa.png)
Pinnolo (Normal User)
Rookie
![](/data/images/stars/yellow.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 28
Iscritto: 15/03/2008
|
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 |
Public Function ReadIniData(ByVal Sezione As String, ByVal Chiave As String) As String Dim Valore As Long Dim RetVal As String = Space(256) Valore = GetPrivateProfileString(Sezione, Chiave, "<Nessun valore>", RetVal, RetVal.Length, Application.StartupPath + "\Opzioni\file.ini") ReadIniData = Trim(RetVal.ToString) 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 |
Dim formfiglio1 As New Form2() If ReadIniData("formaperti", "1") = "form2" Then formfiglio1.MdiParent = Me formfiglio1.Show() 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 |
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 |
|
![Avatar](/data/images/profiles/users/riseofapocalypse_avatarpierotofy.png)
riseofapocalypse (Ex-Member)
Pro
![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 150
Iscritto: 08/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 |
Function GetPrivateProfileString(ByVal sezione As String, ByVal chiave As String, ByVal percorso As String) As String Dim s () As String = IO. File. ReadAllLines(percorso ) ' Leggo tutte le righe If s.Contains("[" & sezione & "]") Then ' Se la sezione è presente For i As Integer = Array.IndexOf(s, "[" & sezione & "]") + 1 To s.Length - 1 ' Scorro per cercare la chiave If s(i).StartsWith("[") Then Exit For ' Se raggiungo un'altra sezione esco dal ciclo Dim r() As String = s(i).Split("=") ' Splitto la riga corrente per leggere il nome della chiave If r(0) = chiave Then Return r(1) ' Se la chiave corrente è la chiave che cerco la ritorno Next End If Return "<Nessun valore>" ' Altrimenti ritorno questa stringa End Function Function ReadIniData(ByVal Sezione As String, ByVal Chiave As String) As String Return GetPrivateProfileString(Sezione, Chiave, Application.StartupPath & "\Opzioni\file.ini").Trim End Function
|
E' un po' incasinato ma funziona
Ultima modifica effettuata da riseofapocalypse il 13/07/2009 alle 17:35 |
|
![Avatar](/data/images/profiles/users/Pinnolo_societa.png)
Pinnolo (Normal User)
Rookie
![](/data/images/stars/yellow.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 28
Iscritto: 15/03/2008
|
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 |
Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" _ Alias "GetPrivateProfileStringW" (ByVal lpApplicationName As String, _ ByVal lpKeyName As String, ByVal lpDefault As String, _ ByVal lpReturnedString As String, ByVal nSize As Int32, _ ByVal lpFileName As String) As Int32
|
|
|
![Avatar](/data/images/profiles/users/riseofapocalypse_avatarpierotofy.png)
riseofapocalypse (Ex-Member)
Pro
![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 150
Iscritto: 08/07/2009
|
Ah non sapevo che fosse un API di Windows! comunque su internet ho trovato questa dichiarazione, provala:
Codice sorgente - presumibilmente VB.NET |
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
|
|
|
![Avatar](/data/images/profiles/users/Pinnolo_societa.png)
Pinnolo (Normal User)
Rookie
![](/data/images/stars/yellow.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 28
Iscritto: 15/03/2008
|
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 |
|
![Avatar](/data/images/profiles/users/riseofapocalypse_avatarpierotofy.png)
riseofapocalypse (Ex-Member)
Pro
![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 150
Iscritto: 08/07/2009
|
Aspetta un attimo, non avevo badato ad una cosa!
Codice sorgente - presumibilmente VB.NET |
If ReadIniData("formaperti", "1") = "form2" Then Form2.MdiParent = Me Form2.Show() End If
|
Credo che devi fare così!
P.S. A proposito, controlla la proprietà IsMDIContainer del tuo Form principale, dev'essere impostata a true
Ultima modifica effettuata da riseofapocalypse il 13/07/2009 alle 18:07 |
|
![Avatar](/data/images/profiles/users/Pinnolo_societa.png)
Pinnolo (Normal User)
Rookie
![](/data/images/stars/yellow.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 28
Iscritto: 15/03/2008
|
mi dispiace averti coinvolto nel mio problema, anche perchè non vorrei far perdere capelli e neuroni anche a te , 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 |
If ReadIniData("formaperti", "1") = "form2" Then
msgbox("perchè non funzioni?!?")
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 |
msgbox(ReadIniData("formaperti", "1"))
|
mi restituisce la stringa "form2" |
|
![Avatar](/data/images/profiles/users/riseofapocalypse_avatarpierotofy.png)
riseofapocalypse (Ex-Member)
Pro
![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 150
Iscritto: 08/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 |
If ReadIniData("formaperti", "1").StartsWith("form2") Then
|
Oppure così:
Codice sorgente - presumibilmente C# / VB.NET |
If ReadIniData("formaperti", "1").Contains("form2") Then
|
Se la Trim non sta funzionando, la aggiriamo così |
|
![Avatar](/data/images/profiles/users/Pinnolo_societa.png)
Pinnolo (Normal User)
Rookie
![](/data/images/stars/yellow.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 28
Iscritto: 15/03/2008
|
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
|
|