Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026

Программирование кнопки удаления записи

25.09.2011, 22:29. Показов 5592. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
30
31
32
procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin
Seek(NoteFile, pos);
Truncate(NoteFile);
Button2.Enabled:=false;
if pos<>0 then dec(pos)
else
begin
Button5.Enabled:=false;
ClearDate;
end;
if pos>=0 then
begin
for i:=pos+1 to FileSize(NoteFile)-1 Do
begin
Seek(NoteFile,i);
Read(NoteFile, NoteData);
Seek(NoteFile, i-1);
Write(NoteFile, NoteData);
end;
Seek(NoteFile, FileSize(NoteFile) -1);
Truncate(NoteFile);
end;
Seek(NoteFile, pos);
Read(NoteFile, NoteData); ShowRecord;
if pos=-1 then
begin
Button1.Enabled := false; {Кнопка возвращения назад}
end;
 
end;
Задали перебить программу,а там код глючненный и с ошибками...Пытаюсь методом проб и ошибок его довести до ума,но что-то не получается.Что тут следует дописать и заменить?
P.S А какую позицию принимает pos если файл пуст? Считывание файла начинается с 0 позиции?

Добавлено через 5 часов 30 минут
Поможет кто?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.09.2011, 22:29
Ответы с готовыми решениями:

Добавление кнопки удаления в opendialog
Здравствуйте, задача состоит в том, чтобы сделать программу просмотра документов из списка Excel Парсить Excel и просматривать документы...

Создание в таблице кнопки удаления записи из БД
&lt;?php include &quot;config.php&quot;; if( isset($_GET)) { $query1 = mysql_query('SELECT*FROM Books WHERE id='.$_GET); ...

Применение кнопки удаления записи в подчинённых формах
Имеется главная форма с подчинёнными формами. Необходимо добавить кнопку удалить запись, после нажатия которой должно появится сообщение о...

33
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
27.09.2011, 22:16  [ТС]
Студворк — интернет-сервис помощи студентам
Огромное спасибо.
Вы только кнопку удаления довели до ума?Больше ничего другого в теле программы не меняли ?

Добавлено через 5 минут
А вот запись Truncate(NoteFile) означает,что содержимое файла очистится ? Я просто немного не понимаю,принцип использования этой команды...
0
Заблокирован
27.09.2011, 22:16
Отформатировал текст и поменял кнопку сохранения. Сравните код...

Добавлено через 31 секунду
Цитата Сообщение от iluxa1810 Посмотреть сообщение
А вот запись Truncate(NoteFile) означает,что содержимое файла очистится ?
Очистится с текущей позиции до конца.
1
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
27.09.2011, 22:24  [ТС]
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
begin
  Seek(NoteFile, Pos);{Перемещаемся на текущую позицию}
  j := FileSize(NoteFile); {Присваиваем j размер файла}
  for i := Pos + 1 to j - 1 do {Цикл переписывания с текущей позиции текущего файла во временны файл}
  begin
    Seek(NoteFile, i);
    Read(NoteFile, NoteData);
    Seek(NoteFile, i - 1);
    Write(NoteFile, NoteData);
  end;
  Truncate(NoteFile);{Обрубаем,что находится после текущей позиции в файле NoteFile}
  if Pos > FileSize(NoteFile) - 1 then {Если позиция больше размера файла,то присваиваем ей позицию конца файла}
    Pos := FileSize(NoteFile) - 1;
 
  if FileSize(NoteFile) > 0 then {Если в файле что-то записано}
  begin
    Seek(NoteFile, Pos);
    Read(NoteFile, NoteData);{Считываем Файл во временный файл}
    ShowRecord;{Показываем запись}
  end
  else
    ClearData;
  Button1.Enabled := Pos > 0;
  Button2.Enabled := Pos < FileSize(NoteFile) - 1;
end;
Правильно я понял?
0
Заблокирован
27.09.2011, 22:34
Немного не так
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
begin
  Seek(NoteFile, Pos);{Перемещаемся на текущую позицию в файле}
  j := FileSize(NoteFile); {Присваиваем j размер файла}
  {В цикле переписываем записи в файле на 1 вперед - начиная с записи после текущей. Т.е. затираем удаляемую запись следующей, а следующую, следующей за ней и т.к. до конца файла}
  for i := Pos + 1 to j - 1 do 
  begin
    Seek(NoteFile, i);
    Read(NoteFile, NoteData);
    Seek(NoteFile, i - 1);
    Write(NoteFile, NoteData);
  end;
  {Обрубаем,что находится после текущей позиции в файле NoteFile. Текущая позиция сейчас = размер файла - 1}
  Truncate(NoteFile);
{Если позиция больше размера файла,то присваиваем ей позицию конца файла. Такое может быть при удалении последней записи}
  if Pos > FileSize(NoteFile) - 1 then 
    Pos := FileSize(NoteFile) - 1;
 
  if FileSize(NoteFile) > 0 then {Если в файле есть записи}
  begin
    Seek(NoteFile, Pos);
    Read(NoteFile, NoteData);{Считываем текущую запись}
    ShowRecord;{Показываем запись}
  end
  else
    ClearData;
  Button1.Enabled := Pos > 0;
  Button2.Enabled := Pos < FileSize(NoteFile) - 1;
end;
1
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
27.09.2011, 22:52  [ТС]
Спс,вроде более менее понятно
P.S а зачем вот это использовать Truncate(NoteFile); ? Вроде перезапись произошла строкой выше
0
Заблокирован
27.09.2011, 22:59
Цитата Сообщение от iluxa1810 Посмотреть сообщение
P.S а зачем вот это использовать Truncate(NoteFile); ? Вроде перезапись произошла строкой выше
А подумать? Если мы удалили запись, а потом содержимое файла как-бы передвинули к голове... то последняя запись будет записана 2 раза! (или 1 раз - но лишний, когда мы удаляем последнюю запись). Вот для этого мы и отсекаем конец файла с одной лишней записью
0
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
28.09.2011, 19:41  [ТС]
Спс за разъяснения ,вроде уже максимально все понял .

Добавлено через 1 час 15 минут
Хотя есть один вопрос,а почему конец файла равен FileSize-1 ?Ведь просто FileSize это уже конец файла вроде как...

Добавлено через 6 минут
Delphi
1
2
Button1.Enabled := Pos > 0;
  Button2.Enabled := (Pos < FileSize(NoteFile) - 1);
И еще ,что значит это строка кода в сохранении?Просто в первые вижу ,что бы доступности кнопки было присвоено выражение....
0
Заблокирован
28.09.2011, 21:31
Кнопка "Следующая запись" доступна тогда, когда есть куда передвигаться... Pos хранит позицию начала текущей записи (т.е. для 1 записи Pos = 0). Например у нас 3 записи. Текущая = 2. Тогда Pos = 1; FileSize - 1 = 2; Все нормально, 1 < 2, дальше можем двигаться. Теперь у нас текущая запись = 3, т.е. последняя... Pos равен 2, FileSize - 1 тоже равен 2. Условие 2 < 2 не соблюдается, т.е. двигаться дальше мы не можем... Вот и все.
А FileSize - 1 потому что, как описано выше, у нас Pos всегда на единицу меньше текущей записи. А для чего Pos меньше текущей записи? Для того, чтобы текущую запись можно было перечитать или сразу записать, не передвигаясь по файлу...
Уффффф... многа букав

Добавлено через 8 минут
Button2.Enabled := (Pos < FileSize(NoteFile) - 1); Что тут происходит при выполнении программы? Сначала вычислится правая часть выражения - (Pos < FileSize(NoteFile) - 1). Результат будет логической переменной, и положится куда-то во временную переменную. Потом значение этой переменной присвоится свойству Enabled кнопки Button2. Есть еще пару вариантов этой записи, но мне нравится больше так.
1.
Delphi
1
2
3
4
if Pos < FileSize(NoteFile) - 1 then
  Button2.Enabled := True
else
  Button2.Enabled := False;
2. Через переменную
Delphi
1
2
3
4
5
6
var
  vB: Boolean;
begin
  vB := (Pos < FileSize(NoteFile) - 1);
  Button2.Enabled := vB;
end;
.
Но, согласитесь, написанный вариант все-таки кошернее
1
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
28.09.2011, 22:01  [ТС]
Спасибо

Добавлено через 20 минут
Про кнопки все ясно.
Насчет FilePos-1 ,допустим имеем мы 3 записи ,надо перезаписать или прочитать какую-то запись .
В чем будут отличия если Pos будет равна текущей записи и если позиция будет на 1 меньше текущей записи ?
P.S Сорри за многократные вопрос)Просто я в колледже мало практических занятий было по работе со строками и файлами=(
0
Заблокирован
28.09.2011, 22:16
В принципе - разницы нет. Просто надо сразу решить, как будет хранится Pos, меньше на единицу или нет. Просто для Вашего промера мне было удобнее Pos-1, дабы при записи не двигаться никуда. Просто личное предпочтение, и только
1
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
28.09.2011, 22:44  [ТС]
Цитата Сообщение от AndyZorg Посмотреть сообщение
дабы при записи не двигаться никуда
В каком смысле ?=)

Добавлено через 2 минуты
Кстати,а почему в программе не работает IOResult? Пытался сделать,что бы при возникновении ошибки высвечивалось сообщение,но при нажатии F9 пишется ошибка,что (На анг не помню),что не безопасно использовать IoResult в записи...
0
Заблокирован
28.09.2011, 23:14
Ну чтобы при записи не высчитывать Pos - а сразу сделать Seek(NoteFile, Pos)... Хотя можно и написать Seek(NoteFile, Pos-1). Блин! Не забивай голову! Помнишь ту сороконожку, которую спросили, как она двигается, сначала четные ноги, а потом нечетные? Так вот, она задумалась и больше не смогла ползать Короче удобнее мне так!!!
А IOResult - возвращает результат последней операции ввода/вывода, конкретно тебя интересуют операции с файлами. Но для ее работы должна быть выключена проверка ввода/вывода (опция компилятора {$I-}). Если IOResult вернул 0 - значит последняя операция ввода/вывода завершилась удачно. Иначе - получишь код ошибки. Но лучше его не использовать и использовать обработку исключительных ситуаций при включенной опции компилятора ({$I+}).
Вроде так... Если нет, поправьте...
1
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
29.09.2011, 17:51  [ТС]
Ну в данном коде,да записи 1 соответствует позиция 0 .А если допустим переписать ,так что бы позиции 1 была бы равна запись 1,ничего не поменяется?
0
Заблокирован
29.09.2011, 23:00
Тогда везде, где используется Pos (при перемещении по файлу, при записи) надо поменять Pos на Pos - 1. Вот и все, что поменяется...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.09.2011, 23:00

Как создать диалоговое окно QDialog, а в нем QTreeView (содержит таблицу из БД) + Кнопки добавления и удаления записи в дереве(через QPushButton)
Создаю базу в MySQL из одной таблицы. Помогите пожалуйста создать проэкт. Я только начала учить Qt + QtCreator мне не знаком. Мне...

Создание триггера до удаления записи и триггера после удаления записи
Есть БД на рис. пишу триггер при удаление клиента что бы сначала до удаления удалилась таблица t_pledge. А после остальные связанные....

код кнопки удаления,редактирования из бд
Доброго времени суток! Нужен код для удаления,редактирования строки из базы данных, может у кого то есть код поделитесь пожалуйста. ...

Код для кнопки удаления отчета
Здравствуйте,имеется кнопка в XML, удалить отчет,не могу дойти как составить код удаления,программировать только начинаю на С#,дали задание...

Некорректная работа кнопки удаления на сайте
Тренируюсь делать сайтик по написанию блогов. При нажатии на кнопку &quot;поделиться&quot;, появляется &quot;пост&quot; с кнопкой...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru