Удаление строки из текстового файла в БД |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Удаление строки из текстового файла в БД |
hemm |
16.12.2011 22:53
Сообщение
#1
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Олег Репутация: 0 |
База данных. Не могу наладить удаление конкретной записи.
Удаляются данные из массива, но остаются символы, разделяющие колонки. Получается такая картина: *Создал две записи. Затем удалил запись №1, но пустые колонки все равно остались. Буду благодарен за любые советы по улучшению и упрощению кода. *процедуру проверки на существования текстового файла пока не делал, поэтому для запуска программы в том же каталоге надо создать файл DB.TXT Проверял на FREEPASCAL.
Сообщение отредактировано: hemm - 16.12.2011 22:55 |
IUnknown |
16.12.2011 23:45
Сообщение
#2
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Удалять надо не строки из содержимого ячейки массива, а собственно саму ячейку (сдвигать все содержимое массива на одну позицию влево, начиная от i-той) :
Procedure Deleting;(можно было, конечно, передвинуть все элементы массива вручную, обычным циклом, но зачем, если есть процедура, которая делает это сама...) Как видишь, я внес еще пару изменений в код: для начала - не надо пересчитывать содержимое файла в массив, зачем? Ты ж только что его записал туда... Добавлена так же проверка на ошибку в номере записи (можешь добавить еще проверку на i > 0, чтоб нельзя было ввести нулевых или отрицательных номеров). Ну, и, наконец - самая большая ошибка: вызов Menu в конце работы процедуры, из этого же Menu вызванной. Не надо этого делать!!! Ошибки при организации меню (здесь я собрал часто встречающиеся ошибки. Так вот, ошибка №2 - это твой случай) |
hemm |
17.12.2011 0:29
Сообщение
#3
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Олег Репутация: 0 |
Большое спасибо, Владимир.
Но вот насчет: Цитата Ну, и, наконец - самая большая ошибка: вызов Menu в конце работы процедуры, из этого же Menu вызванной. Не надо этого делать!!! Если убираю допустим после Добавления новой записи (Procedure Add) процедуру Menu, по завершению ввода данных программа завершает свою работу, а не переходит обратно в меню. И вот если я буду из меню открывать процедуру, а затем опять же возвращаться в меню, в конечном итоге это забьет стек? |
IUnknown |
17.12.2011 1:04
Сообщение
#4
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Ах, так у тебя и сама процедура Menu неверно написана:
Procedure Menu;Перед тем, как запускать - убедись, что больше нигде Menu рекурсивно не вызывается. Иначе по первому нажатию "0" не выйдешь изменю, придется нажимать столько раз, сколько было рекурсивных вызовов. Цитата И вот если я буду из меню открывать процедуру, а затем опять же возвращаться в меню, в конечном итоге это забьет стек? Если будешь из Menu вызывать процедуру, а затем, в ее конце - опять вызывать Menu - то да, стек будет заполняться. Если даже не забьешь полностью - то займешь какое-то пространство, которое может пригодиться: стека много не бывает...Я надеюсь, программа отлаживается в контролем стека? (Options->Compiler->Generated code->Stack checking включено?) Сообщение отредактировано: IUnknown - 17.12.2011 1:04 |
hemm |
17.12.2011 1:31
Сообщение
#5
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Олег Репутация: 0 |
Фантастика! Благодарю!
Нашел еще одну проблему. Если ввести очень длинную фамилию, то она смещает все данные и таблица нарушается.
|
IUnknown |
17.12.2011 2:39
Сообщение
#6
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Procedure WriteAll;Теперь какая бы не была фамилия - отобразятся только первые её 16 символов. Цитата МОЖНО ЛИ ЗДЕСЬ ОГРАНИЧИТЬ КОЛИЧЕСТВО ВЫВОДИМЫХ СИМВОЛОВ? ПОПЫТАЛСЯ УКАЗАТЬ Massive[i].SecondName: 5, НО ВИДИМО ЭТО ЛИШЬ ДЛЯ ЧИСЕЛ ПОДХОДИТ Это и для чисел не подходит. Нельзя задать ширину поля меньше, чем нужно для вывода числа:var i : integer;не напечатает 1024, будет выведено число полностью. |
IUnknown |
17.12.2011 14:02
Сообщение
#7
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Итак, от изначальных 715 строк исходного файла в результате нехитрых действий осталось чуть больше 420:
Много кода, поэтому под спойлером (Показать/Скрыть)
Write('bla-bla-bla'); в отдельную процедуру. В общем, заготовка у тебя есть, допиливай |
-TarasBer- |
17.12.2011 14:13
Сообщение
#8
|
Гость |
Спойлер (Показать/Скрыть)
|
IUnknown |
17.12.2011 14:48
Сообщение
#9
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Спойлер (Показать/Скрыть)
|
hemm |
17.12.2011 22:57
Сообщение
#10
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Олег Репутация: 0 |
Допилил. Все работает как надо.
Единственное, что при редактировании (если в базе больше 10 записей) нельзя прокрутить и посмотреть первые. Получается такая штука: Спойлер (Показать/Скрыть)
|
IUnknown |
17.12.2011 23:02
Сообщение
#11
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Прокрутку я тоже как-то показывал на форуме, поищи.
|
Текстовая версия | 28.04.2024 13:05 |