С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 19

Создание файла (txt) теста через Delphi

06.12.2017, 23:11. Показов 3226. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не создаёт файл с вопросами и ответами, даже если есть уже созданный файл, то всё равно не пишет в него, а показывает, что указан другой путь, пробовал прописать полностью путь к файлу но всё равно не фурычит, подсобите решить проблему, преподы игнорят, а сдавать нужно, спасайте, нужно именно создавать в таком виде как в проекте(((
Вложения
Тип файла: rar проект 2.0.1.rar (187.4 Кб, 19 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2017, 23:11
Ответы с готовыми решениями:

Создание програмы-теста на DELPHI
Помогите создать тест на Делфи про Строковый тип данных Паскаля=))

Чтение с txt файла и запись в StringGrid Delphi 7
Так как только учусь не могу понять как записать правильно. Читать оно читает, а данные не знаю как записать, вот кусочек кода с чтением: ...

Создание и сохранение txt файла.
У меня не получается с объектом TFileStream. Помогите, чтобы записалось в файл(допустим, Score.txt) значение(типа String) из...

23
5953 / 4529 / 1094
Регистрация: 29.08.2013
Сообщений: 28,122
Записей в блоге: 3
07.12.2017, 01:47
код пожалуйста где
Цитата Сообщение от СергейЮрьев Посмотреть сообщение
Не создаёт файл с вопросами и ответами
искать по всему проекту (наверняка еще и без комментариев) это не очень интересно
0
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 19
07.12.2017, 08:56  [ТС]
Комментарии прописаны, посмотри, если не затруднит.
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
07.12.2017, 09:36
Ладно, по порядку.
STEP в Button2Click надо присваивать принудительно. У тебя нет инициализации, но ты выполняешь сравнивание.
В итоге у меня первый вопрос под номером 1, второй вопрос под номером 0. Если возвращаюсь назад, получаю номер -2.

Добавлено через 1 минуту
И убери эти вторые begin..end из указаной процедуры.
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
07.12.2017, 09:41
Так, ну в целом, для интересующихся, имеем вот такую функцию записи в файл:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Type 
TTEST = Record
 TEXT : String [250]; // Текст Вопроса
 OTV : Array [1..4]of String [100];// Варианты ответов
 REZ : Array [1..4]of Byte // Правильный ответ
end;
 
...
Var FFile: File of TTEST;
...
 
procedure TForm1.Button3Click(Sender: TObject);
Var I :Byte;
STROK:TTEST;
STEP, STEP_N:integer;
begin
STEP_N:=1;
AssignFile(FFILE,'TEST.txt');
Rewrite(FFILE);
Button1.Enabled:=False; //Недоступны все три кнопки
Button2.Enabled:=False;
Button3.Enabled:=False;
For I:=1 to STEP_N+1 do
begin
STROK:=TEST_[I];
Write(FFILE, STROK)
end;
CloseFile(FFILE)
end;
По делу: лучше не использовать просто название файла, если мне память не изменяет (а она может изменять),то седьмая делфи отсылает в таком случае в папку system32:

Delphi
1
AssignFile(FFILE,'TEST.txt');
лучше вот так:
Delphi
1
AssignFile(FFILE,extractfilepath(paramstr(0))+'TEST.txt');
Это будет однозначное указание на файл в той же директории, что и исполняемый файл. Хотя, конечно, мне могут сказать, что и первый вариант правильный и я спорить не буду.

Итого, я бы рекомендовал сделать так, это может дать результат:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Type 
TTEST = Record
 TEXT : String [250]; // Текст Вопроса
 OTV : Array [1..4]of String [100];// Варианты ответов
 REZ : Array [1..4]of Byte // Правильный ответ
end;
 
...
Var FFile: File of TTEST;
...
 
procedure TForm1.Button3Click(Sender: TObject);
Var I :Byte;
//STROK:TTEST;
STEP, STEP_N:integer;
begin
STEP_N:=1;
AssignFile(FFILE,extractfilepath(paramstr(0))+'TEST.txt');
Rewrite(FFILE);
Button1.Enabled:=False; //Недоступны все три кнопки
Button2.Enabled:=False;
Button3.Enabled:=False;
For I:=1 to STEP_N+1 do
begin
//STROK:=TEST_[I]; имхо, это лишнее
Write(FFILE, TEST_[I]);
end;
CloseFile(FFILE)
end;

Небольшая оптимизация: все, что имеет в комментариях слово "формирование" лучше перенести в обработчик OnResize формы. Изменение положения элементов логичнее обрабатывать там.

Проверить все это не могу, выбивает исключение при нажатии кнопки "следующий", а вылавливать его сейчас нет времени.
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
07.12.2017, 09:43
Увидел, что этот STEP у тебя где ни попадя встречается. Область видимости локальных переменных помнишь? Тебе просто нужно поставить условие в клике второй кнопки.
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
07.12.2017, 14:12
Цитата Сообщение от Nanotentacle Посмотреть сообщение
а она может изменять
И она это сделала То, что Вы написали - касается ini-файлов. Но в любом случае это верное замечание: всегда лучше сохранять файл с путем...
СергейЮрьев, а почему TXT, если файл - типизированный? Не принципиально, но странно: с таким расширением ожидаешь увидеть обычный текстовик, а там...
1
07.12.2017, 14:43

Не по теме:

Цитата Сообщение от D1973 Посмотреть сообщение
То, что Вы написали - касается ini-файлов
Во, спасибо, буду помнить теперь. Потому как раньше сталкивался, но исходя из того, что часто видел на этом форуме работающий код без указания полного пути, то пришел к выводу, что я что-то упускаю.

0
07.12.2017, 15:03

Не по теме:

Цитата Сообщение от D1973 Посмотреть сообщение
а там...
..четыре развесёлых таракана и сверчок:D Почему-то вспомнилась эта песенка.

0
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 19
07.12.2017, 15:49  [ТС]
Препод сказал сделать с TXT форматом, чтобы типа любой "неуч" мог изменить его структуру

Добавлено через 1 минуту
Внёс данные коррективы, но успеха 0, к сожалению(
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
07.12.2017, 15:51
Цитата Сообщение от СергейЮрьев Посмотреть сообщение
Внёс данные коррективы, но успеха 0, к сожалению(
Учел ли в коде информацию из шестого поста в этой теме?
0
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 19
07.12.2017, 16:41  [ТС]
И из 6-го тоже внёс, но не фурычит((
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
07.12.2017, 17:27
Покажи текущий код.
0
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 19
08.12.2017, 00:01  [ТС]
Выяснил, что ошибка из-за этого тупого STEP, но без него никак, получается что всего единожды переключает и дальше никак, если выставлять так, чтоб при нажатии получалось больше чем задано вопросов, то сохраняет файл без проблем, но всё равно не пойму, почему-то сохраняет его не так как должен, вот что получается, посмотрите, прошу помощи, спасайте, думаю и вам тоже интересно раз отвечаете)
Вложения
Тип файла: rar проект 2.0.2.rar (188.8 Кб, 30 просмотров)
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
08.12.2017, 02:09
Цитата Сообщение от D1973 Посмотреть сообщение
И она это сделала То, что Вы написали - касается ini-файлов.
И она это сделала ещё раз у вас.
ini-файлы без пути читаются и записываются в папку Windiws, а не в system32.
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
08.12.2017, 03:11
northener, ну конечно же...
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
08.12.2017, 06:51
Цитата Сообщение от СергейЮрьев Посмотреть сообщение
что ошибка из-за этого тупого STEP, но без него никак,
Это ложное утверждение. Всегда есть возможность сделать иначе. UPD: после анализа кода я могу сказать, что проблема со STEP является самой меньшей из всех проблем, и является лишь следствием непонимания автора что вообще происходит в коде.
Цитата Сообщение от СергейЮрьев Посмотреть сообщение
думаю и вам тоже интересно раз отвечаете
Не совсем так. Просто я помню, как когда-то я начинал сам, с каким сложностями столкнулся и сколько упустил времени на глупые ошибки. Если есть вероятность, что моя помощь в этой теме поможет человеку сэкономить полгода и сделать шаг вперед в понимании принципов программирования, то я сквозь нехочу полезу разбираться в коде. Если хоть что-то там пойму - то помогу. Интерес тут, в основном, ни при чем.

Разберем процедуру Button2Click поэтапно:

Delphi
1
2
3
4
5
6
7
8
9
10
begin
If (RadioButton1.Checked=False) and
(RadioButton2.Checked=False) and
(RadioButton3.Checked=False) and
(RadioButton4.Checked=False)
Then
begin
ShowMessage('Не выбран правильный ответ');
Exit;
end;
Ок, тут вопросов нет. Хорошая проверка корректности.

Delphi
1
2
3
4
5
6
7
8
//If STEP=1 Then
begin
TEST_[1].TEXT:=Edit1.Text; //Зачем мы в текст вопроса первого теста пишем название этого теста? 
Edit1.Enabled:=False;
STEP_N:=StrtoInt(SpinEdit1.Text); //Хорошо, мы присваиваем переменной значение из SpinEdit. Но! У SpinEdit есть метод Value, который и без StrToInt дает целочисленное значение. Причем, переменную STEP_N в дальнейшем используем странно. 
SpinEdit1.Enabled:=False;
STEP:=STEP+1; //STEP - это локальная переменная, и после завершения процедуры она "исчезает". Более того, этой переменной в начале процедуры присваиваем единицу. Как предлагается уйти дальше второго вопроса?
end;
В этом куске кода каждая вторая строчка вызывает вопросы. Переменная STEP не выполняет своей функции вообще.

Далее:
Delphi
1
2
3
4
5
STEP:=STEP+1; //мы вновь прибавляем единицу к STEP. Итого, независимо от прочих условий, у нас уже STEP=3 в любых обстоятельствах
TEST_[STEP].TEXT:=Edit2.Text; //Третьему тексту вопроса мы присваиваем значение из Edit2, независимо от текущего порядкового номера вопроса. Так все же мы в эту переменную пишем данные из Edit1 или из Edit2? 
For I:=1 to 4 do
//begin
TEST_[STEP_N].OTV[I]:=TEdit(FindComponent('Edit'+IntToStr(I))).Text; //Двумя строчками выше мы присваивали текст вопроса тесту с порядковым номером STEP=3. Возможные ответы мы присваиваем тесту с порядковым номером STEP_N, который, как мы помним, мы взял из SpinEdit и который равен количеству вопросов в тесте. Т.е., по умолчанию, пятому тесту.
В этом куске у нас полная солянка из значений. Вообще непонятно, какому тесту и что мы присваиваем.

Поехали далее:
Delphi
1
2
3
If TRadioButton(FindComponent('RadioButton'+IntToStr(1))).Checked= True //тут мы берем проверку только первого RadioButton, отказавшись от цикла (посмотрим чуть выше в код, там begin закомментирован). Если вдруг он оказался отмеченным, то только тогда записываем значение. Кстати, для твоих задач есть уже существующий компонент TRadioGroup, который позволит избежать кучи геммороя и самостроя. Что вообще такое "IntToStr(1)"? Я понимаю, что это "ошметки" от закомментированного begin, но, блин...
Then TEST_[STEP_N].REZ[I]:= 1; //а как же остальные варианты? Правильным может быть только ответ под порядковым номером 1?
end; //а что, если не секрет, этот end завершает с логической точки зрения? Какой блок кода огорожен этими begin/end?
Тут понятно и без лишних слов.

Поехали далее:
Delphi
1
2
3
4
5
6
7
Button1.Enabled:=True; //ну окей, логика есть
If STEP>STEP_N Then //проверка на окончание ввода тестов и предложение все сохранить? Увы, с текущим кодом это недостижимо. STEP никогда не станет больше тройки (да на этом этапе он и меньше тройки никогда не будет), а STEP_N никогда не будет меньше пятерки.
begin
STEP:=STEP+1;//зачем? Если вдруг STEP принял значение 6 и стал больше значения количества тестов (5), то зачем прибавлять к этому значению единицу и делать STEP равным 7?
Button2.Enabled:=False;
Button3.Enabled:=True;
end;
Поехали дальше:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
begin
Label3.Caption:='Вопрос № '+IntToStr(STEP-1); //Так. А здесь почему STEP-1? У нас же парой строк выше было STEP+1, которое явно сработает при превышении количества вопросов и, как результат, даст неправильный результат? Плюс, почти всю процедуру STEP у нас равняется тройке. Т.е. вопрос мы записали в третий тест, ответы записали в пятый, а потом пользователю сообщили, что сейчас у нас второй вопрос?
Edit2.Text:=TEST_[STEP].TEXT; //Стоп!!! Ну стоп же!!! Ну как так? Мы строчкой выше вывели, что у нас вопрос номер STEP-1, т.е. два, и тут же в Edit2 выводим вопрос из третьего теста, который мы несколькими строчками выше из этого же Edit'a и сохранили! Что ты такое?!
For I:=1 to 4 do
begin
TEdit(FindComponent('Edit'+IntToStr(I+2))).Text:=TEST_[STEP].OTV[I]; //Так. Вопрос номер два, но ответы мы возьмем из теста номер три, в который мы ответы ранее не сохраняли. Т.е. всегда будет присваиваться пустая строка. С точки зрения пользователя, конечно, все ок, визуальная часть отрабатывает как надо, но, блин... Это же совсем не означает, что все как надо. Наоборот, из-за этой обертки автор, видимо, думает, что эта часть у него работает хорошо, хотя она не работает вообще.
If TEST_[STEP].REZ[I]= 1 Then // и опять эта мастерская проверка на то, является ли правильным ответом первый ответ. Остальные у нас, судя по расовой теории африканцев, недостойны, и в любом случае будут неверными, даже если они верные.
TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Checked:= True
else
TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Checked:= False
end;
end;
Вердикт: процедура непонятно что делает. Даже автор не знает, что там происходит, такое ощущение, что это попытка с помощью урагана на тракторном заводе собрать танк Т-90.

Не по теме:

Внимание! В результате выполнения данного кода неквалифицированным персоналом есть вероятность случайного зарождения кибернетической жизни с угрозой дальнейшего захвата человечества. Рекомендуется удалить весь код процедуры без возможности восстановления и попробовать написать все заново, используя основы алгоритмики. За возможность появления в вашей квартире Джона Коннора, Сары Коннор и терминатора с целью устранения процедуры автор поста ответственности не несет.

1
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 19
08.12.2017, 13:44  [ТС]
Я так понимаю нужно переписать полностью обе процедуры, и на 2-ю и 3-ю кнопки?((
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
08.12.2017, 13:48
Цитата Сообщение от СергейЮрьев Посмотреть сообщение
Я так понимаю нужно переписать полностью обе процедуры, и на 2-ю и 3-ю кнопки?((
Нет. Просто внести правки. У тебя везде несоответствия индексов и этих STEP`ов.
А для начала продумай, как программа должна себя вести. Просто прокомментируй каждую строку.
0
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 19
08.12.2017, 14:05  [ТС]
Вот из этой методички делал всё, поэтому не понимаю почему ошибки, сегодня ко всей кафедре преподов подходил, все посылают друг к другу и ничего дельного не советуют, говорят сам делай, а сам не особо понимаю ибо делфи не изучали а проект дали на нём делать, вы меня не вините я особо не виноват в том, что преподы не особо адекватные...
Вложения
Тип файла: pdf 11.pdf (473.1 Кб, 19 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2017, 14:05
Помогаю со студенческими работами здесь

Поиск и удаление текста в *.txt Delphi, перезапись файла
Здравствуйте, подскажите пожалуйста! Вопрос пустяковый если честно но разобраться не могу :cry: Есть 2 файла file.txt и file2.txt в...

Создание и запись в .txt из нескольких Memo через SaveDialog
требуется создать файл в который записать текст из нескольких Memo, при этом между текстов из Memo нужно вставить строчку так сказать...

как прочитать из файла .txt два значения которые через запятую
подскажите пожалуйста как прочитать из файла .txt два значения которые через запятую например : 10 5 мне нужно значение 10 присвоить к...

Создание .txt файла через кнопку
Мне нужно что бы, например, я жду кнопку и число с текстбокса - переменная сохранялась в .txt файле который создавался в указаной мной...

Перевод из Delphi в C++. Создание теста.
Перевожу программу из Delphi в C++, код элементарноVar Left_N : Integer; // Отступ слева верхней части Top_N : Integer; // Отступ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru