VBA ini to array

Programovacie jazyky, rady, poradňa...
Runes
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4832
Registrovaný: 09 aug 2006, 13:03
Bydlisko: Bratislava - Tatoine
Kontaktovať používateľa:

VBA ini to array

Príspevok od používateľa Runes »

Chlopi troska hlupa uloha ale neviem ju spravit, chcem nacitat celu sekciu z ini do pola teda kazdy prvok samostatne pole. Z ini sa natahuje daco ako slovnik, zariadenie posiela skratky a v inicku su ku kazdej skratke priradene nazvy, chcem to spravit tak aby mohol byt ten slovnik nekonecne velky a hlavne lahko variabilny pre usera, ze by nacital celu sekciu po riadkoch s ini fileu vytvorilo by sa pole a potom to pole bude program preberat po jednom a hladat ten konkretny vyraz. Spravil som to tak ze nacitam to ini do textu a ten som naparsoval po riadkoch ale to je skarede a chcem to zmenit tak ze do arrayu naseka len tu cast ktoru ma aby zbytocne nepamatal hluposti. Teda tuna v prilohe je to este predosla verzia kde to je total hlupe a pri kazdej hodnote nanovo otvara to ini :D

btw takto dako vyzera ten slovnik
[Translate]
CI = Kruh
CY = Valec
PL = Rovina
PT = Bod
SP = Guľa
LN = Vektor
UNK1 = Vztah
UNK2 = Neznámy


Kód: Vybrať všetko

Function ChangeVal(search As String) As String

    Dim iFNum As Integer
    Dim iniPath As String
    iniPath = ThisWorkbook.Path & "\settings.ini"
    Dim sBuf As String
    iFNum = FreeFile()
    If Dir(iniPath) <> "" Then  'ak existuje cesta k suboru pokracuj
        Open iniPath For Input As iFNum
    
        Do While Not EOF(iFNum)  'pokracuj po koniec suboru
        Line Input #iFNum, sBuf 'nacitaj riadok
            If Left(sBuf, Len(search)) = search Then  'ak sa lava strana dlzkou a obsahom zhoduje s hladanou tak pokracuj
                ChangeVal = Right(sBuf, (Len(sBuf) - (Len(search) + 3))) ' odpocita hladanu zlozku medzeru rovna sa medzera a nahradi nou string
            End If
        Loop
        Close iFNum
    Else
    End If
    
    If ChangeVal = "" Then
        ChangeVal = "unknown"
    End If
End Function
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: VBA ini to array

Príspevok od používateľa metthal »

Len tak preistotu sa spytam, preco je nutne posielat retazec? Retazec je snad jeden z najhorsich sposobov identifikacie hocicoho v navrhu programu. Skus to zmenit na obycajne cisla 0, 1, 2 atd pricom kazde cislo (identifikator) bude mat prideleny retazec (0 - Kruh, 1 - Valec atd). To len nahadzes do pola na konkretne indexy a vies sa k tomu jednoducho dostat.

Ak to vsak nie je mozne a ty uz programujes podporu pre nieco hotove, tak osobne by som zvolil pristup cez Dictionary kde kluc by bol ten tvoj skrateny retazec (osobne som sa s VB.NET v zivote nestretol ale tipujem ze take nieco bude tento jazyk bude obsahovat vzhladom na .NET framework).
Runes
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4832
Registrovaný: 09 aug 2006, 13:03
Bydlisko: Bratislava - Tatoine
Kontaktovať používateľa:

Re: VBA ini to array

Príspevok od používateľa Runes »

:D no ja som dostal program na testing a toto tam malo byt hotove, nakolko clovek co to robil uz nato nema cas tak to mam prerobit :D
A neviem ci sa chapeme ale ide oto ze je zariadenie dake meracie ktore posiela data skratka+hodnota a cez serialovu linku to tento excel zapisuje a vyhodnocuje. Pricom v logu pise co zaznamenal a aby clovek nevidel divne znacky tak rovno to prepisuje do ludskej reci
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: VBA ini to array

Príspevok od používateľa audiotrack »

Kód: Vybrať všetko

Private Sub ListIniSectionLines()

    Dim pole As Array
    Dim strTempArray As Array
    
    Dim S As String: S = ReadIniSection(ThisWorkbook.Path & "\settings.ini")
    Dim vLines As Variant: vLines = Split(S, Chr$(0))
    Dim vLine As Variant

    For Each vLine In vLines
       If Mid(vLine, 1, 1) <> "[" Then 
           strTempArray = Split(vLine, "=")
           pole(strTempArray(0)) = strTempArray(1)
       End If
    Next vLine
End Sub
Nepamätám si už či vie VB robiť s asociatívnym poľom, ak nie tak si prerob to pole na objekt, nejako takto:

Kód: Vybrať všetko

Type iniNode
   Text As String
   Value As String
End Type
Public pole() As iniNode
a potom v tom cykle namiesto

Kód: Vybrať všetko

pole(strTempArray(0)) = strTempArray(1)
bude toto

Kód: Vybrať všetko

pole(i).Text = strTempArray(0)
pole(i).Value = strTempArray(1)
a i bude klasický integer ktorý pred cyklom nastavíš na nulu, a na konci cyklu zvýšiš o jedna
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: VBA ini to array

Príspevok od používateľa metthal »

Tak v tom pripade moznost c.2 a to pouzit Dictionary<String, String> a nacitat obsah pri starte. Na sledovanie runtime zmien by som ti ak je to C poradil select() ale urcite nieco vygooglis. Btw ono je to seriova nie serialova linka. :D
Runes
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4832
Registrovaný: 09 aug 2006, 13:03
Bydlisko: Bratislava - Tatoine
Kontaktovať používateľa:

Re: VBA ini to array

Príspevok od používateľa Runes »

Tak nakoniec som to googlenim poriesil, milion funkcii na nacitavanie INI a potom len mnou spominane po celnoch do arraryu :) ted to len natlacit do toho debilneho programu :D BTW VBA nieje zrovna jazyk s ktorym robim denne ale len tak informacne v jadre programu vytvorim to blbe pole a potom ho chcem pouzit vo sube on sa vie k nemu dostat alebo ho tam musim dako pretlacit lebo zosrandy v tom sube kde ho budem potrebovat dam debug.print pole(3) nech vypise 4teho clena a povie mi ze neznama funkcia :D

EDIT : // dal som to do globalov ale stale nechapem jedno pole ma stale problem druhe je ok :/
EDIT2: // asi nebolo mudre nazvat to druhe pole Controls :D asi to patri dacomu v jazyku ked som ho premenoval na Controles tak ide aj to :)
juch uz len nahradit kolegovu funkciu mojou a hodinova praca zdolana za den :D
Napísať odpoveď