Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
13/07/09 14:52
Pinnolo
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:
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:
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
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 13/07/09 15:19
aaa
13/07/09 15:26
riseofapocalypse
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":
    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 :k:
Ultima modifica effettuata da riseofapocalypse 13/07/09 15:35
aaa
13/07/09 15:32
Pinnolo
anche se ancora non l' ho provato ti ringrazio e ti posto il mio "GetPrivateProfileString" dichiarato come Unicode per capire dove ho sbagliato....

 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
aaa
13/07/09 15:37
riseofapocalypse
Ah non sapevo che fosse un API di Windows! :D comunque su internet ho trovato questa dichiarazione, provala:
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:
aaa
13/07/09 15:51
Pinnolo
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 13/07/09 15:53
aaa
13/07/09 16:00
riseofapocalypse
Aspetta un attimo, non avevo badato ad una cosa!
If ReadIniData("formaperti", "1") = "form2" Then
     Form2.MdiParent = Me
     Form2.Show()
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 13/07/09 16:07
aaa
13/07/09 16:07
Pinnolo
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
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
msgbox(ReadIniData("formaperti", "1"))
mi restituisce la stringa "form2"
aaa
13/07/09 16:11
riseofapocalypse
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ì:
If ReadIniData("formaperti", "1").StartsWith("form2") Then

Oppure così:
If ReadIniData("formaperti", "1").Contains("form2") Then

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