Команды из файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Команды из файла

Сообщение Конь » 02.06.2006 (Пт) 6:56

Есть такая проблема. Полностью ситуацию расписывать не буду, пример:

Есть файл, содержащий текст:
Код: Выделить всё
Var1 = "v1"
Var2 = "v2"


Как эти значения присвоить переменным Var1 и Var2?
(Или как выполнить эти команды?)

Пробовал через ScriptControl, но он на такое не рассчитан...
Подпись находится в стадии разработки...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.06.2006 (Пт) 7:04

1. Объявить переменные Var1 и Var2
2. Открыть файл
3. Считать эти строки
4. Выделить из строк нужные значения
5. Присвоить значения переменным
6. Закрыть файл


:D альтернативное решение:

Код: Выделить всё
Dim Var1 As String
Dim Var2 As String

Var1 = "v1"
Var2 = "v2"
Весь мир матрица, а мы в нем потоки байтов!

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 02.06.2006 (Пт) 10:18

4. Выделить из строк нужные значения

А это можно поподробнее?

Альтернативное решение не подойдет, т.к. файл может быть изменен:)

Я просто новичок в VB (самоучка:)), сделал одну несерьезную игрушку. А с "загрузкой игры" произошла вот такая запарочка...

Код: Выделить всё
'Это содержимое файла:)
'Вернее, расшифрованное содержимое файла, оно у меня шифруется:)

StartNote = 4
GHour = 14
GDay = 1
GMon = 1
GYear = 2006
Score = 125
Money = "884900"
Status = 2
Work = 0
WorkX = 0
Nastr = 4
SysCase = True
MB = True
Proc = 19
RAM = 3
BP = True
VCard = 0
HD = 0
Monitor = 0
SCard = 0
Stereo = False
CDDVD = 0
KB = False
Mouse = 0
Modem = 0
Printer = 0
Scanner = False
IBP = False
CompWork = False
IntWork = False
InstList = ""
SoftList = ""
OS = 0
PName = "Дмитрий"
MonMoney = 0
IntTime = ""
Подпись находится в стадии разработки...

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 02.06.2006 (Пт) 10:34

Конь писал(а):StartNote = 4
GHour = 14
GDay = 1
GMon = 1
GYear = 2006
...

По-моему, обычный файл настроек, кол-во конечно, объявляй переменные
ЗЫ: а игра не в "апгрейд" случайно? :)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.06.2006 (Пт) 10:46

Делить считанную строку методом Split, используя в качестве разделителя "=". Примерно так:

Dim sPair() As String
sPair = Split(s, "=")

После этого у тебя в sPair(0) будет имя параметра, а в sPair(1) его значение. Остается удалить лишние пробелы методом Trim$, преобразовать в нужный тип (если значение не строковое) и присвоить нужной переменоой
Весь мир матрица, а мы в нем потоки байтов!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.06.2006 (Пт) 10:57

А если использовать javascript, то еще проще - в начало каждой строки добавить "var ", а в конец ";". Одной командой :wink:
Код: Выделить всё
s = "var " & Replace(s, vbcrlf,";" & vbcrlf & "var ") & ";"
Лучший способ понять что-то самому — объяснить это другому.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 02.06.2006 (Пт) 11:26

А не легче ли просто завести ини-файл?
Если всё делать своими ручками, они скоро отвалятся !

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 02.06.2006 (Пт) 16:23

Ну спасибо за Split!

ЗЫ: а игра не в "апгрейд" случайно?

Это как тебя понимать?
Может тебе дать игру саму поюзать (после создания)?
Подпись находится в стадии разработки...

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 02.06.2006 (Пт) 17:49

Конь, Все же лучше INI
Пора уже всем хорошим людям собраться и убить всех плохих людей.

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 02.06.2006 (Пт) 18:45

Я не умею с ИНИ работать:(
Может научите?

ЗЫ этот код был для VB6? У меня VB5, а там по ходу нету этого Split...
Подпись находится в стадии разработки...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.06.2006 (Пт) 23:23

Вот, когдя я только научился работать в VB, я ещё не знал что такое API функция, но уже пытался писать свою операционку, поэтому мне же как то надо было работать с INI файлами вот я и написал свой модуль.

Огромная просьба: не смеяться над кодом, я тогда мало чё понимал в том что пишу :lol:
Вложения
Environment.rar
(1.86 Кб) Скачиваний: 46
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Memfivosfey
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 17.02.2005 (Чт) 14:55

Сообщение Memfivosfey » 02.06.2006 (Пт) 23:27

Public Function SaveKeyToIni(ByVal Path As String, ByVal Section As String, ByVal Key As String, ByVal Parameter As String)
Dim StartSection As Long
Dim StartKey As Long

StartSection = FindStringInFile(Path, 1, "[" & Section & "]", False)
'Stop
If StartSection = 0 Then
Open Path For Append As #1
If LOF(1) > 0 Then Print #1, ""
Print #1, "[" & Section & "]"
Print #1, Key & "=" & Parameter
Close #1
Else
StartKey = FindStringInFile(Path, StartSection, Key, False)
Dim tmpPath As String
Dim I As Integer
Dim J As Integer
Dim rByte As Byte
Dim wByte As Byte

'tmpPath = "C:\Documents and Settings\Nickon\Ðàáî÷èé ñòîë\" & "tmp_ini.tmp"
FileCopy Path, Environ("Temp") & "\" & "tmp_ini.tmp"
Open Path For Output As #2
Close #2
Open Environ("Temp") & "\" & "tmp_ini.tmp" For Binary As #1
Open Path For Binary As #2
If StartKey = 0 Then
For I = 1 To LOF(1)
Seek 1, I
Get #1, , rByte
Put #2, , rByte

If I = StartSection + Len("[" & Section & "]") - 1 Then
wByte = 13: Put #2, , wByte
wByte = 10: Put #2, , wByte
For J = 1 To Len(Key)
wByte = Asc(Mid(Key, J, 1))
Put #2, , wByte
Next J
wByte = Asc("="): Put #2, , wByte
For J = 1 To Len(Parameter)
wByte = Asc(Mid(Parameter, J, 1))
Put #2, , wByte
Next J
Seek 1, I + 1
Get #1, , rByte
If rByte <> 13 Then
wByte = 13: Put #2, , wByte
wByte = 10: Put #2, , wByte
End If
End If
Next I
Else
For I = 1 To LOF(1)
Seek 1, I
Get #1, , rByte
Put #2, , rByte
If I = StartKey + Len(Key) Then
For J = 1 To Len(Parameter)
wByte = Asc(Mid(Parameter, J, 1))
Put #2, , wByte
Next J
' Stop
For J = 1 To LOF(1) - Loc(2) + Len(Parameter)
Seek 1, I + J
Get #1, , rByte
If rByte = 13 Then I = I + J - 1: Exit For
Next J
End If
Next I
End If
Close #2
Close #1
Kill Environ("Temp") & "\" & "tmp_ini.tmp"
End If

End Function

Public Function LoadKeyFromIni(Path As String, Section As String, Key As String) As String
Dim I As Integer
Dim rByte As Byte
Dim rString As String
Dim StartSection As Long
Dim StartKey As Long


StartSection = FindStringInFile(Path, 1, Section, False)
StartKey = FindStringInFile(Path, StartSection, Key, False)
Open Path For Binary As #1
For I = 1 To LOF(1)
Seek 1, StartKey + I + Len(Key)
Get #1, , rByte
If rByte = 13 Then LoadKeyFromIni = rString: Exit For
rString = rString + Chr(rByte)
Next I
Close #1
End Function

Public Function FindStringInFile(Path As String, Start As Long, FindString As String, FindAllSections As Boolean) As Long
Dim I As Integer
Dim J As Integer
Dim rString As String
Dim rByte As Byte
Dim StartSection As Boolean

Open Path For Binary As #1
For I = Start To LOF(1) - 1
Seek 1, I
Get #1, , rByte
'Debug.Print Chr(rByte);
If StartSection = False And rByte = Asc("[") Then
StartSection = True
ElseIf StartSection = True And rByte = Asc("[") Then
'If FindAllSections = False Then
FindStringInFile = I
Exit For
'End If
End If
If rByte = Asc(Left(FindString, 1)) Then
rString = ""
For J = 0 To Len(FindString) - 1
Seek 1, I + J
Get #1, , rByte
rString = rString + Chr(rByte)
Next J
If UCase(rString) = UCase(FindString) Then FindStringInFile = I: Exit For Else FindStringInFile = 0
End If
Next I
Close #1
End Function



Пихни это дело в модуль

и используй команды

SaveKeyToIni "C:\proba.ini","Common", "Var1", Var1
Var1 = LoadKeyFromIni ("C:\proba.ini","Common", "Var1")

Я его не доработал до конца, но у меня работает и я использую))
В программировании нет не решаемых проблемм, есть проблеммы на которые
мы не можем найти решение...

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 03.06.2006 (Сб) 1:58

2Memfivosfey Зачем велик?

2Bethrezen Будь ближе к людям (всмысле к новичкам)

Код: Выделить всё
'declares for ini controlling
Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

'// INI CONTROLLING PROCEDURES
'reads ini string
Public Function ReadIni(Filename As String, Section As String, Key As String) As String
Dim RetVal As String * 512, v As Long
v = GetPrivateProfileString(Section, Key, "", RetVal, 512, Filename)
ReadIni = Left(RetVal, v)
End Function

