Как сохранить программу записанную на pascal

Народ! Помогите, пожалуйста, исправить ошибку в программе. У меня не получается сохранить записи, программа работает, но когда сохраняешь и нажимаешь клавишу Exit, она выходит и когда заходишь она не открывает сохранённые записи. И в программе съехали столбцы, я пыталась их выровнить, в самой программе убирала пробелы, но она ничего она не меняет. Я никак не могу это исправить.

А завтра её нужно сдавать! Помогите пожалуйста.

Код к задаче: «Не получается сохранить записи»

Листинг программы

(str:’ Clean ‘; x:1; y:2; res:1), (str:’ Add ‘; x:9; y:2; res:2), (str:’ Del ‘; x:16; y:2; res:3), (str:’ Sort ‘; x:23; y:2; res:4), (str:’ View ‘; x:31; y:2; res:5), (str:’ Viev on query ‘; x:39; y:2; res:6), (str:’ Save ‘; x:56; y:2; res:7), (str:’ Load ‘; x:64; y:2; res:8), (str:’ Exit ‘; x:72; y:2; res:100), . case MenuVert(MainMenu) of 1:ClearArray; 2:InsertToArray; 3:DeleteFromArray; 4:SortArray; 5:ViewArray; 6:SaveArray; 7:LoadArray; 8:ViewPartArray; .

Источник: studassistent.ru

Работа с Файлами в Pascal

Ввод, сохранение в текстовый файл и визуализация данных в среде Lazarus (язык pascal)

В данной статье рассмотрим решение основных задач, встречаемых в практике при разработке прикладной программы.
Типовые задачи:
1. Ввести некие данные;
2. Посчитать период времени от начала измерений;
3. Визуализировать их в форме графика;
4. Сохранение в текстовый файл;
5. Загрузка созданного файла и использование этих данных.

Сделано в последней на данный момент версии Lazarus 2.0.8 (в других вервиях возможны незначительное изменения)

Задачей будет ввод одного числового параметра в форму, отображение его на графике в зависимости от текущего времени. Сохранение происходит при закрытии программы, а загрузка — при открытии.

Вначале необходимо создать пустой проект и настроить его в меню Проект -> Параметры проекта.
Сохранить проект в отдельной папке: Проект -> Сохранить проект как…
На форму поместить следующие элементы:
1. TLabeledEdit (из вкладки Additional)
2. TButton (из вкладки Standart)
3. TChаrt (из вкладки Chart)

Должно получиться так: (Специально не изменялись названия имен компонентов и текст внутри, хотя это рекомендуется в настоящем проекте)

Ввод, сохранение в текстовый файл и визуализация данных в среде Lazarus (язык pascal)

Далее нужно создать серию для визуализации: Правой кнопкой мыши по графику -> Редактор диаграммы -> Добавить -> График

Ввод, сохранение в текстовый файл и визуализация данных в среде Lazarus (язык pascal)

Теперь нужно создать обработку событий в исходном коде программы.

Создание файлов exe в среде Pascal ABC


Понадобятся три процедуры:
1. Инициализации procedure TForm1.FormShow(Sender: TObject);
В инспекторе объектов выбрать Form1 -> вкладка События -> OnShow (нажать …) Функция автоматически создается средой
2. Деинициализация procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
В инспекторе объектов выбрать Form1 -> вкладка События -> OnClose (нажать …) Функция автоматически создается средой
3. Обработка ввода (нажатия на кнопку) procedure TForm1.Button1Click(Sender: TObject);
На форме совершить двойное нажатие на кнопку Button1
Получаем следующий шаблон в разделе implementation

implementation < TForm1 >// Инициализация procedure TForm1.FormShow(Sender: TObject); begin end; // Деинициализация procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin end; // Обработка ввода procedure TForm1.Button1Click(Sender: TObject); begin end;

Задаем хранилище данных в объекте TStrings, для этого в разделе var дописываем объявление переменной Data:TStringList.

var Form1: TForm1; Data:TStringList; // Объект для хранения введенных данных в текстовом виде

Читайте также:
До какого года продлена программа ветхого жилья

Теперь необходимо принять протокол сохранения информации. Например, пусть в базе данных хранится дата и время ввода числа в текстовом виде, а через разделитель «;» — само число с плавающей точкой (но разделитель целой и дробной частей будет запятая).
Т.е. формат такой: ДД.ММ.ГГГГ ЧЧ.ММ.СС;ЧИСЛО

Программа будет преобразовывать дату и время в метку времени, затем в миллисекунды, а затем в минуты. Из каждого нового измерения будет вычитаться первое измерение. Таким образом, отсчет времени будет от нуля минут.

Задаем алгоритм инициализации:

// Инициализация procedure TForm1.FormShow(Sender: TObject); var i: integer; // Объявление локальной переменной целого типа x, y : Double; // Хранение текущих координат графика str, // Хранение текущей строки time, // Хранение текущего времени start: string; // Хранение начального времени begin Data := TStringList.Create; // Выделяется память под объект Data Chart1LineSeries1.Clear; // Очистка данных в графике (серии) if FileExists(‘data.csv’) then // Если файл data.csv с данными существует begin // . иначе фала data.csv нет (еще нет), а значит загружать ничего не надо Data.LoadFromFile(‘data.csv’); // Используем метод загрузки из файла объекта TStringList. Он заполнит объект строками из файла. // Отображение загруженных данных на графике for i:=0 to Data.Count-1 do // Проход в цикле по всем записям.

Свойство Data.Count показывает число строк в списке. Т.к. первый элемент 0, то надо вычесть 1. begin // извлечение (парсинг) полей времени и числа из строки str := Data.Strings[i]; // Извлекаем текущую (i-тую) строку time := copy(str, 1, pos(‘;’,str)-1); // Копирование символов от начала строки до знака «;» (т.е. вычитается 1) < Примечание: функция copy(str, start, col) — извлекает col символов из строки str, начиная с символа start функция pos(ch, str) — находит номер первого символа ch из строке str >delete(str,1,pos(‘;’,str)); // удаление извлеченных символов вместе с разделителем «;» из строки str < Примечание: функция delete(str, start, col) — удаляет col символов из строки str, начиная с символа start функция pos(ch, str) — находит номер первого символа ch из строке str >y := StrToFloatDef(str, -1); // Преобразование в число остатка строки str < Примечание: Так как в строке str осталось только одно число, то можно не использовать функцию copy. Если требуется передать еще несколько полей, то можно вставить такую же конструкцию, как: par := StrToFloatDef(copy(str, 1, pos(‘;’,str)-1), -1); delete(str,1,pos(‘;’,str)); >if i = 0 then start := time; // Если это первое измерение, то записать время в переменную start x:=TimeStampToMSecs(DateTimeToTimeStamp(StrToDateTime(time))) — TimeStampToMSecs(DateTimeToTimeStamp(StrToDateTime(start))); // Расчет разницы текущего времени и начального тек. = тек. — нач. < Примечание: функция StrToDateTime переводит строку со временем в тип дата/время функция DateTimeToTimeStamp переводит переменную типа дата/время в спец. тип метки времени функция TimeStampToMSecs переводит переменную типа метка времени в миллисекунды >x := x /(1000*60); // Перевод из мс в минуты Chart1LineSeries1.AddXY(x,y); // Добавить координаты x, y в серию и отобразить их на графике end; end; end;

Задаем алгоритм деинициализации:

// Деинициализация procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin Data.SaveToFile(‘data.csv’); // Сохранение данных в файл data.csv FreeAndNil(Data); // Уничтожение объекта Data из памяти end;

Задаем алгоритм обработки ввода:

// Обработка ввода procedure TForm1.Button1Click(Sender: TObject); var x, y: Double; // Хранение текущих координат графика time: TDateTime; // Хранение текущего времени str, // Хранение текущей строки start: string; // Хранение начального времени begin y := StrToFloatDef(LabeledEdit1.Text, -1); // Конвертирование текста в поле LabeledEdit1 в число, если там некорректное число, то выдаст -1 if y = -1 then exit; // «Защита от дурака» Если пользователь ввел не корректное число, то ничего не делать и выйти из функции // Расчет периода времени от предыдущего измерения в минутах time := Now; // Запись текущего времени из системной переменной Now в переменную time start := DateTimeToStr(time); // Присваивание переменной старт текущего времени в текстовом виде. Конвертация происходит функцией DateTimeToStr.

Читайте также:
Программа что не висли игры

Если это не первое измерение, то переменную позже переписать. if Data.Count > 0 then // Если были предыдущие измерения, то . begin // нужно рассчитать разницу по времени // извлечение (парсинг) полей времени и числа из строки str := Data.Strings[0]; // Извлекаем первую строку start := copy(str, 1, pos(‘;’,str)-1); // Копирование части строки со временем s start. Здесь происходит её изменение, в случае не первого измерения. < Примечание: функция copy(str, start, col) — извлекает col символов из строки st, начиная с символа start функция pos(ch, st) — находит номер первого символа ch из строке st >end; Data.Add( DateTimeToStr(time)+’;’+FloatToStr(y)); // Запись нового времени и введенного значения в виде строки с разделитетем «;» (согласно принятого протокола) x := TimeStampToMSecs(DateTimeToTimeStamp(time)) — TimeStampToMSecs(DateTimeToTimeStamp(StrToDateTime(start))); // Расчет разницы текущего времени и начального тек. = тек. — нач. < Примечание: функция DateTimeToTimeStamp переводит переменную типа дата/время в спец. тип метки времени функция TimeStampToMSecs переводит переменную типа метка времени в миллисекунды функция StrToDateTime переводит строку со временем в тип дата/время >x := x /(1000*60); // Перевод из мс в минуты Chart1LineSeries1.AddXY(x,y); // Добавление новых координат в серию и отображение графика end;

Ввод, сохранение в текстовый файл и визуализация данных в среде Lazarus (язык pascal)

После закрытия программы в папке появится файл data.csv, содержимое которого можно увидеть в Блокноте:

09.05.2020 12:12:54;1 09.05.2020 12:13:00;2 09.05.2020 12:13:03;3 09.05.2020 12:13:06;4 09.05.2020 12:13:08;5 09.05.2020 12:13:10;5 09.05.2020 12:13:12;1 09.05.2020 12:13:12;1 09.05.2020 12:13:16;1 09.05.2020 12:13:19;31 09.05.2020 12:13:21;3 09.05.2020 12:13:21;3 09.05.2020 12:13:26;2 09.05.2020 12:13:43;0,2

Здесь указывается дата, время с точностью до секунд и через разделитель ; введенное число. Обратите внимание, что целая и дробная часть числа разделяется запятой.
Его можно открыть в обычном текстовом редакторе (типа Блокнот) или в редакторе электронных таблиц (типа Excel).

При открытии программы, график должен опять появиться со введенными значениями!

В качестве дополнения:
Также может понадобиться удалять записи из базы (и графика).
Для этого можно добавить еще одну кнопку и поле ввода номера измерения , а также воспользоваться следующими функциями:
Data.Delete( i ); // удаляет строку с номером i (начиная от 0)
Chart1LineSeries1.Delete( i ); // удаляет i-тый элемент в серии на графике
StrToIntDef(Edit1.Text,-1); // Взять введенный текст из поля Edit1 и перевести его в целое число. Если это не число — возвратить -1 (для проверки ввода)
Для проверки выхода за диапазон, можно использовать:
Chart1LineSeries1.Count; // возвратит количество элементов в серии на графике.
Data.Count; // возвратит количество строк-записей
Можно удалять только последнюю запись и тогда поле для ввода не потребуется:
Data.Delete( Data.Count-1 );
Chart1LineSeries1.Delete( Chart1LineSeries1.Count-1 );

При возникновении вопросов, пишите в комментариях здесь или в сообществе ВК!

  • ← Как наше восприятие зависит от сердца
  • Генерация и воспроизведение звука в среде Lazarus (язык pascal) →

Источник: labdata.ru

Запись в файл и вывод из файла Паскаль

Запись в файл и вывод из файла Паскаль

Запись в файл и вывод из него какой либо информации в паскале — это тема , которая часто используется на олимпиадах , в решениях каких либо задач в интернете.

Читайте также:
Как сохранить программу powerpoint

Её суть заключается в том , чтобы компьютер , при проверке , брал значение переменных из входного файла input.txt ( обычно он называется именно так ). А результат работы программы выводился в выходной файл output.txt

Рассмотрим пример :

Нужно взять число из файла и записать квадрат этого числа в другой файл.

program mypascal;
var
a:integer;
t1,t2:text;
begin

reset(t1);
readln(t1,a);
close(t1);
rewrite(t2);
writeln(t2,sqr(a));
close(t2);

Объявляем три переменные . Переменную «a» для хранения числа из файла input.txt . Переменные «t1» и «t2» играют роль связки переменной с файлом , чтобы в последствии мы могли с ними работать . Тип переменных «t1» и «t2» записывается так — text.

Далее в программе мы связываем переменные «t1» и «t2» с файлами input.txt и output.txt.
Команда assign() отвечает за связку. Первый аргумент отвечает за имя переменной , а второй ( через запятую ) отвечает за имя файла.

Команды reset() и rewrite() отвечают за открытие файла для чтения и записи.

Reset()

открывает наш файл для чтения , чтобы мы могли взять из файла какое либо значение , например значение 4. Чтобы открыть именно тот файл , который нам нужен следует написать имя переменной , к которой он привязан в аргументе . ( reset(t1) ).
Далее записываем в переменную «a» число из файла. Для этого нам понадобится привычная команда readln() , однако теперь мы передаем ей два аргумента . Первый аргумент это имя переменной , к которой привязан файл . Второй аргумент это имя переменной , в которую будет произведена запись.

После того как мы занесли в переменную «а» число , которое было в файле , следует закрыть файл командой close(). Аргумент обозначает какой именно файл нужно закрыть. ( close(t1) ).

Rewrite()

открывает файл для записи в него какой либо информации , однако при этом стирает всю информацию , которая была записана в нем до этого. Для того , чтобы прошлая информация осталась целой , а новая записывалась в конце файла : вместо команды rewrite следует использовать команду append(). Чтобы открыть именно тот файл , который нам нужен , следует записать имя переменной , к которой привязан файл в аргументе . ( rewrite(t2) ).
Далее записываем информацию в output.txt привычной командой writeln() . Но теперь она в аналогии с readln(t1,a) имеет два аргумента . Первый аргумент отвечает за имя переменной , к которой привязан файл , а второй аргумент за информацию которую будут записывать в файл . В нашем случае это квадрат переменной «a». Функция sqr() отвечает за квадрат аргумента.

После следует закрыть второй файл close(t2).

На заметку :

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

  • eof(t1) — Возвращает истинное значение , когда достигнут конец файла. Хорошим примером работы такой функции служит запись всех чисел в файле. Это осуществляется с помощью цикла while ( not eof(t1) ) do — дословно пока не конец файла t1 делай .
  • eoln(t1) — Работает аналогично функции eof(t1) , за исключение того , что оно возвращает истину тогда , когда достигнут конец строки , а не всего файла.
  • erase(t1) — Уничтожает файл привязанный к переменной t1.
  • rename(t1) — Меняет имя файла , к которому привязана переменная t1 . Перед применением следует закрывать файл командой close().

Источник: mypascal.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru