Tiedän ettette millään kirveellä opettaisi laistani joka ei itse oppinut asioita, joten en pyydä sitä. Tarvitsen ohjelman joka lukee ini-tiedoston tietoonsa, etsii tiettyä tietoa ja muuttaa sen.
Itse tekisin graafisen puolen niin helposti että
1) valitaan luettava tiedosto valintaikkunalla
2) kysytään inputboxilla mitä haetaan
3) kysytään inputboxilla mihin muutetaan
4) kirjoitetaan kaikki takaisin luettavaan tiedostoon
Kyllä ainakin itse mieluummin opetan kuin annan valmista ohjelmaa.
Oppimisessa pitäisi olla enemmän kyse sinusta itsestäsi kuin meistä muista. Valmista opiskelumateriaalia on netti pullollaan.
MORO rautamiekka!
tässä sulle simppeliä valmispaskaa...
Sub Form_Load() NaytaTaiPiilota_Kontrollit End Sub Private Sub Command1_Click() If Command1.Caption = "TIEDOT?" Then NaytaTaiPiilota_Kontrollit Command1.Caption = "PÄIVITÄ" Command1.Enabled = False Exit Sub End If With CommonDialog1 .CancelError = True .Action = 1 .DialogTitle = "Avaa tiedosto" .FileName = "" .Filter = "Asetustiedostot (*.ini)|*.ini" .InitDir = App.Path .ShowOpen If Dir(.Filename) = "" Then NaytaTaiPiilota_Kontrollit: Exit Sub End If End With Dim filuStr As String On Error Resume Next Open CommonDialog1.FileName For Input As #1 filuStr = Input$(LOF(1),1): Close #1 If InStr(filuStr, Text1.Text) = 0 Then xmsg& = MsgBox(Tiedosto:" & CommonDialog1.FileName _ & " ei sisällä tälaista tietoa!", vbYesNo, "Tahdotko jatkaa?") Select Case xmsg& Case 1 Text1.Text = "": Text2.Text = "" Case Else filuStr = "": apuStr = "" NaytaTaiPiilota_Kontrollit End Select Exit Sub End If Dim alku As integer, apuStr As String, i As Integer alku = InStr(filuStr, Text1.Text) For i = alku To Len(filuStr) If Mid(filuStr, i, 1) = Chr(13) Then Exit For apuStr = apuStr & Mid(filuStr, i, 1) Next i filuStr = Replace(filuStr, apuStr, Text2.Text) Open CommonDialog1.FileName For Output AS #1 Print #1, filuStr: Close #1 MsgBox " Tiedosto " & _ CommonDialog1.FileName & " on päivitetty" filuStr = "": apuStr = "" NaytaTaiPiilota_Kontrollit End Sub Private Sub Text1_Change() TsekkaaBoxienTila End Sub Private Sub Text2_Change() TsekkaaBoxienTila End Sub Private Sub TsekkaaBoxienTila() If Text1.Text = "" Or Text2.Text = "" Then Command1.Enabled = False ElseIf Text1.Text <> "" And Text2.Text <> "" Then Command1.Enabled = True End If End Sub Private Sub NaytaTaiPiilota_Kontrollit() Dim i As Integer For i = 1 To 2 With Me.Controls("Text" & CStr(i)) .Text = "" .Enabled = Not .Enabled .Visible = Not .Visible End With Next i If Command1.Caption <> "TIEDOT?" Then Command1.Caption = "TIEDOT?" Command1.Enabled = True End If End Sub
Kiitokset koodista Nea :) Siinä kuitenkin on monta virhettä, enkä tiedä pitäisikö listata ne vai jättää listaamatta.
MORO rautamiekka!
Olen poistanut VB6:n koneeltani, joten en voinut testata...tässä kuitenkin testattu VBA-versio
(vain malli tiedoston merkkijonon manipuloimisesta)
testi.ini:
asetus1 = 12345 asetus2 = 67890 asetus3 = "jotain tekstiä" asetus4 = "jotain muuta tekstiä" asetus5 = "jotain muuta tekstiä" asetus6 = &H0C asetus7 = #FFFFFF#
VBA Projekti
UserForm1:
Sub UserForm_Activate() Static loaded As Boolean If Not loaded Then loaded = True NaytaTaiPiilota_Kontrollit End If End Sub Private Sub CommandButton1_Click() If CommandButton1.Caption = "TIEDOT?" Then NaytaTaiPiilota_Kontrollit CommandButton1.Caption = "TIEDOSTO" CommandButton1.Enabled = False Exit Sub End If Dim FileName As String With Application.FileDialog(msoFileDialogOpen) .Title = "Avaa tiedosto" .AllowMultiSelect = False .Filters.Clear .Filters.Add "Asetustiedostot (*.ini)", "*.ini" .FilterIndex = 1 .Show If .SelectedItems.Count = 0 Then NaytaTaiPiilota_Kontrollit Exit Sub End If FileName = .SelectedItems(1) End With Dim filuStr As String Dim apuStr As String On Error Resume Next Open FileName For Input As #1 filuStr = Input$(LOF(1), 1): Close #1 If InStr(filuStr, TextBox1.Text) = 0 Then xmsg& = MsgBox("Tiedosto:" & _ CommonDialog1.FileName _ & " ei sisällä tälaista tietoa!", _ vbYesNo, "Tahdotko jatkaa?") Select Case xmsg& Case 1 TextBox1.Text = "": TextBox2.Text = "" Case Else filuStr = "": apuStr = "" NaytaTaiPiilota_Kontrollit End Select Exit Sub End If Dim alku As Integer, i As Integer alku = InStr(filuStr, TextBox1.Text) For i = alku To Len(filuStr) If Mid(filuStr, i, 1) = Chr(13) Then Exit For apuStr = apuStr & Mid(filuStr, i, 1) Next i MsgBox apuStr filuStr = Replace(filuStr, apuStr, TextBox2.Text) Open FileName For Output As #1 Print #1, filuStr: Close #1 MsgBox " Tiedosto " & _ FileName & " on päivitetty" filuStr = "": apuStr = "" NaytaTaiPiilota_Kontrollit End Sub Private Sub TextBox1_Change() TsekkaaBoxienTila End Sub Private Sub TextBox2_Change() TsekkaaBoxienTila End Sub Private Sub TsekkaaBoxienTila() If TextBox1.Text = "" Or TextBox2.Text = "" Then CommandButton1.Enabled = False ElseIf TextBox1.Text <> "" And TextBox2.Text <> "" Then CommandButton1.Enabled = True End If End Sub Private Sub NaytaTaiPiilota_Kontrollit() Dim i As Integer For i = 1 To 2 With Me.Controls("TextBox" & CStr(i)) .Text = "" .Enabled = Not .Enabled .Visible = Not .Visible End With Next i If CommandButton1.Caption <> "TIEDOT?" Then CommandButton1.Caption = "TIEDOT?" CommandButton1.Enabled = True End If End Sub
Testaus:
1 copy/pasteta testi-matsku muistioon ja tallenna esim. nimellä:
testi.ini
2 klikkaa Komentopainiketta
3 kirjoita TextBox1:een esim.
asetus2
4 kirjoita TextBox2:een
asetus2 = 100001
5 klikkaa uudestaan Komentopainiketta
6 etsi ja valitse dialogilla tallentamasi .ini-tiedosto...
7 avaa .ini tiedosto muistiolla ja tsekkaa tapahtuiko mitään...
Jos ei ole pakottavaa tarvetta omalle ohjelmalle tai graafiselle käyttöliittymälle, niin tuollaisiin on näppärä käyttää AWK:ta.
MORJENS taas rautamiekka!
tässä hieman edellistä edistyneempi härpäke .ini tiedoston käpistelyyn...
Testi asetustiedosto: (test.ini)
[settings1] setting1 = 00000 setting2 = 67890 [settings2] setting1 = "ABCDE" setting2 = "EFGHI" [settings3] setting1 = &H0C setting2 = &FF [settings4] setting1 = #111111# setting2 = #222222#
VBA projekti (INI_EDIT.xls)
UserForm1:
' Formille: ' 1 tekstiloota - (TextBox1) ' 2 nappia - (CommndButton1 & CommndButton2) ' 2 comboboxia - (ComboBox1 & ComboBox2) Dim FileStr As String Dim FileStrArray() As String Dim CboStrArray() As String Dim cbo1Index As Integer Dim cbo2Index As Integer Dim FileName As String Private Sub UserForm_Activate() Static loaded As Boolean If Not loaded Then loaded = True ComboBox1.Style = fmStyleDropDownList ComboBox2.Style = fmStyleDropDownList ComboBox1.Visible = False ComboBox2.Visible = False TextBox1.Visible = False CommandButton2.Visible = False End If End Sub Private Sub ComboBox1_Change() TextBox1.Text = "" ComboBox2.ListIndex = -1 If ComboBox1.ListIndex > -1 Then cbo1Index = ComboBox1.ListIndex ComboBox2.Visible = True Dim list() As String list = Split(CboStrArray(cbo1Index), "|") ComboBox2.list = list Else TextBox1.Visible = False ComboBox2.Clear ComboBox2.Visible = Flase End If End Sub Private Sub ComboBox2_Change() TextBox1.Text = "" If ComboBox2.ListIndex > -1 Then cbo2Index = ComboBox2.ListIndex TextBox1.Visible = True Else TextBox1.Visible = False End If End Sub Private Sub CommandButton1_Click() FileName = "" With Application.FileDialog(msoFileDialogOpen) .Title = "Avaa tiedosto" .AllowMultiSelect = False .Filters.Clear .Filters.Add "Asetustiedostot (*.ini)", "*.ini" .FilterIndex = 1 .Show If .SelectedItems.count = 0 Then Exit Sub End If FileName = .SelectedItems(1) End With Open FileName For Input As #1 FileStr = Input$(LOF(1), 1): Close #1 Erase CboStrArray If InStr(FileStr, "]") = 0 Then FileStr = "" MsgBox "Asetustiedoston muoto on viheellinen", _ vbExclamation, "Error Message" Exit Sub End If FileStr = Replace(FileStr, vbCrl & vbCrLf, vbCrLf) If Left(FileStr, 2) = vbCrLf Then FileStr = Right(FileStr, Len(FileStr) - 2) End If FileStrArray = Split(FileStr, vbCrLf) FileStr = "" Dim arrayLen As Long arrayLen = UBound(FileStrArray) ComboBox1.Clear ComboBox2.Clear ComboBox1.Visible = True For i = LBound(FileStrArray) To arrayLen If InStr(FileStrArray(i), "[") > 0 Then ComboBox1.AddItem Replace(Replace( _ FileStrArray(i), "[", ""), "]", "") Dim ChkArray As Long On Error Resume Next ChkArray = UBound(CboStrArray) If Err <> 0 Then Err.Clear On Error GoTo 0 ReDim CboStrArray(0) Else ReDim Preserve CboStrArray(UBound(CboStrArray) + 1) End If For j = i + 1 To arrayLen If InStr(FileStrArray(j), "[") > 0 Then Exit For If CboStrArray(UBound(CboStrArray)) <> "" Then CboStrArray(UBound(CboStrArray)) = _ CboStrArray(UBound(CboStrArray)) & "|" End If CboStrArray(UBound(CboStrArray)) = _ CboStrArray(UBound(CboStrArray)) & FileStrArray(j) Next j End If Next i Erase FileStrArray End Sub Private Sub TextBox1_Change() If TextBox1.Text <> "" Then CommandButton2.Visible = True Else CommandButton2.Visible = False End If End Sub Private Sub CommandButton2_Click() If TextBox1.Text <> "" Then CboStrArray(cbo1Index) = _ Replace(CboStrArray(cbo1Index), _ ComboBox2.list(cbo2Index), TextBox1.Text) Dim i As Long For i = 0 To ComboBox1.ListCount - 1 FileStr = FileStr & _ "[" & ComboBox1.list(i) & "]" & _ vbCrLf & Replace( _ CboStrArray(i), "|", vbCrLf) _ & vbCrLf Next i Open FileName For Output As #1 Print #1, FileStr Close #1: FileStr = "": TextBox1.Text = "" ComboBox2.Clear: ComboBox1.ListIndex = -1 cbo1Index = -1: cbo2Index = -1 End If End Sub
Edelliseen postiini viitaten, AWK:n avulla esim. näin helposti:
testi.ini
arvo1 = true arvo2 = false arvo3 = true
Jos haluaisin muuttaa arvo2:n false arvosta true:
komentoriviltä:
cat testi.ini | awk '/arvo2/ { gsub(/false/, "true") }; { print }' >muokattu.ini
Aihe on jo aika vanha, joten et voi enää vastata siihen.