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 SubKiitokset 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 SubTestaus:
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 SubEdelliseen 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.iniAihe on jo aika vanha, joten et voi enää vastata siihen.