Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 25
RAD XE3+

Как добавить добавить новую типизированную переменную в файл

03.12.2019, 23:45. Показов 2472. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такая процедура, мне нужно, чтобы в конец файла добавлялась новая s, а оно затирает старую, и вместо нее остается новая. Writeln не работает, выдает ошибку (illegal type for write/writeln), как можно исправить?
P.s. Я новичок в делфи, да и в принципе в программировании, поэтому если можно, то поподробнее
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
  var
  s: Toy;
begin
  assignfile(f,OpenDialog1.FileName);
  reset(f);
  s.name:=Edit1.Text;
  s.price:=StrToFloat(Edit2.Text);
  s.lowage:=StrToInt(Edit3.Text);
  s.highage:=StrToInt(Edit4.Text);
  write(f,s);
  closefile(f);
  Memo1.Lines.Add(Edit1.Text + ' ' + Edit2.Text + ' От ' + Edit3.Text + ' до ' + Edit4.Text);
вот собственно сам тип. файл
Delphi
1
2
3
4
5
6
Toy = Record
    name: string[40];
    price: real;
    lowage: integer;
    highage: integer;
  End;
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.12.2019, 23:45
Ответы с готовыми решениями:

Как в ComboBox добавить новую строку?
Кто нибудь знает как в ComboBox добавить новую стоку так, что бы при выходе из программы введеные новые сторки сохранялись в ComboBox. И...

Как добавить на рамку формы новую кнопку?
Как добавить на рамку формы новую кнопку

Как добавить переменную счетчик?
Как добавить переменную счетчик? напишите код пожалуйста.

20
Заблокирован
03.12.2019, 23:53
Лучше всего делать всё через поток.

Добавлено через 1 минуту
и real вообще выбрось
замени его на double или single
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 25
03.12.2019, 23:55  [ТС]
P.s. Я новичок в делфи, да и в принципе в программировании, поэтому если можно, то поподробнее
Я не разбираюсь в потоках, и как я понимаю тут можно без них. Препод ни слова про потоки не говорил.
0
Заблокирован
04.12.2019, 00:26
Если у тебя замена real на что-то повлияет то не трогай.
А вообще забудь об этом типе раз и навсегда.

Delphi
1
2
var
FL:TFilestream; //Объявляем файловый поток.
........

Delphi
1
2
3
4
FL.Create(OpenDialog1.FileName, fmopenwrite); //Открываем файл на запись
FL.Position:= FL.Size; //Смещаемся в конец
FL.Write(s, sizeof(s));//Записываем
FL.Free;//Закрываем файл
Добавлено через 4 минуты
Real это устаревший тип из досовского Паскаля.
Вся проблема в том, что он используется в программном коде. Математический сопроцессор его не поддерживает.
Поэтому всегда надо ставить Single
Это тоже самое что реал, но поддерживается сопроцессором.
А Double это число с двойной точностью

Добавлено через 5 минут
Дай телефон своего препода, я ему скажу пару ласковых, чтоб хернёй не занимался.
Зачем тебе все эти заморочки со старьём? Учится надо на новых технологиях. Тем более потоки тоже вещь древняя. Зато удобная.
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 25
04.12.2019, 00:27  [ТС]
Попробовал, не уверен, что правильно, но теперь выдает ошибку и программа просто вылетает.
Delphi
1
2
3
4
5
6
7
8
fl.Create(OpenDialog1.FileName,fmopenwrite);
  fl.Position:=fl.Size;
  s.name:=Edit1.Text;
  s.price:=StrToFloat(Edit2.Text);
  s.lowage:=StrToInt(Edit3.Text);
  s.highage:=StrToInt(Edit4.Text);
  fl.Write(s, sizeof(s));
  fl.Free;
Миниатюры
Как добавить добавить новую типизированную переменную в файл  
0
Заблокирован
04.12.2019, 00:29
А вообще можешь меня не слушать. Жди пока кто другой подгребёт.

Добавлено через 46 секунд
Ты обьявил как я писал?
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 25
04.12.2019, 00:29  [ТС]
Крутяк, ну ладно буду пока пробовать сам разбираться, спасибо
0
Заблокирован
04.12.2019, 00:30
давай сюда свой проект я гляну что там у тебя
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 25
04.12.2019, 00:31  [ТС]
Вот
Вложения
Тип файла: zip program.zip (7.0 Кб, 1 просмотров)
0
Заблокирован
04.12.2019, 01:12
У тебя нету
if OpenDialog1.Execute then begin

Добавлено через 26 секунд
в кнопке Add

Добавлено через 1 минуту
И у меня старая Delphi
Несовместимый код.
Попробую эту часть сделать на старой

Добавлено через 1 минуту
А вообще попробуй вставить так

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.Button1Click(Sender: TObject);
  var
  s: Toy;
  FL:TFilestream;
begin
  //assignfile(f,OpenDialog1.FileName);
  //reset(f);
  if OpenDialog1.Execute then begin
  fl.Create(OpenDialog1.FileName,fmopenreadwrite);
  fl.Position:= fl.Size;
  s.name:= Edit1.Text;
  s.price:=StrToFloat(Edit2.Text);
  s.lowage:=StrToInt(Edit3.Text);
  s.highage:=StrToInt(Edit4.Text);
  fl.Write(s, sizeof(s));
  fl.Free;
  end;
  //write(f,s);
  //closefile(f);
 
 
  Memo1.Lines.Add(Edit1.Text + ' ' + Edit2.Text + ' От ' + Edit3.Text + ' до ' + Edit4.Text);
end;
Добавлено через 1 минуту
Только старую функцию сохрани
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 25
04.12.2019, 01:14  [ТС]
if OpenDialog1.Execute then begin не использовал т.к. сначала я должен открыть файл через кнопку open file, поэтому это условие там не нужно.
Код попробовал вставить, та же ошибка, что и до этого
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
04.12.2019, 01:39
Цитата Сообщение от Lorrrd Посмотреть сообщение
FL.Create(OpenDialog1.FileName, fmopenwrite);
Ну кто так создаёт объекты?!
0
Заблокирован
04.12.2019, 01:49
У меня крыша сьехала. Надо так писать

fl:= TFilestream.Create(OpenDialog1.FileName, fmopenwrite);

Добавлено через 1 минуту
northener,
Без тебя знаю
И вообще не лезь ко мне. У нас ночь. И луна полная.
0
04.12.2019, 01:58

Не по теме:

Lorrrd,
У всех ночь, у всех луна. Но крыша едет только у некоторых.

0
Заблокирован
04.12.2019, 02:21
Всё прекрасно работает, но у вас он работать не будет, потому что надо полностью на поток всё переводить
Обе кнопки.
Через глобальную пеерменную. И открывать поток в кнопке Оpen

Добавлено через 44 секунды
northener,
Крыша едет у гениев. А у бездарей ехать нечему.

Добавлено через 19 минут
И ещё совет. Если в делаете что-то вроде базы данных, то не надо держать файл открытым.
В самом начале, задаём имя базы.
И потом попросту добавляем данные.
То есть если файла нет он создаётся. если есть, открывается. Добавляем и сохраняем. Тогда файл будет в сохранности.
Иначе свет мигнёт и кранты.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
04.12.2019, 02:33
Цитата Сообщение от Lorrrd Посмотреть сообщение
То есть если файла нет он создаётся. если есть, открывается.
И где код проверки наличия файла и создания или открытия?
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
04.12.2019, 09:31
Лучший ответ Сообщение было отмечено Veyzyy как решение

Решение

Veyzyy, тебе нужна была всего одна команда - установить указатель в файле на конец файла (команда Seek)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
begin
  assignfile(f,OpenDialog1.FileName);
  if FileExists(OpenDialog1.FileName) 
      then begin
            Reset(f)   // если файл есть, то открываем на чтение 
            Seek(f,FileSize(f)); // и ставим на конец файла
      end
      else Rewrite(f); //если файла нет - то создаём файл
 
  s.name:=Edit1.Text;
  s.price:=StrToFloat(Edit2.Text);
  s.lowage:=StrToInt(Edit3.Text);
  s.highage:=StrToInt(Edit4.Text);
 
  write(f,s);
 
  closefile(f);
end;
1
Заблокирован
04.12.2019, 10:37
mr-Crocodile,
Ну что я могу сказать.
Езди на запорожце.
0
0 / 0 / 0
Регистрация: 13.11.2019
Сообщений: 25
04.12.2019, 13:50  [ТС]
О, спасибо огромное, думал, что всё будет намного сложнее.
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
04.12.2019, 13:58
Цитата Сообщение от Veyzyy Посмотреть сообщение
О, спасибо огромное
Всегда пожалуйста.

Цитата Сообщение от Veyzyy Посмотреть сообщение
думал, что всё будет намного сложнее.
Типизированные файлы в Паскаль/Delphi - это очень просто.


Только ты не забудь где-то выполнить OpenDialog1.Execute - иначе в FileName ничего не будет.
я бы один раз запустил в начале диалог запроса имени файла и запомнил имя, чтобы каждый раз не спрашивать при каждом нажатии на кнопку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.12.2019, 13:58
Помогаю со студенческими работами здесь

Как можно добавить свое свойство (переменную) к стандартному объекту?
На форме есть несколько TMemo. На все эти текстовые объекты стоит один и тот-же обработчик OnChange. Обращение к объектам идет через...

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

нужно добавить новую кнопку в программу..
помогите!!!новую кнопку создать которой не было в программе unit RewAp_; interface uses Windows, Messages, SysUtils,...

ComboBox. Добавить новую строку по нажатию на кнопку.
Необходимо добавить новую строчку в список COMBOBOX при нажатии кнопки. Помогите плз Добавлено через 19 минут Строку добавил, но...

Добавить в код новую функциональность (OLE-контейнер)
Здраствуйте! помогите добавить в код новый функциональность(на Оле контейнер). Нужно создать 3 контейнер. На первом контейнере создать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru