Страница: 1 | 2 |
Вопрос: Сохранение текста из нескольких TextBox
Добавлено: 08.10.04 20:43
Автор вопроса: Unheilig | Web-сайт:
Здравствуйте.
У меня есть форма, на ней размещены 7 текстбоксов. В 1 текстбокс я обязательно пишу какой-либо текст, и в другие по выбору (к примеру текст будет только в 2 из 6 оставшихся), мне нужно чтобы все введеные данные сохранялись в один файл в таком порядке:
Текст 1 бокса
[1] - здесь текст из 2 бокса
[2] - здесь 3 и так далее...
Подскажите как это реализовать, ил дайте пример, ссылку
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
Tigre
Вопросов: 34
Ответов: 63
Профиль | | #1
Добавлено: 08.10.04 22:46
переменная=text1.text+CHR(13)+CHR(10)+text2.text+CHR(13)+CHR(10)+text3.text+CHR(13)+CHR(10)...
И сохраняеш переменную в файл последовательного доступа.
Номер ответа: 2
Автор ответа:
Unheilig
ICQ: 336859855
Вопросов: 9
Ответов: 32
Web-сайт:
Профиль | | #2
Добавлено: 09.10.04 01:06
Ладно, сохранять я научился. А как теперь открыть такой файл в том же порядке?
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 09.10.04 01:36
Сохранять:
Text1.Text & vbnullchar & Text2.Text
Загружать:
Text1.Text = Split(var, vbNullChar)(0)
Text2.Text = Split(var, vbNullChar)(1)
PS
И не надо использовать связку Chr(13) & Chr(10) = vbCrLf, т.к. это знак перехода на след. строку и перевода каретки в начало, что вполне можно набрать в текстовом поле, а значит после будет невозможно верно загрузить информацию обратно!
Номер ответа: 4
Автор ответа:
Unheilig
ICQ: 336859855
Вопросов: 9
Ответов: 32
Web-сайт:
Профиль | | #4
Добавлено: 09.10.04 02:21
to sne:
А поподробнее можно. Ведь мне нужно именно так:
В первом боксе идёт вопрос (Q), а в других варианты ответов.
А выглядит файл так:
[Q] My questuion: snow is white?
[1] Yes
[2] No
[3] Sorry, i am daltonic :\
[4] Something...
Вот так...
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 09.10.04 02:27
Подробнее, куда уж... Лучше скажи что не ясно, тебе тут с радостью все помогут )
Номер ответа: 6
Автор ответа:
Unheilig
ICQ: 336859855
Вопросов: 9
Ответов: 32
Web-сайт:
Профиль | | #6
Добавлено: 09.10.04 02:51
to Всем кто заглянет в топик
Ну к примеру зачем этот vbnullchar? Я без него пробовал вот так :
Private Sub mnuSave_Click()
alltext = "Q " & Text1.Text + Chr(13) + Chr(10) + "[1] " & Text2.Text + Chr(13) + Chr(10) + "[2] " & Text3.Text + Chr(13) + Chr(10) + "[3] " & Text4.Text + Chr(13) + Chr(10) + "[4] " & Text5.Text + Chr(13) + Chr(10) + "[5] " & Text6.Text + Chr(13) + Chr(10) + "[6] " & Text7.Text + Chr(13) + Chr(10)
nFreeFile = FreeFile
CommonDialog.ShowSave
strFileName = CommonDialog.FileName
If strFileName <> "" Then
Open strFileName For Output As nFreeFile
Print #nFreeFile, alltext
Close
End If
End Sub
Всё сохраняет корректно, а мне так и надо, чтобы с новой строки было. Вот только открыть обратно не выходит. Напишите если не трудно.
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 09.10.04 03:02
я те про че и говорю, сделай все то же самое, но Chr(13) + Chr(10) замени на vbNullChar !!!
Номер ответа: 8
Автор ответа:
Unheilig
ICQ: 336859855
Вопросов: 9
Ответов: 32
Web-сайт:
Профиль | | #8
Добавлено: 09.10.04 03:23
Я заменяю, но сохраняется всё в одну строку!!!
а мне надо столбец
Напиши всё это кодом на ВБ (сохр. и загр.)раз ты лучше знаешь!
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 09.10.04 03:49
Dim a As string, Lines() As String
Open FileName For Binary As 1
a=Space$(Lof(1))
Get #1,1,a
Close 1
Lines()=Split(a, VbCrLf)
В результате в массив a загрузятся все твои строки. По одной на элемент массива.
Номер ответа: 10
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #10
Добавлено: 09.10.04 05:09
А мне кажется лучше использовать файл произвольного доступа.
Private Type TestDB
Question as String * 100
FirstAnswer As String * 100
SecondAnswer As String * 100
ThridAnswer As string * 100
CorrectAnswer As String * 100
End Type
Когда получаешь вопросы и ответы из файла их можно поместить в массив Dim aTest() as TestDB. Так перед отображением их можно будет «случайно перетасовать», что бы каждый раз они выводились в разном порядке. А еще лучше использовать для этого базу данных.
Номер ответа: 11
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 09.10.04 08:08
Ну так напиши ему пример. Видишь он вообще с файлами работать не умеет.
Номер ответа: 12
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #12
Добавлено: 09.10.04 09:35
Private Type TestDB
Question As String * 100
FirstAnswer As String * 100
SecondAnswer As String * 100
ThridAnswer As String * 100
CorrectAnswer As String * 100
End Type
 im Test As TestDB
 im aTest() As TestDB
Private Sub cmdGetInformation_Click()
 im i As Integer
 im FileNum As Integer
 im FileName As String
 im RecCount As Integer
 im RecordLen As Long
FileNum = FreeFile
FileName = App.Path & "\TestDB.dat"
RecordLen = Len(Test)
'получаем длину записи
RecCount = FileLen(FileName) / RecordLen
'получаем количество записей
Open FileName For Random As FileNum Len = RecordLen
'открываем файл для произвольного доступа чтение/запись
For i = 1 To RecCount
Get #FileNum, i, aTest(UBound(aTest))
'получаем запись № i, помещаем её в массив
ReDim Preserve aTest(0 To UBound(aTest) + 1)
'увеличиваем размерность массива сохраняя его содержимое
Next i
Close #FileNum
'после этого можно поместить содержимое массива в текстовые поля
'txtQuestion.Test = Trim(aTest(1).Question)
'не забывай про Trim, нужно убрать лишние пробелы
End Sub
Private Sub cmdPutInformation_Click()
 im FileNum As Integer
 im FileName As String
 im RecCount As Integer
 im RecordLen As Long
FileNum = FreeFile
FileName = App.Path & "\TestDB.dat"
RecordLen = Len(Test)
'получаем длину записи
If Dir(App.Path & "\TestDB.dat" = "TestDB.dat" Then
RecCount = FileLen(FileName) / RecordLen
'получаем количество записей
Else
RecCount = 0
End If
Open FileName For Random As FileNum Len = RecordLen
'открываем файл для произвольного доступа чтение/запись
Put #FileNum, RecCount + 1, Test
'записываем данные из структуры Test
Close #FileNum
End Sub
Private Sub Form_Load()
ReDim aTest(0)
'вместо того, что ниже, кинь на форму текстовые поля например
'txtQuestion, txtFirstAnswer, при нажатии на кнопку cmdPutInformation (скажем Сохранить)
'из соответсвующих текстовый полей заноси информацию в структуру Test, например
'Test.Question=txtQuestion.Text или Test.FirstAnswer=txtFirstAnswer.Text
With Test
.Question = "Первый вопрос"
.FirstAnswer = "первый вариант ответа для 1 вопроса"
.SecondAnswer = "второй вариант ответа для 1 вопроса"
.ThridAnswer = "третий вариант ответа для 1 вопроса"
.CorrectAnswer = "правильный ответ для 1 вопроса"
End With
End Sub
Хотя конечно при таком варианте можно обойтись и без использования массива. Для случайного выбора вопроса можно сделать так:
Private Sub cmdNextQuestion_Click()
 im FileNum As Integer
 im FileName As String
 im CurrRec As Integer
 im RecordLen As Long
FileNum = FreeFile
FileName = App.Path & "\TestDB.dat"
RecordLen = Len(Test)
'получаем длину записи
Randomize
CurrRec = Int(Rnd * (FileLen(FileName) / RecordLen)) + 1
‘ случайным образом выбираем запись из файла
Open FileName For Random As FileNum Len = RecordLen
'открываем файл для произвольного доступа чтение/запись
Get #FileNum, CurrRec, Test
'получаем запись № i, помещаем её в массив
Close #FileNum
End Sub
Правда в этом случае придется отслеживать был или нет уже этот вопрос. Если решишь работать с массивом, то перемешать его можно так:
 im atemp(0 To 1) As testdb
SeconCount = Second(Time)
For i = 1 To SeconCount * 300
Randomize
Ind = Int(Rnd * (UBound(aTest)))
If Ind >= 0 Then
If Ind Mod 2 = 0 Then
atemp(0) = aTest(Ind)
atemp(1) = aTest(UBound(aQuestion))
aTest(Ind) = atemp(1)
aTest(UBound(aTest)) = atemp(0)
Else
atemp(0) = aTest(Ind)
atemp(1) = aTest(0)
aTest(Ind) = atemp(1)
aTest(0) = atemp(0)
End If
End If
Next i
И еще, думаю лучше будет создать два файла, для вопросов и для вариантов ответов, тогда можно будет перемешивать еще и варианты ответов.
З.Ы. Если что то не понятно, или я что то наколбасил, напиши… Надеюсь помого!
Номер ответа: 13
Автор ответа:
Tigre
Вопросов: 34
Ответов: 63
Профиль | | #13
Добавлено: 09.10.04 20:51
А не проше всё таки использовать Chr(13) + Chr(10)
А открывать так:
Dim stroka(5) as string
Open "TESTFILE" For Input As #1
'С каждым повторение цикла будет считываться следующая.
For i=1 to 5
Line Input #1, stroka(i)
Next i
Close #1
text1 = stroka(1)
text2 = stroka(2)
text3 = stroka(3)
text4 = stroka(4)
text5 = stroka(5)
Номер ответа: 14
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #14
Добавлено: 10.10.04 01:05
А если в вопросах/ответах используется много строк???
Tigre, че ты так привезался к vbCrLf ??? Это же заведомо неверно!!!
Номер ответа: 15
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #15
Добавлено: 10.10.04 01:07
Это смотря какая задача перед тобой стоит.
Например твой вариант выигрывает в скорости написания кода, но эффективен только на маленьких файлах (до 100 кБ); мой вариант мгновенно загружает боьлшие файлы, но сильно расходует память; а код Mihalыch'а нечто среднее между моим и твоим. Можно объединить все три способа, но для этого нужно иметь хорошие знания языка и устройства ЭВМ. Новичку это будет не под силу.
Сейчас попробую это сделать