Вопрос: Сохранение текста из нескольких TextBox | Добавлено: 08.10.04 20:43 |
Автор вопроса: ![]() |
Здравствуйте.
У меня есть форма, на ней размещены 7 текстбоксов. В 1 текстбокс я обязательно пишу какой-либо текст, и в другие по выбору (к примеру текст будет только в 2 из 6 оставшихся), мне нужно чтобы все введеные данные сохранялись в один файл в таком порядке: Текст 1 бокса [1] - здесь текст из 2 бокса [2] - здесь 3 и так далее... Подскажите как это реализовать, ил дайте пример, ссылку |
Ответы | Всего ответов: 19 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 336859855 Вопросов: 9 Ответов: 32 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 09.10.04 01:06 |
Ладно, сохранять я научился. А как теперь открыть такой файл в том же порядке? |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик 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 Автор ответа: ![]() ![]() ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 09.10.04 02:27 |
Подробнее, куда уж... Лучше скажи что не ясно, тебе тут с радостью все помогут ![]() |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 09.10.04 03:02 |
я те про че и говорю, сделай все то же самое, но Chr(13) + Chr(10) замени на vbNullChar !!! |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 336859855 Вопросов: 9 Ответов: 32 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 09.10.04 03:23 |
Я заменяю, но сохраняется всё в одну строку!!!
а мне надо столбец Напиши всё это кодом на ВБ (сохр. и загр.)раз ты лучше знаешь! |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик 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 Автор ответа: ![]() ![]() ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 09.10.04 08:08 |
Ну так напиши ему пример. Видишь он вообще с файлами работать не умеет. |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() 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 ![]() ![]() Private Sub cmdGetInformation_Click() ![]() ![]() ![]() ![]() ![]() 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() ![]() ![]() ![]() ![]() FileNum = FreeFile FileName = App.Path & "\TestDB.dat" RecordLen = Len(Test) 'получаем длину записи If Dir(App.Path & "\TestDB.dat" ![]() 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() ![]() ![]() ![]() ![]() 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 Правда в этом случае придется отслеживать был или нет уже этот вопрос. Если решишь работать с массивом, то перемешать его можно так: ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #14 | Добавлено: 10.10.04 01:05 |
А если в вопросах/ответах используется много строк???
Tigre, че ты так привезался к vbCrLf ??? Это же заведомо неверно!!! |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #15 | Добавлено: 10.10.04 01:07 |
Это смотря какая задача перед тобой стоит.
Например твой вариант выигрывает в скорости написания кода, но эффективен только на маленьких файлах (до 100 кБ); мой вариант мгновенно загружает боьлшие файлы, но сильно расходует память; а код Mihalыch'а нечто среднее между моим и твоим. Можно объединить все три способа, но для этого нужно иметь хорошие знания языка и устройства ЭВМ. Новичку это будет не под силу. Сейчас попробую это сделать ![]() |
|