'reads ini section
Public Function ReadIniSection(Filename As String, Section As String) As String
Dim RetVal As String * 512, v As Long
v = GetPrivateProfileSection(Section, RetVal, 512, Filename)
ReadIniSection = Left(RetVal, v)
End Function

'writes ini
Public Sub WriteIni(Filename As String, Section As String, Key As String, Value As String)
WritePrivateProfileString Section, Key, Value, Filename
End Sub

'writes ini section
Public Sub WriteIniSection(Filename As String, Section As String, Value As String)
WritePrivateProfileSection Section, Value, Filename
End Sub
Пора уже всем хорошим людям собраться и убить всех плохих людей.

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 03.06.2006 (Сб) 8:12

Всем огромное спасибо!
Конечно, второй код мне понравился немножко больше:)
Подпись находится в стадии разработки...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.06.2006 (Сб) 9:35

видимо никто не хочет смеяться над кодом?
Весь мир матрица, а мы в нем потоки байтов!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.06.2006 (Сб) 18:05

Ладно, разрешаю над кодом смеяться :lol:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 03.06.2006 (Сб) 20:14

Еще есть готовый класс для работы с INI. Очень простой в использовании.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 05.06.2006 (Пн) 11:46

Еще раз всем огромное спасибо!

Да, и еще один вопрос, правда, не совсем по теме.

Например, у меня есть код:
Dim Var As String
Var = "vv" & vbCrLf & "gg" & vbCrLf & "bb"

И еще есть ListBox lstVar.

Как сделать, чтобы lstVar содержал в себе:
vv
gg
bb?
Подпись находится в стадии разработки...

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 05.06.2006 (Пн) 11:50

GB826
Я взял только WritePrivateProfileSection и GetPrivateProfileString, больше мне не понадобилось:)
Подпись находится в стадии разработки...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.06.2006 (Пн) 11:54

Код: Выделить всё
Private Function AddItem(Var As String) As Boolean
    Dim arrvar() As String
    Dim nCount As Integer
   
    If Len(Var) = 0 Then Exit Function
    arrvar = Split(Var, vbNewLine)
   
    For nCount = 0 To UBound(arrvar)
        listVar.AddItem arrvar(nCount)
    Next nCount
   
    AddItem = True
End Function
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.06.2006 (Пн) 12:00

vvs_adm,
а зачем [If Len(Var) = 0 Then Exit Function]
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.06.2006 (Пн) 12:02

Хакер Что бы не делать лишний телодвижений... Не вызывать Split например :) Вообще дело вкуса. Для данных целей наверное вполне достаточно Sub вместо Function
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 05.06.2006 (Пн) 12:11

И еще объясните, пожалуйста, что значит "Dim RetVal As String * 512"?
Никогда не вставляю код, предварительно не разобравшись, что же он значит:)
Подпись находится в стадии разработки...

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 05.06.2006 (Пн) 12:13

Конь, строка ограниченной длины ;о)

vvs_adm, а если var=" "
Пора уже всем хорошим людям собраться и убить всех плохих людей.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.06.2006 (Пн) 12:17

GB826 писал(а):vvs_adm, а если var=" "
Ну значит и добавится такая вот фигня в лист...
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 05.06.2006 (Пн) 12:20

Ну значит и добавится такая вот фигня в лист...


А может Trim$ добавить :о)?
Пора уже всем хорошим людям собраться и убить всех плохих людей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.06.2006 (Пн) 12:27

GB826
Ничего не надо. Может быть я хочу такой список
Код: Выделить всё
Интернет
  Web Money
  The Bat
  RSS Feed Reader
  I-net Money Counter
Твики
  PowerTweakXP
  IllusionLox

А вы всё стримимте..
Вот мой варинт кода, болеее оптимизированный, но и чуть-чуть извращенсий.
Код: Выделить всё

Private Function AddItem(ByVal sData As String) As Boolean
Dim iStart   As Integer: iStart = 1
Dim iEnd     As Integer: iEnd = 2
    sData = IIf(Mid$(sData, 1, Len(vbNewLine)) = vbNewLine, "", vbNewLine) + sData + IIf(Right(sData, Len(vbNewLine)) = vbNewLine, "", vbNewLine)
    Do
        iEnd = InStr(iStart + 2, sData, vbNewLine): iStart = iEnd + 1: AddItem = True
        listVar.AddItem Mid$(sData, iStart + 2, iEnd - iStart - 2)
        If iEnd = Len(sData) - 1 Then Exit Do
    Loop
End Function
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 05.06.2006 (Пн) 12:39

rtrim$ никто не отменял
Пора уже всем хорошим людям собраться и убить всех плохих людей.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 81

    TopList