Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.06.2022, 15:45
vodovoz vodovoz вне форума
Прохожий
 
Регистрация: 19.12.2017
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Как прочитать все данные с ini файла

Всем привет.
Вопрос такой, у меня сохраняются данные о температуре в ini файле. Сохраняются по дате и времени, причём с разным интервалом. Мне необходимо прочитать данные за прошедшие сутки и построить график.
Вопрос как это сделать? Я разобрался как прочитать одну запись, и то необходимо знать дату и точное время, до секунды, а как прочитать все данные за сутки? При чём в ini файле хранятся данные за несколько суток. Можно было бы прочитать и за все сутки, но тогда необходимо будет как то двигать график на экране, что бы найти нужный кусок графика.
Ответить с цитированием
  #2  
Старый 10.06.2022, 18:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,786
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Для полноценного ответа хотелось бы видеть пример содержимого ini-файла. В обзем виде - читать все, потом в памяти отфильтровать.

Если есть возможность переделать код сохранения, то можно сохранять данные по секциям. Т.е. каждая дата (именно дата) будет храниться в отдельной секции. Тогда можно будет просто читать секцию и уже дальше работать с этими данными. Пример организации ini-файла в таком варианте:
Код:
[data-2022-06-07]
10_01_01=5
10_01_08=7
10_05_10=8

[data-2022-06-08]
10_01_11=8
10_02_08=5
10_15_10=2
Т.е. дата у нас в названии секции, а в названии параметра можно указывать только время.
Ответить с цитированием
  #3  
Старый 14.06.2022, 08:42
vodovoz vodovoz вне форума
Прохожий
 
Регистрация: 19.12.2017
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

У меня вроде так и сохраняется, в таком виде.

[05.05.2022]
15:35:14=23
15:40:16=23
15:41:16=23
15:42:16=23
15:43:16=23
15:44:16=23
15:45:16=23
15:46:16=23
15:47:16=23
15:48:16=23
15:49:16=24
15:50:16=24
15:51:16=24
15:52:16=24
15:53:16=24


И как прочитать всю секцию?

Последний раз редактировалось vodovoz, 14.06.2022 в 10:22.
Ответить с цитированием
  #4  
Старый 14.06.2022, 21:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,786
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

У TIniFile есть метод - ReadSection - читает всю секцию в TStrings:
Код:
var
  sl : TStringList;
  ini : TIniFile;
  i : Integer;
begin
  ini := TIniFile.Create('...');
  sl := TStringList.Create;
  ini.ReadSection('05.05.2022',sl);
  For I := 0 To sl.Count-1 Do
  begin
    ...
  end;
  ini.free;
  sl.free;
end;
Ответить с цитированием
  #5  
Старый 15.06.2022, 09:01
vodovoz vodovoz вне форума
Прохожий
 
Регистрация: 19.12.2017
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Я смог, только прочитать количество записей, вывел в Label и время измерения температуры, вывел в ListBox. А как вывести данные о температуре, соответствующие этому времени, и присвоить их графику в Chart ?
Ответить с цитированием
  #6  
Старый 15.06.2022, 17:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,786
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

См тут: https://stackoverflow.com/questions/...-as-the-x-axis
Ответить с цитированием
  #7  
Старый 29.06.2022, 16:36
vodovoz vodovoz вне форума
Прохожий
 
Регистрация: 19.12.2017
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не могу понять, почему считывается только время записи, а как прочитать данные, которые относятся к этому времени?
Ответить с цитированием
  #8  
Старый 29.06.2022, 17:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,786
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ReadSection читает тебе именно имена ключей. Если хочешь сразу читать и имена и данные, то используй ReadSectionValues
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
vodovoz (30.06.2022)
  #9  
Старый 30.06.2022, 09:21
vodovoz vodovoz вне форума
Прохожий
 
Регистрация: 19.12.2017
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

lmikle, а при таком считывании, потом, возможно будет разделить дату и данные, что бы использовать при построении графика?
Ответить с цитированием
  #10  
Старый 01.07.2022, 18:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,786
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да, секция читается в формате Key=Value.
Т.е. надо обращаться к считанным данным через соотв. св-во TStringList.
Если правильно помню, то через sl.Values[KeyName]

Как то так:
Код:
var
  sl : TStringList;
  ini : TIniFile;
  i : Integer;
begin
  ini := TIniFile.Create('...');
  sl := TStringList.Create;
  ini.ReadSectionValues('05.05.2022',sl);
  For I := 0 To sl.Count-1 Do
  begin
    ShowMessage(Format('Имя ключа = %s, значение ключа  = %s',[sl.KeyNames[i],sl.Values[sl.KeyNames[i]]]));
  end;
  ini.free;
  sl.free;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Gareth (02.07.2022)
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:42.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram